- 浏览: 144081 次
- 性别:
- 来自: 汉川
文章分类
最新评论
-
googya:
googya 写道axgle 写道define_method ...
令人迷惑的class_eval和instance_eval -
jinleileiking:
我绝不会这么写。呵呵
令我迷惑的c语言参数格式 -
googya:
jinleileiking 写道说的啥?那种写法是老C标准,现 ...
令我迷惑的c语言参数格式 -
jinleileiking:
说的啥?那种写法是老C标准,现在不这么搞了
令我迷惑的c语言参数格式 -
consy:
<p><span style="f ...
令人迷惑的class_eval和instance_eval
有道的工程师闲暇之余,将Base64编码改成了Base4编码,即把每个8Bit的字节转换成4个2Bit的字节,然后以4个字符来代替。编码和字符的对应方案如下:
00 ---- a
01 ---- o
10 ---- d
11 ---- 空格
这样,编码后的字符串就只会含有字符‘d','a','o'和空格。
例如字符y ,其ASCII码是121,对应的二进制串是01111001,这样分成 01 11 10 01四块后,用Base4编码后的字符串为"o do"。
有道的工程师很好奇,按照这种编码方式,编码后的字符串中含有多少个完整的dao呢?一个完整的dao由连续的‘d','a','o'三个字符组成。
输入
第一行有一个正整数n,代表接下来有n个待编码的原串。(1 <= n <= 10)
接下来有n行,每行有一个长度不超过106的原串,原串中的字符可能为ASCII码中除换行符以外的任意可见字符。
输出
共有n行,每行为一个整数k, 表示输入数据中对应的原串用Base4编码后含有多少个完整的dao。
样例输入
2
www.youdao.com
dict.youdao.com
样例输出
1
1
以上是“有道难题”
的一个题目,限定用Java或者C系列的语言写,那些东西我都差不多忘光了,实在写不出来。稍微熟悉一点的就是Ruby了,写了个大概的(不完整),希望大家多提意见,也把自己的代码拿出来亮亮。
s="www.youdao.com/youdao" t=s.unpack("B*") g=[] t=t.split(//) t.each_with_index do |x,i| if i%2!=0 g<<[t[i-1],x] end end g.map!{|x|x.to_s} p g g.map! do |x| case x when "00" "a" when "01" "o" when "10" "d" when "11" " " end end p g.to_s.scan(/dao/).size
评论
18 楼
googya
2010-06-07
jasongreen 写道
googya 写道
相比之下,googya的代码显得相当的笨拙!
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法
用自己的名字替换第一人称是相当伪娘的做法
你不说我还没什么感觉,现在越想越不对劲。
17 楼
Hooopo
2010-06-07
jasongreen 写道
googya 写道
相比之下,googya的代码显得相当的笨拙!
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法
用自己的名字替换第一人称是相当伪娘的做法
原来如此,怪不得看到别人这么称呼自己的时候觉得怪怪的呢....
16 楼
jasongreen
2010-06-07
googya 写道
相比之下,googya的代码显得相当的笨拙!
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法
用自己的名字替换第一人称是相当伪娘的做法
15 楼
googya
2010-06-03
savon_cn 写道
我觉得算法的题目,最好能讲一下思路,代码不好懂的
我的思路就是
1.先把字符串转成01。。。的串
2.查找100001的串,看它出现的位置,如果 pos%2=0,那么就算1个,这样累加
我的思路就是
1.先把字符串转成01。。。的串
2.查找100001的串,看它出现的位置,如果 pos%2=0,那么就算1个,这样累加
是的,我的也是这样的思路,很直观的一种想法。
14 楼
savon_cn
2010-06-03
我觉得算法的题目,最好能讲一下思路,代码不好懂的
我的思路就是
1.先把字符串转成01。。。的串
2.查找100001的串,看它出现的位置,如果 pos%2=0,那么就算1个,这样累加
我的思路就是
1.先把字符串转成01。。。的串
2.查找100001的串,看它出现的位置,如果 pos%2=0,那么就算1个,这样累加
13 楼
googya
2010-06-02
楼上的结果没问题!
性能上应该也没有什么问题。比Ruby写的方式要快。
性能上应该也没有什么问题。比Ruby写的方式要快。
12 楼
litianzzk
2010-06-02
试试C++的,n久不写了,没怎么测试过:
#include <iostream> using namespace std; const unsigned char daos_in_a_byte[2] = { 0x84, //10000100 0x21 //00100001 }; const unsigned char daos_in_a_byte_mask[2] = { 0xFC, //11111100 0x3F //00111111 }; const unsigned short daos_in_a_word[2] = { 0x4008, //00001000_01000000 0x1002 //00000010_00010000 }; const unsigned short daos_in_a_word_mask[2] = { 0xC00F, //00001111_11000000 0xF003 //00000011_11110000 }; int count_in_byte(const unsigned char byte) { return ((byte & daos_in_a_byte_mask[0]) == daos_in_a_byte[0]) || ((byte & daos_in_a_byte_mask[1]) == daos_in_a_byte[1]); } int count_in_word(const unsigned short word) { return ((word & daos_in_a_word_mask[0]) == daos_in_a_word[0]) || ((word & daos_in_a_word_mask[1]) == daos_in_a_word[1]); } int count_dao(const unsigned char* str) { int result = 0; for (int i = 0; *(str + i) != 0; ++i) { result += count_in_byte(*(str + i)); if (*(str + i + 1) != 0) { result += count_in_word(*(const unsigned short * )(str + i)); } } return result; } int main(int argc, char** argv) { char* str1 = "www.youdao.com"; char* str2 = "dict.youdao.com"; cout << count_dao((const unsigned char * )str1) << endl; cout << count_dao((const unsigned char * )str2) << endl; return 0; }
11 楼
eric_kong
2010-06-01
直接用KMP算法不就行了吗?
10 楼
shuiguozheng
2010-05-31
sevk 写道
为了不超时,只能分段统计.
每段的连接处也要考滤10 00 01 .
每段的连接处也要考滤10 00 01 .
你的图像太有诱惑力了
9 楼
huanyun007
2010-05-31
public static void main(String[] args) {
List<String> lines = new ArrayList<String>();
char[] codes = new char[] { 'a', 'o', 'd', ' ' };
lines.add("www.youdao.com");
lines.add("dict.youdao.com");
for (String line : lines) {
if (line.length() == 0) {
continue;
}
int size = 0;
char[] queue = new char[] { ' ', ' ', ' ' };
int index = 0;
char[] chars = line.toCharArray();
for (int i = 0; i < chars.length; i++) {
queue[index] = codes[(chars[i] >>> 6) & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;
queue[index] = codes[(chars[i] >>> 4) & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;
queue[index] = codes[(chars[i] >>> 2) & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;
queue[index] = codes[chars[i] & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;
}
System.out.println(size);
}
}
public static boolean check(char[] chars, int index) {
return chars[index] == 'd' && chars[(index + 1) % chars.length] == 'a'
&& chars[(index + 2) % chars.length] == 'o';
}
#写的有点复杂
按上面的思路不过还可以进行优化,比如可以按照KMP相关的思路减少check次数
List<String> lines = new ArrayList<String>();
char[] codes = new char[] { 'a', 'o', 'd', ' ' };
lines.add("www.youdao.com");
lines.add("dict.youdao.com");
for (String line : lines) {
if (line.length() == 0) {
continue;
}
int size = 0;
char[] queue = new char[] { ' ', ' ', ' ' };
int index = 0;
char[] chars = line.toCharArray();
for (int i = 0; i < chars.length; i++) {
queue[index] = codes[(chars[i] >>> 6) & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;
queue[index] = codes[(chars[i] >>> 4) & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;
queue[index] = codes[(chars[i] >>> 2) & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;
queue[index] = codes[chars[i] & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;
}
System.out.println(size);
}
}
public static boolean check(char[] chars, int index) {
return chars[index] == 'd' && chars[(index + 1) % chars.length] == 'a'
&& chars[(index + 2) % chars.length] == 'o';
}
#写的有点复杂
按上面的思路不过还可以进行优化,比如可以按照KMP相关的思路减少check次数
8 楼
sevk
2010-05-31
为了不超时,只能分段统计.
每段的连接处也要考滤10 00 01 .
每段的连接处也要考滤10 00 01 .
7 楼
googya
2010-05-31
beneo 写道
10 的 6 次方的字符串
凡是生成字符串,再去检查出dao字符串的,肯定都得超时
凡是生成字符串,再去检查出dao字符串的,肯定都得超时
确实,这个问题都还没有考虑!!!
6 楼
beneo
2010-05-31
10 的 6 次方的字符串
凡是生成字符串,再去检查出dao字符串的,肯定都得超时
凡是生成字符串,再去检查出dao字符串的,肯定都得超时
5 楼
googya
2010-05-31
googya 写道
相比之下,googya的代码显得相当的笨拙!
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法
我发现我完全的错了。位数搞错了。我的方法,每个字符产生的只有7位,而应当是8位。
4 楼
googya
2010-05-31
相比之下,googya的代码显得相当的笨拙!
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法
3 楼
Hooopo
2010-05-31
"youdao.com".unpack("B*").to_s.scan("dao".unpack("B*").to_s).size
PS:秦汉唐宋明的unpack("B*")很简洁。。
"youdao.com".unpack("C*").map{|x| "%08b" % x}.join也可以实现同样效果,不过罗嗦了点~
这里也有一个Base64编码相关的帖子:http://www.iteye.com/topic/286240
按照楼主的思路写了一个ruby版的实现:
def encode(str) keys = "abcdefghijklmnopqrstuvwxyz234567" str.unpack("C*").map{|b| "%08b" % b}.join.scan(/\d{1,5}/).map{|x| "0" * 3 + x.ljust(5,"0")}.map{|y| keys[y.to_i(2)].chr}.join end
2 楼
googya
2010-05-31
秦汉唐宋明 写道
table = {'00'=>'a','01'=>'o','10'=>'d','11'=>' '} "abcedefgh".unpack('B*')[0].gsub!(/../){|s| table[s]}.scan('dao').length
有1年没写ruby代码了,练习一下
very nice,very smart!
1 楼
秦汉唐宋明
2010-05-31
table = {'00'=>'a','01'=>'o','10'=>'d','11'=>' '} "abcedefgh".unpack('B*')[0].gsub!(/../){|s| table[s]}.scan('dao').length
有1年没写ruby代码了,练习一下
发表评论
-
ruby中数字与数字字符串相加的原理
2011-05-13 13:20 4300在ruby的世界中,很多东西不怕你做不到,就怕你想不到。正所谓 ... -
ruby删除文件注意事项
2011-05-05 18:45 1220用ruby删除文件的时候一定要注意,要将文件流关闭之后 ... -
VM的cloudfoundry试用
2011-04-26 17:18 1236今天收到了cloudfoundry的邮件通知,说我 ... -
用ruby调用外部命令移动文件,结果悲剧了
2010-12-12 12:45 1547今天要把storage上的文件移动一下,结果发现命令g ... -
寻找最长递增数字子串
2010-10-17 18:55 3027有一个字符串,其中包含了多个数字子串,要求求出最长的递 ... -
打印图形(很基础的)
2010-10-11 17:48 1225想不到有家公司的笔试题中居然有一道打印图形的题目,更让 ... -
用Rubinius来学习Ruby
2010-09-14 14:54 1206matz的ruby是基于c语言的,很多的核心的类都是 ... -
2个空瓶换一瓶汽水问题
2010-06-12 15:53 23691块钱可以买一瓶汽水,两个瓶可以换1瓶汽水,那 ... -
base64编码
2010-06-03 08:12 996受有道难题中许多答复者的启发,我决定对base ... -
令人迷惑的class_eval和instance_eval
2010-05-31 17:27 1757按照yugui 大姐的说法,class_eval和in ... -
Ruby入门读物
2010-05-23 12:39 1329经过一段时间的Ruby学习,感觉现在比刚开始时 ... -
计算相似程度、推荐
2010-05-05 10:07 1124在聚类分析中,尤其是文本聚类中通常要进行2对象 ... -
顶级上下文环境
2010-03-31 15:47 917到现在才明白,在IRB中写一个方法,就是给Object对象增加 ... -
jruby on rails
2010-03-19 16:15 1171今天终于在机器上把jruby on rails配置成功 ... -
java静态方法与jruby(ruby)类方法
2010-03-19 10:07 1354在学习ruby的时候,我感觉对于各种级别的方法有更清晰 ... -
ruby收取邮件
2010-01-28 16:12 1418这几天想复习一下ruby,很久没有用了,很多东西都忘记了!于是 ... -
格式化输出(字符串到数)
2009-12-31 11:05 1166很简单的一个练习,主要是将字符串转换为数组,然后添加一些其他的 ... -
ruby中的字符编码
2009-09-24 16:15 5870长期以来,都被Ruby中的字符乱码所困惑,但是一直高估 ... -
Java的内部类与Ruby的内部类的区别
2009-08-23 16:06 1450今天经过night-stalker的提醒,突然意识到Rub ... -
impl与内部类
2009-08-23 11:20 1195# To change this template, choo ...
相关推荐
标题 "2010年有道难题资格赛试题3套" 暗示了这是一个包含编程竞赛或逻辑思维挑战的资源包,特别是来自2010年网易有道的资格赛题目。有道是中国知名的在线学习平台,尤其以其编程挑战和逻辑测试闻名。这些试题可能...
标题中的“一日三省”指的是一个2012年参与网易创新大赛的Android应用程序,由Candy Group团队开发。这个应用可能是一个以自我反思或个人成长为主题的软件,因为“一日三省”通常意味着每日自我检查三次,以促进自我...
"有道"难题重复数另类解法。如22是重复数,122也是重复数等。。。
- 难题挑战:例如百度之星、有道难题等。 - 数学建模:有校内赛和全国比赛。 3. **参考书籍**: - 图书馆内有ACM相关的书籍资源。 - 在线资源:如OJOJ(Online Judge)提供了练习平台。 4. **实例解析**: - ...
在学术和荣誉方面,王汪表现出色,多次获得奖学金和奖项,包括国家励志奖学金、数学建模竞赛全国三等奖、嵌入式系统专题邀请赛全国二等奖、国家奖学金、科研优秀奖,以及有道难题-网易创新大赛全国三等奖和武汉大学...
### 基于给定的信息理解Base64编码 #### Base64编码概念与原理 Base64是一种常见的用于在网络上传输8位字节数据的编码方式。它主要用于确保二进制数据能够通过只能安全传输文本数据的系统进行传输。...
综上所述,本文通过具体的实例,深入浅出地介绍了破解有道翻译反爬虫机制的整个过程,包括抓包分析、破解加密难题、模拟请求头、构造请求、签名生成以及响应处理等关键步骤,展示了Python3和urllib库在解决这一问题...
中国普及教育的道路上面临着多道难关,这些难题主要源自社会经济、文化观念以及教育资源的不均衡分配。陶行知先生深入分析了这些问题,并提出了相应的解决方案。 首先,女性教育是普及教育的一大难题。在旧中国,...
7. 感恩的心态:无论面临何种困难,如编程难题或项目困境,感恩之心能帮助我们看到问题的积极面,找到解决方案。 8. 友谊与健康:良好的同事关系和社交网络对于减轻工作压力、保持心理健康在IT工作中同样重要。 9....
7. **积极心态**:无论面对技术难题还是项目挫折,保持感恩和积极的心态,能帮助我们找到解决问题的新角度。 8. **友谊与健康**:良好的人际关系对IT从业者尤其重要,能缓解工作压力,提高工作效率和幸福感。 9. *...
首先,红途GOPR平台所推崇的“格物致知・数安有道”理念,是在深入分析当前网络安全和数据安全面临的挑战后提出的。随着数字经济的不断发展,数据安全已成为国家安全战略的重要组成部分。国家相关法律法规的密集出台...
"车路协同自动驾驶系统发展漫谈" 车路协同自动驾驶系统是指通过车辆和道路基础设施之间的信息交换和协作...车路协同自动驾驶系统是智能交通管理和自动驾驶的重要技术,具有广泛的应用前景,但仍然面临一些挑战和难题。
**Idea Translation插件详解** Idea Translation插件是一款针对IntelliJ IDEA集成开发环境的扩展工具,专门设计用于帮助开发者在编写代码时进行多语言翻译。...合理利用,可以有效解决跨语言开发中的难题。
然而,对于外语不太精通的人来说,语言沟通无疑是一大难题。这时,翻译APP就成为了出行必备的工具。随着技术的发展,翻译APP的功能日益增强,不仅包括传统的文本翻译,还增加了语音识别、拍照翻译、面对面翻译等功能...
总的来说,随着技术的发展,跨越语言障碍已经不再是一项难题。无论是通过2345王牌浏览器的翻译功能,还是使用其他工具,都能够帮助用户更便捷地访问和理解英文网站,从而拓宽知识视野,提升信息获取效率。
总结来说,OCR图片识别翻译软件是一款集成了OCR技术和多种在线翻译引擎的实用工具,它解决了扫描文档的文字提取和翻译难题,为用户提供了一站式的解决方案。无论是学术研究、商务沟通还是日常生活,都能大大提高我们...
无论是在学术研究、工作交流还是日常生活中的语言难题,QTranslate都能成为用户得力的语言助手,帮助我们跨越语言障碍,拓宽沟通的边界。在信息化时代,拥有一款如此高效、全面的翻译软件,无疑将提升我们的工作效率...
在当今全球化的时代,语言的交流障碍成为了信息传递的一大难题。随着科技的发展,翻译工具应运而生,为不同语言背景的人们提供了便利。市场上涌现出了众多在线翻译平台,如谷歌翻译、有道翻译、百度翻译等,它们以...