(defn div? [n d]
(= 0 (rem n d)))
(defn smallest-prime-factor [number]
(loop [n number d 2]
(cond (> d (int (Math/sqrt number))) n
(= n d) n
(div? n d) dec
true (recur n (inc d)))))
(def primes (lazy-cat '(2 3)
(filter #(= %1 (smallest-prime-factor %1))
(take-nth 2 (iterate inc 5)))))
(defn prime?
" Tests for primailty "
[n]
(if (or (= n 2) (= n 3))
true
(if (or
(divisible? n 2)
(< n 2))
false
(loop [i 3]
(if (divisible? n i)
false
(if (> i (. Math (sqrt n)))
true
(recur (+ i 2))))))))
(defn eleven_primes_strat_with [n]
(take 11 (for [m primes :when (>= m n)] m)))
(def eleven_primes (map eleven_primes_strat_with primes))
(def eleven_primes_sums (map #(reduce + %) eleven_primes))
(def magic_primes (for [n eleven_primes_sums :when (prime? n)] n))
(take 20 magic_primes)
-> (233 271 311 353 443 491 631 677 883 1367 1423 1483 1543 1607 1787 1901 1951 2011 2141 2203)
(defn div? [n d]
(zero? (rem n d)))
(defn smallest-prime-factor [number]
(loop [n number d 2]
(cond (> d (int (Math/sqrt number))) n
(= n d) n
(div? n d) d
true (recur n (inc d)))))
(def primes (lazy-cat '(2 3)
(filter #(= % (smallest-prime-factor %))
(take-nth 2 (iterate inc 5)))))
(defn prime? [n]
(and (< 1 n)
(not-any? (partial div? n) (take-while #(<= (* % %) n) primes))))
(defn eleven_primes_strat_with [n]
(take 11 (for [m primes :when (>= m n)] m)))
(def eleven_primes (map eleven_primes_strat_with primes))
(def eleven_primes_sums (map #(reduce + %) eleven_primes))
(def magic_primes (for [n eleven_primes_sums :when (prime? n)] n))
-> (233 271 311 353 443 491 631 677 883 1367 1423 1483 1543 1607 1787 1901 1951 2011 2141 2203)
ruby-1.8.7-p302 > [1,2,3,-1].inject(0) {|x,y| x+y}
=> 5
其中 0 是可以省略的
ruby-1.8.7-p302 > [1,2,3,-1].inject {|x,y| x+y}
=> 5
2011/1/2 庄表伟 <zhuang...@gmail.com>:
> ruby的Array里没有sum这个方法,不过可以补一个。
> class Array
> def sum
> s=0
> self.each{|i| sum=sum+i}
> s
> end
> end
> ruby里也没有take,不过可以用array[0..10]来代替。
> 那天白宁讲的卷入,我觉得是很有道理的,通过不断的讨论,将相关的人都逐渐卷入进来,这个maillist就活了。
>
> 2011/1/2 Jeffrey Zhao <je...@live.com>
>>
>> 我倒觉得script与否只是看这个语言有没有提供一个shell,其实C#,F#,Scala等等都有Shell。例如刚才的代码如果在C#
>> Shell里写,什么static void Main之类的也都不需要了,怎么想就怎么写,就更像Ruby语言了......
>>
>> 还有如果你说"所想即所写"是指语言本身是否接近自然思维的话,其实就是看语法设计了。这方面Ruby的一些特性倒的确有所帮助。
>>
>> Jeffrey Zhao
>> Blog: http://blog.zhaojie.me/
>> Twitter: @jeffz_cn
>>
>> From: 庄表伟
>> Sent: Sunday, January 02, 2011 11:30 PM
>> To: is...@googlegroups.com
>> Subject: Re: 新年好:2011的祝福!
>>
>> 喜欢ruby,不是因为他的语言先进,而是因为他可以允许种种"script"。所想即所写,当然,我的很多语法都忘光了,所以写出的东西尤其难看。
>>
>> 另外:%的语法竟然忘记了。
>> 又及:经过反复的抛砖引玉,总算引出来第三个回这个帖的同学了。
>>
>> 2011/1/2 Jeffrey Zhao <je...@live.com>
>>>
>>> 而且事实上这段代码连Why Java
>>> Sucks都体现不出来,所以我本来准备的其他命令式的语言比如groovy,scala感觉都不会有太大差距了唉......
--
Best Regards
LI Daobing
(defn prime?? [n]
(div?? n d) dec
比如用 downcase 而不是 lowercase
用 start_with 而不是 starts_with
用 slice 而不是 sub
...
only joke
2011/1/3 Neo <neo...@gmail.com>:
for (int i =D 0; sum < maxPrime; i++)
2011/1/3 Jeffrey Zhao <je...@live.com>:
> 好的语言就该如此:基于一套核心的语法规则,可以使用类库的方式"补"出各种东西,俺不喜欢Java的一个原因之一就是想补都补不好......
>
> Jeffrey Zhao
> Blog: http://blog.zhaojie.me/
> Twitter: @jeffz_cn
>
> From: 庄表伟
> Sent: Sunday, January 02, 2011 11:52 PM
> To: is...@googlegroups.com
> Subject: Re: 新年好:2011的祝福!
>
> ruby的Array里没有sum这个方法,不过可以补一个。
> class Array
> def sum
> s=0
> self.each{|i| sum=sum+i}
> s
> end
> end
>
> ruby里也没有take,不过可以用array[0..10]来代替。
>
> 那天白宁讲的卷入,我觉得是很有道理的,通过不断的讨论,将相关的人都逐渐卷入进来,这个maillist就活了。
>
> 2011/1/2 Jeffrey Zhao <je...@live.com>
>>
>> 我倒觉得script与否只是看这个语言有没有提供一个shell,其实C#,F#,Scala等等都有Shell。例如刚才的代码如果在C#
>> Shell里写,什么static void Main之类的也都不需要了,怎么想就怎么写,就更像Ruby语言了......
>>
>> 还有如果你说"所想即所写"是指语言本身是否接近自然思维的话,其实就是看语法设计了。这方面Ruby的一些特性倒的确有所帮助。
>>
>> Jeffrey Zhao
>> Blog: http://blog.zhaojie.me/
>> Twitter: @jeffz_cn
>>
>> From: 庄表伟
>> Sent: Sunday, January 02, 2011 11:30 PM
>> To: is...@googlegroups.com
>> Subject: Re: 新年好:2011的祝福!
>>
>> 喜欢ruby,不是因为他的语言先进,而是因为他可以允许种种"script"。所想即所写,当然,我的很多语法都忘光了,所以写出的东西尤其难看。
>>
>> 另外:%的语法竟然忘记了。
>> 又及:经过反复的抛砖引玉,总算引出来第三个回这个帖的同学了。
>>
>> 2011/1/2 Jeffrey Zhao <je...@live.com>
>>>
>>> 而且事实上这段代码连Why Java
>>> Sucks都体现不出来,所以我本来准备的其他命令式的语言比如groovy,scala感觉都不会有太大差距了唉......
--
Best Regards
LI Daobing
let sum = numbers |> List.fold (+) 0
���ǣ�
let sum = numbers |> List.fold (fun x y -> x + y) 0
�����Currying��Partial Applictaion�Dz�����Ȼ����Ҫ����Ҳ�����ж�һ�������Ƿ��Ǻ���ʽ������Ե�����֮һ����Ȼ���ǹ��ϵģ�����������ΪF#�ǡ�ӵ��OO���Եĺ���ʽ������ԡ���C#��Scala��ӵ�к���ʽ������Ե�����ʽ���ԡ���
Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: @jeffz_cn
-----Original Message-----
From: LI Daobing
Sent: Sunday, January 02, 2011 11:59 PM
To: is...@googlegroups.com
Subject: Re: ����ã�2011��ף����
Array �� sum һ���� inject ��ʵ��, ����
ruby-1.8.7-p302 > [1,2,3,-1].inject(0) {|x,y| x+y}
=> 5
���� 0 �ǿ���ʡ�Ե�
ruby-1.8.7-p302 > [1,2,3,-1].inject {|x,y| x+y}
=> 5
2011/1/2 ׯ��ΰ <zhuang...@gmail.com>:
> ruby��Array��û��sum���������������Բ�һ����
> class Array
> def sum
> s=0
> self.each{|i| sum=sum+i}
> s
> end
> end
> ruby��Ҳû��take�����������array[0..10]�����档
> ����������ľ��룬�Ҿ����Ǻ��е���ģ�ͨ��ϵ����ۣ�����ص��˶�������������maillist�ͻ��ˡ�
>
> 2011/1/2 Jeffrey Zhao <je...@live.com>
>>
>> �ҵ�����script���ֻ�ǿ����������û���ṩһ��shell����ʵC#��F#��Scala�ȵȶ���Shell������ղŵĴ��������C#
>> Shell��д��ʲôstatic void Main֮���Ҳ������Ҫ�ˣ���ô�����ôд������Ruby������......
>>
>> ���������˵"���뼴��д"��ָ���Ա����Ƿ�ӽ���Ȼ˼ά�Ļ�����ʵ���ǿ�������ˡ��ⷽ��Ruby��һЩ���Ե���ȷ�������
>>
>> Jeffrey Zhao
>> Blog: http://blog.zhaojie.me/
>> Twitter: @jeffz_cn
>>
>> From: ׯ��ΰ
>> Sent: Sunday, January 02, 2011 11:30 PM
>> To: is...@googlegroups.com
>> Subject: Re: ����ã�2011��ף����
>>
>> ϲ��ruby��������Ϊ��������Ƚ������Ϊ�������������"script"�����뼴��д����Ȼ���ҵĺܶ���������ˣ�����д���Ķ��������ѿ���
>>
>> ���⣺%������Ȼ����ˡ�
>> �ּ����������ש��������������������������ͬѧ�ˡ�
>>
>> 2011/1/2 Jeffrey Zhao <je...@live.com>
>>>
>>> ������ʵ����δ�����Why Java
>>> Sucks�����ֲ������������ұ���������������ʽ�����Ա���groovy��scala�о���������̫�����˰�......
>>>
>>> public static void checkPrime(List<Integer> primes, int num) {
>>> for (int i : primes)
>>> if (num % i == 0)
>>> return;
>>>
>>> primes.add(num);
>>> }
>>>
>>> public static void main(String[] args) {
>>> List<Integer> primeList = new ArrayList<Integer>();
>>> for (int i = 2; i <= 3000; i++) checkPrime(primeList, i);
>>>
>>> int sum = 0;
>>> for (int i = 0; i < 11; i++) sum += primeList.get(i);
>>>
>>> int maxPrime = primeList.get(primeList.size() - 1);
>>> for (int i = 0; sum < maxPrime; i++)
>>> {
>>> if (primeList.contains(sum)) System.out.write(sum);
>>> sum += (primeList.get(i + 11) - primeList.get(i));
>>> }
>>> }
>>>
>>> Jeffrey Zhao
>>> Blog: http://blog.zhaojie.me/
>>> Twitter: @jeffz_cn
>>>
>>> From: Jeffrey Zhao
>>> Sent: Sunday, January 02, 2011 11:09 PM
>>> To: is...@googlegroups.com
>>> Subject: Re: ����ã�2011��ף����
>>>
>>> ��ʵ��δ����û������Ruby�����ƣ��Ұ����һ����ת��C#�ˡ�
>>>
>>> public static void CheckPrim(List<int> primes, int num)
>>> {
>>> foreach (var i in primes)
>>> if (num % i == 0)
>>> return;
>>>
>>> primes.Add(num);
>>> }
>>>
>>> public static void Main (string[] args)
>>> {
>>> var primeList = new List<int>();
>>> Enumerable.Range(2, 3000).ForEach(i => CheckPrim(primeList, i));
>>>
>>> var sum = 0;
>>> 11.Times(i => sum += primeList[i]);
>>>
>>> var maxPrime = primeList[primeList.Count - 1];
>>> for (var i = 0; sum < maxPrime; i++)
>>> {
>>> if (primeList.Contains(sum)) Console.WriteLine(sum);
>>> sum += (primeList[i + 11] - primeList[i]);
>>> }
>>> }
>>> Jeffrey Zhao
>>> Blog: http://blog.zhaojie.me/
>>> Twitter: @jeffz_cn
>>>
>>> From: ׯ��ΰ
>>> Sent: Sunday, January 02, 2011 11:12 AM
>>> To: is...@googlegroups.com
>>> Subject: Re: ����ã�2011��ף����
>>>
>>> ���˴��룬��ؽ�����һ��ģ�������ϴεĻ�����Щ�ˡ�������������ϲ��ruby����
>>>
>>> Prime_number_list=[2]
>>>
>>> def check_prime(num)
>>> Prime_number_list[0..Prime_number_list.length-1].each{|prime| return
>>> if
>>> num/prime*prime==num}
>>> Prime_number_list << num
>>> end
>>>
>>> 3.upto(3000){|i| check_prime(i)}
>>> max_prime=Prime_number_list[Prime_number_list.length-1]
>>> sum=0
>>> 11.times {|i| sum=sum+Prime_number_list[i]}
>>>
>>> i=0
>>> while(sum<max_prime) do
>>> puts sum if Prime_number_list.include?(sum)
>>> sum=sum-Prime_number_list[i]+Prime_number_list[i+11]
>>> i=i+1
>>> end
>>>
>>> 2011/1/2 ׯ��ΰ <zhuang...@gmail.com>
>>>>
>>>> ȷʵ���ˣ�������������ʦ������ԭ���ǣ�"�ղſ���Twitter��˼�Ƶ�ŮCTO
>>>> Padmasreeת����һ��Geekζ��ŨŨ������ף�ʣ�2011�ǵ�һ��11����������֮��(157+163+167+173+179+181+191+193+197+
>>>> 199 +211=2011) ף���������֣�"
>>>>
>>>> �Ҿ�û�п��ǵ�2011Ҳ������
>>>>
>>>> 2011/1/2 Neo <neo...@gmail.com>
>>>>>
>>>>> ����ׯץ��֮������֮ǰ��Ĵ���Ҳ�е����������������һ�㣬����汾�Ƚ������
>>>>> �������� Cisco ��Ů CTO��@Padmasree��ת�Ƶ�һ�����ݣ�˵ 2011
>>>>> �������Ǹ��������������11������ĺͣ�157+163+167+173+179+181+191+193+197+
>>>>> 199
>>>>> +211=2011������һ�� geeky ����ݰ�������
>>>>>
>>>>> ����˳��д��һ�� Clojure ���ҳ�������������� 2011 �ǵ�18��������������������һ���������������� 2141
>>>>> ���ˣ���ǰһ���� 1951 �꣬���Ǵ��ֻ������һ�� XD
>>>>> �ҵij�������Ȥ���������Լ���ϲ��������Ҳ��д���ɣ���Ϊ������������깧�ػҲ���?����
Python 的目标是 Simple, 正在逐步抛弃函数式编程, 鼓励大家使用 list comprehension, sum,
itertools, 而不是内置的 map/reduce, 正在逐步转变为一个动态语言版的 Java
Ruby 则热情拥抱了函数式编程, 所以会鼓励大家用 code block
2011/1/3 Neo <neo...@gmail.com>:
函数式则极力避免语句的副作用,导致编程人员需要递归思考, 语句间不停切换上下文环境,对编程人员要求太高。
关于这一点,大家可以看看手边的算法书,几乎都是用的命令式的写法。
另外的一点原因是, 业务逻辑通常是条款式的, 翻译成命令式语言也更直接。
2011/1/3 Jeffrey Zhao <je...@live.com>:
> 在我看来对于"真正"的函数式编程语言来说,最好应该是这样的,比如F#:
>
> let sum = numbers |> List.fold (+) 0
>
> 而不是:
>
> let sum = numbers |> List.fold (fun x y -> x + y) 0
>
> 这对于Currying和Partial
> Applictaion是不是自然很重要,这也是我判断一个语言是否是函数式编程语言的依据之一(虽然不是公认的)。所以我认为F#是"拥有OO特性的函数式编程语言"而C#和Scala是拥有函数式编程特性的命令式语言......
>
> Jeffrey Zhao
> Blog: http://blog.zhaojie.me/
> Twitter: @jeffz_cn
> -----Original Message----- From: LI Daobing
> Sent: Sunday, January 02, 2011 11:59 PM
> To: is...@googlegroups.com
> Subject: Re: 新年好:2011的祝福!
>
> Array 的 sum 一般用 inject 来实现, 比如
>
> ruby-1.8.7-p302 > [1,2,3,-1].inject(0) {|x,y| x+y}
> => 5
>
> 其中 0 是可以省略的
> ruby-1.8.7-p302 > [1,2,3,-1].inject {|x,y| x+y}
> => 5
>
>
> 2011/1/2 庄表伟 <zhuang...@gmail.com>:
>>
>> ruby的Array里没有sum这个方法,不过可以补一个。
>> class Array
>> def sum
>> s=0
>> self.each{|i| sum=sum+i}
>> s
>> end
>> end
>> ruby里也没有take,不过可以用array[0..10]来代替。
>> 那天白宁讲的卷入,我觉得是很有道理的,通过不断的讨论,将相关的人都逐渐卷入进来,这个maillist就活了。
>>
>> 2011/1/2 Jeffrey Zhao <je...@live.com>
>>>
>>> 我倒觉得script与否只是看这个语言有没有提供一个shell,其实C#,F#,Scala等等都有Shell。例如刚才的代码如果在C#
>>> Shell里写,什么static void Main之类的也都不需要了,怎么想就怎么写,就更像Ruby语言了......
>>>
>>> 还有如果你说"所想即所写"是指语言本身是否接近自然思维的话,其实就是看语法设计了。这方面Ruby的一些特性倒的确有所帮助。
>>>
>>> Jeffrey Zhao
>>> Blog: http://blog.zhaojie.me/
>>> Twitter: @jeffz_cn
>>>
>>> From: 庄表伟
>>> Sent: Sunday, January 02, 2011 11:30 PM
>>> To: is...@googlegroups.com
>>> Subject: Re: 新年好:2011的祝福!
>>>
>>> 喜欢ruby,不是因为他的语言先进,而是因为他可以允许种种"script"。所想即所写,当然,我的很多语法都忘光了,所以写出的东西尤其难看。
>>>
>>> 另外:%的语法竟然忘记了。
>>> 又及:经过反复的抛砖引玉,总算引出来第三个回这个帖的同学了。
>>>
>>> 2011/1/2 Jeffrey Zhao <je...@live.com>
>>>>
>>>> 而且事实上这段代码连Why Java
>>>> Sucks都体现不出来,所以我本来准备的其他命令式的语言比如groovy,scala感觉都不会有太大差距了唉......
>>>>
>>>> public static void checkPrime(List<Integer> primes, int num) {
>>>> for (int i : primes)
>>>> if (num % i == 0)
>>>> return;
>>>>
>>>> primes.add(num);
>>>> }
>>>>
>>>> public static void main(String[] args) {
>>>> List<Integer> primeList = new ArrayList<Integer>();
>>>> for (int i = 2; i <= 3000; i++) checkPrime(primeList, i);
>>>>
>>>> int sum = 0;
>>>> for (int i = 0; i < 11; i++) sum += primeList.get(i);
>>>>
>>>> int maxPrime = primeList.get(primeList.size() - 1);
>>>> for (int i = 0; sum < maxPrime; i++)
>>>> {
>>>> if (primeList.contains(sum)) System.out.write(sum);
>>>> sum += (primeList.get(i + 11) - primeList.get(i));
>>>> }
>>>> }
>>>>
>>>> Jeffrey Zhao
>>>> Blog: http://blog.zhaojie.me/
>>>> Twitter: @jeffz_cn
>>>>
>>>> From: Jeffrey Zhao
>>>> Sent: Sunday, January 02, 2011 11:09 PM
>>>> To: is...@googlegroups.com
>>>> Subject: Re: 新年好:2011的祝福!
>>>>
>>>> 其实这段代码基本没有体现Ruby的优势,我把它几乎一句句地转成C#了。
>>>>
>>>> public static void CheckPrim(List<int> primes, int num)
>>>> {
>>>> foreach (var i in primes)
>>>> if (num % i == 0)
>>>> return;
>>>>
>>>> primes.Add(num);
>>>> }
>>>>
>>>> public static void Main (string[] args)
>>>> {
>>>> var primeList = new List<int>();
>>>> Enumerable.Range(2, 3000).ForEach(i => CheckPrim(primeList, i));
>>>>
>>>> var sum = 0;
>>>> 11.Times(i => sum += primeList[i]);
>>>>
>>>> var maxPrime = primeList[primeList.Count - 1];
>>>> for (var i = 0; sum < maxPrime; i++)
>>>> {
>>>> if (primeList.Contains(sum)) Console.WriteLine(sum);
>>>> sum += (primeList[i + 11] - primeList[i]);
>>>> }
>>>> }
>>>> Jeffrey Zhao
>>>> Blog: http://blog.zhaojie.me/
>>>> Twitter: @jeffz_cn
>>>>
>>>> From: 庄表伟
>>>> Sent: Sunday, January 02, 2011 11:12 AM
>>>> To: is...@googlegroups.com
>>>> Subject: Re: 新年好:2011的祝福!
>>>>
>>>> 修改了代码,这回结果跟你一样的,代码比上次的还更少些了。哈哈,所以我喜欢ruby啊。
>>>>
>>>> Prime_number_list=[2]
>>>>
>>>> def check_prime(num)
>>>> Prime_number_list[0..Prime_number_list.length-1].each{|prime| return if
>>>> num/prime*prime==num}
>>>> Prime_number_list << num
>>>> end
>>>>
>>>> 3.upto(3000){|i| check_prime(i)}
>>>> max_prime=Prime_number_list[Prime_number_list.length-1]
>>>> sum=0
>>>> 11.times {|i| sum=sum+Prime_number_list[i]}
>>>>
>>>> i=0
>>>> while(sum<max_prime) do
>>>> puts sum if Prime_number_list.include?(sum)
>>>> sum=sum-Prime_number_list[i]+Prime_number_list[i+11]
>>>> i=i+1
>>>> end
>>>>
>>>> 2011/1/2 庄表伟 <zhuang...@gmail.com>
>>>>>
>>>>> 确实错了,我受了刘江老师的误导,他原推是:"刚才看到Twitter上思科的女CTO
>>>>>
>>>>> Padmasree转发了一条Geek味道浓浓的新年祝词:2011是第一个11个连续素数之和(157+163+167+173+179+181+191+193+197+
>>>>> 199 +211=2011) 祝大家新年快乐!"
>>>>>
>>>>> 我就没有考虑到2011也是素数。
>>>>>
>>>>> 2011/1/2 Neo <neo...@gmail.com>
>>>>>>
>>>>>> 给老庄抓虫之后发现我之前贴的代码也有点笔误,另外稍微精简了一点,这个版本比较舒服:
>>>>>>
>>>>>>
>>>>>> 早上起床看到 Cisco 的女 CTO(@Padmasree)转推的一条内容,说 2011
>>>>>> 这个年份是个质数,而且是连续11个质数的和(157+163+167+173+179+181+191+193+197+ 199
>>>>>> +211=2011),好一个 geeky 的年份啊。。。
>>>>>>
>>>>>> 于是顺手写了一个 Clojure 来找出所有这样的数,发现 2011 是第18个符合这个条件的质数,下一次碰到这样的年份是 2141
>>>>>> 年了,而前一个是 1951 年,我们大概只能碰到一次 XD
>>>>>> 我的程序附后,有兴趣的朋友用自己最喜爱的语言也来写个吧,作为本讨论组的新年恭贺活动也不错。。。
>>>>>>
���Բ����Ǹ�����õģ�������Բ��ѣ��ѵ����ƹ㣬Ҫ��������������ʵ���ѵá���˵��LISPţ�ɣ�������ţ�ĸ������������ߣ�����Ҳ�Ǹ�ţ�ˡ������������ܺã�����code as data���������ַ�ʽ�IJ����Ѻã�����
��ϲ��д����code/data���������������ǻ�˵LISP��ţ��������ֻ�м���������LISP�����code as data�Ƚϱ��˽��ܵĻ���boo��groovy��F#֮���������
������������һ�����ɣ�����û�˻�ֱ���á����?֤�������������á����?�ܽ�����֡����?�������ۡ����õġ�LISP�ġ�������û�гɹ��Ͳ�˵�ˣ����о���Monad��װ�������������У����˽��ܣ���monadic����������ֻ��bind��return���������㶨�ģ���������bind��return��ϳ�����Ļ������Ȼ��������Щ�������̣���������Ӿͱ���C#��LINQ��F#��Computation Expression��
������仰������������Բ��ѣ��ƹ���ѡ����˿��Խ���Ruby��Scala�ĸ��Ӷȣ�������C++Ԫ��̵��˾ͺ����ˡ��Ҿ���û��һ��ƽ��ĸ���֮ǰ��������ԣ�������Լ�����ġ���
Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: http://twitter.com/jeffz_cn
-----ԭʼ�ʼ�-----
From: LI Daobing
Sent: Monday, January 03, 2011 12:27 AM
To: is...@googlegroups.com
Subject: Re: ����ã�2011��ף����
Ҳ��ʧ�ܵİ���, ���� C++ ������Ԫ���, ������ C++ ��Ϊ��Ϊ��ҵ��Ӧ�����ԵĻ�ᡣ
�����96 ��� C++, �ټ���һ���������ʵ��, C++ Ҳ�?�л�ᡣ
2011/1/3 Jeffrey Zhao <je...@live.com>:
> �õ����Ծ���ˣ�����һ���ĵ���������ʹ�����ķ�ʽ"��"�����ֶ���������ϲ��Java��һ��ԭ��֮һ�����벹��������......
>
> Jeffrey Zhao
> Blog: http://blog.zhaojie.me/
> Twitter: @jeffz_cn
>
> From: ׯ��ΰ
> Sent: Sunday, January 02, 2011 11:52 PM
> To: is...@googlegroups.com
> Subject: Re: ����ã�2011��ף����
>
> ruby��Array��û��sum���������������Բ�һ����
> class Array
> def sum
> s=0
> self.each{|i| sum=sum+i}
> s
> end
> end
>
> ruby��Ҳû��take�����������array[0..10]�����档
>
> ����������ľ��룬�Ҿ����Ǻ��е���ģ�ͨ��ϵ����ۣ�����ص��˶�������������maillist�ͻ��ˡ�
>
> 2011/1/2 Jeffrey Zhao <je...@live.com>
>>
>> �ҵ�����script���ֻ�ǿ����������û���ṩһ��shell����ʵC#��F#��Scala�ȵȶ���Shell������ղŵĴ��������C#
>> Shell��д��ʲôstatic void Main֮���Ҳ������Ҫ�ˣ���ô�����ôд������Ruby������......
>>
>> ���������˵"���뼴��д"��ָ���Ա����Ƿ�ӽ���Ȼ˼ά�Ļ�����ʵ���ǿ�������ˡ��ⷽ��Ruby��һЩ���Ե���ȷ�������
>>
>> Jeffrey Zhao
>> Blog: http://blog.zhaojie.me/
>> Twitter: @jeffz_cn
>>
>> From: ׯ��ΰ
>> Sent: Sunday, January 02, 2011 11:30 PM
>> To: is...@googlegroups.com
>> Subject: Re: ����ã�2011��ף����
>>
>> ϲ��ruby��������Ϊ��������Ƚ������Ϊ�������������"script"�����뼴��д����Ȼ���ҵĺܶ���������ˣ�����д���Ķ��������ѿ���
>>
>> ���⣺%������Ȼ����ˡ�
>> �ּ����������ש��������������������������ͬѧ�ˡ�
>>
>> 2011/1/2 Jeffrey Zhao <je...@live.com>
>>>
>>> ������ʵ����δ�����Why Java
>>> Sucks�����ֲ������������ұ���������������ʽ�����Ա���groovy��scala�о���������̫�����˰�......
>>>
>>> public static void checkPrime(List<Integer> primes, int num) {
>>> for (int i : primes)
>>> if (num % i == 0)
>>> return;
>>>
>>> primes.add(num);
>>> }
>>>
>>> public static void main(String[] args) {
>>> List<Integer> primeList = new ArrayList<Integer>();
>>> for (int i = 2; i <= 3000; i++) checkPrime(primeList, i);
>>>
>>> int sum = 0;
>>> for (int i = 0; i < 11; i++) sum += primeList.get(i);
>>>
>>> int maxPrime = primeList.get(primeList.size() - 1);
>>> for (int i = 0; sum < maxPrime; i++)
>>> {
>>> if (primeList.contains(sum)) System.out.write(sum);
>>> sum += (primeList.get(i + 11) - primeList.get(i));
>>> }
>>> }
>>>
>>> Jeffrey Zhao
>>> Blog: http://blog.zhaojie.me/
>>> Twitter: @jeffz_cn
>>>
>>> From: Jeffrey Zhao
>>> Sent: Sunday, January 02, 2011 11:09 PM
>>> To: is...@googlegroups.com
>>> Subject: Re: ����ã�2011��ף����
>>>
>>> ��ʵ��δ����û������Ruby�����ƣ��Ұ����һ����ת��C#�ˡ�
>>>
>>> public static void CheckPrim(List<int> primes, int num)
>>> {
>>> foreach (var i in primes)
>>> if (num % i == 0)
>>> return;
>>>
>>> primes.Add(num);
>>> }
>>>
>>> public static void Main (string[] args)
>>> {
>>> var primeList = new List<int>();
>>> Enumerable.Range(2, 3000).ForEach(i => CheckPrim(primeList, i));
>>>
>>> var sum = 0;
>>> 11.Times(i => sum += primeList[i]);
>>>
>>> var maxPrime = primeList[primeList.Count - 1];
>>> for (var i = 0; sum < maxPrime; i++)
>>> {
>>> if (primeList.Contains(sum)) Console.WriteLine(sum);
>>> sum += (primeList[i + 11] - primeList[i]);
>>> }
>>> }
>>> Jeffrey Zhao
>>> Blog: http://blog.zhaojie.me/
>>> Twitter: @jeffz_cn
>>>
>>> From: ׯ��ΰ
>>> Sent: Sunday, January 02, 2011 11:12 AM
>>> To: is...@googlegroups.com
>>> Subject: Re: ����ã�2011��ף����
>>>
>>> ���˴��룬��ؽ�����һ��ģ�������ϴεĻ�����Щ�ˡ�������������ϲ��ruby����
>>>
>>> Prime_number_list=[2]
>>>
>>> def check_prime(num)
>>> Prime_number_list[0..Prime_number_list.length-1].each{|prime| return
>>> if
>>> num/prime*prime==num}
>>> Prime_number_list << num
>>> end
>>>
>>> 3.upto(3000){|i| check_prime(i)}
>>> max_prime=Prime_number_list[Prime_number_list.length-1]
>>> sum=0
>>> 11.times {|i| sum=sum+Prime_number_list[i]}
>>>
>>> i=0
>>> while(sum<max_prime) do
>>> puts sum if Prime_number_list.include?(sum)
>>> sum=sum-Prime_number_list[i]+Prime_number_list[i+11]
>>> i=i+1
>>> end
>>>
>>> 2011/1/2 ׯ��ΰ <zhuang...@gmail.com>
>>>>
>>>> ȷʵ���ˣ�������������ʦ������ԭ���ǣ�"�ղſ���Twitter��˼�Ƶ�ŮCTO
>>>> Padmasreeת����һ��Geekζ��ŨŨ������ף�ʣ�2011�ǵ�һ��11����������֮��(157+163+167+173+179+181+191+193+197+
>>>> 199 +211=2011) ף���������֣�"
>>>>
>>>> �Ҿ�û�п��ǵ�2011Ҳ������
>>>>
>>>> 2011/1/2 Neo <neo...@gmail.com>
>>>>>
>>>>> ����ׯץ��֮������֮ǰ��Ĵ���Ҳ�е����������������һ�㣬����汾�Ƚ������
>>>>>
>>>>>
>>>>> �������� Cisco ��Ů CTO��@Padmasree��ת�Ƶ�һ�����ݣ�˵ 2011
>>>>> �������Ǹ��������������11������ĺͣ�157+163+167+173+179+181+191+193+197+
>>>>> 199
>>>>> +211=2011������һ�� geeky ����ݰ�������
>>>>>
>>>>> ����˳��д��һ�� Clojure ���ҳ�������������� 2011 �ǵ�18��������������������һ���������������� 2141
>>>>> ���ˣ���ǰһ���� 1951 �꣬���Ǵ��ֻ������һ�� XD
>>>>> �ҵij�������Ȥ���������Լ���ϲ��������Ҳ��д���ɣ���Ϊ������������깧�ػҲ���?����
>>>>>
On Tuesday, January 4, 2011 at 10:41 AM, Jeffrey Zhao wrote:
?这问题不是出在“扩展能力”上,而是出在“元编程”上。不光是语言,很多技术都是这样子,看上去很强大,的确也很强大,但是普及不开,大部分还是对程序员不友好的关系。
语言不光是给高手用的,设计语言不难,难得是推广,要让天下人买账其实很难得。你说的LISP牛吧,觉得它牛的更多是语言设计者,至少也是个牛人。它提出的理念很好(比如code as data),但表现方式的并不友好(多少
人喜欢写这种code/data啊?),所以人们会说LISP好牛啊但还是只有极少数人用LISP。如今code as data比较被人接受的还是boo,groovy,F#之类的做法。
“单纯”并不一定讨巧,就像没人会直接用“公理”证明东西,都先用“公理”总结出各种“定理”、“推论”再用的。LISP的“单纯”没有成功就不说了,还有就是Monad,装逼利器,但流行(被人接受)的monadic的语法都不是只用bind和return两个操作就搞定的,都是先用bind和return组合出其他的基本操作,然后再用这些基本操作编程,这里的例子就比如C#的LINQ,F#的Computation Expression。
还是这句话,就是设计语言不难,推广很难。大部分人可以接受Ruby,Scala的复杂度,但接受C++元编程的人就很少了。我觉得没有一个平衡的概念之前就设计语言,基本就是自己玩玩的……
-----原始邮件-----
Subject: Re: 新年好:2011的祝福!
也有失败的案例, 比如 C++ 发现了元编程, 便葬送 C++ 作为作为企业级应用语言的机会。
如果是96 年的 C++, 再加上一个基础的容器实现, C++ 也许还有机会。
2011/1/3 Jeffrey Zhao <je...@live.com>:
好的语言就该如此:基于一套核心的语法规则,可以使用类库的方式"补"出各种东西,俺不喜欢Java的一个原因之一就是想补都补不好......
Subject: Re: 新年好:2011的祝福!
ruby的Array里没有sum这个方法,不过可以补一个。
class Array
def sum
s=0
self.each{|i| sum=sum+i}
s
end
end
ruby里也没有take,不过可以用array[0..10]来代替。
那天白宁讲的卷入,我觉得是很有道理的,通过不断的讨论,将相关的人都逐渐卷入进来,这个maillist就活了。
2011/1/2 Jeffrey Zhao <je...@live.com>
我倒觉得script与否只是看这个语言有没有提供一个shell,其实C#,F#,Scala等等都有Shell。例如刚才的代码如果在C#
Shell里写,什么static void Main之类的也都不需要了,怎么想就怎么写,就更像Ruby语言了......
还有如果你说"所想即所写"是指语言本身是否接近自然思维的话,其实就是看语法设计了。这方面Ruby的一些特性倒的确有所帮助。
Subject: Re: 新年好:2011的祝福!
喜欢ruby,不是因为他的语言先进,而是因为他可以允许种种"script"。所想即所写,当然,我的很多语法都忘光了,所以写出的东西尤其难看。
另外:%的语法竟然忘记了。
又及:经过反复的抛砖引玉,总算引出来第三个回这个帖的同学了。
2011/1/2 Jeffrey Zhao <je...@live.com>
而且事实上这段代码连Why Java
Sucks都体现不出来,所以我本来准备的其他命令式的语言比如groovy,scala感觉都不会有太大差距了唉......
public static void checkPrime(List<Integer> primes, int num) {
for (int i : primes)
if (num % i == 0)
return;
primes.add(num);
}
public static void main(String[] args) {
List<Integer> primeList = new ArrayList<Integer>();
for (int i = 2; i <= 3000; i++) checkPrime(primeList, i);
int sum = 0;
for (int i = 0; i < 11; i++) sum += primeList.get(i);
int maxPrime = primeList.get(primeList.size() - 1);
for (int i = 0; sum < maxPrime; i++)
{
if (primeList.contains(sum)) System.out.write(sum);
sum += (primeList.get(i + 11) - primeList.get(i));
}
}
Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: @jeffz_cn
From: Jeffrey Zhao
Sent: Sunday, January 02, 2011 11:09 PM
To: is...@googlegroups.com
Subject: Re: 新年好:2011的祝福!
其实这段代码基本没有体现Ruby的优势,我把它几乎一句句地转成C#了。
public static void CheckPrim(List<int> primes, int num)
{
foreach (var i in primes)
if (num % i == 0)
return;
primes.Add(num);
}
public static void Main (string[] args)
{
var primeList = new List<int>();
Enumerable.Range(2, 3000).ForEach(i => CheckPrim(primeList, i));
var sum = 0;
11.Times(i => sum += primeList[i]);
var maxPrime = primeList[primeList.Count - 1];
for (var i = 0; sum < maxPrime; i++)
{
if (primeList.Contains(sum)) Console.WriteLine(sum);
sum += (primeList[i + 11] - primeList[i]);
}
}
Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: @jeffz_cn
From: 庄表伟
Sent: Sunday, January 02, 2011 11:12 AM
To: is...@googlegroups.com
Subject: Re: 新年好:2011的祝福!
修改了代码,这回结果跟你一样的,代码比上次的还更少些了。哈哈,所以我喜欢ruby啊。
Prime_number_list=[2]
def check_prime(num)
Prime_number_list[0..Prime_number_list.length-1].each{|prime| return
if
num/prime*prime==num}
Prime_number_list << num
end
3.upto(3000){|i| check_prime(i)}
max_prime=Prime_number_list[Prime_number_list.length-1]
sum=0
11.times {|i| sum=sum+Prime_number_list[i]}
i=0
while(sum<max_prime) do
puts sum if Prime_number_list.include?(sum)
sum=sum-Prime_number_list[i]+Prime_number_list[i+11]
i=i+1
end
确实错了,我受了刘江老师的误导,他原推是:"刚才看到Twitter上思科的女CTO
Padmasree转发了一条Geek味道浓浓的新年祝词:2011是第一个11个连续素数之和(157+163+167+173+179+181+191+193+197+
199 +211=2011) 祝大家新年快乐!"
我就没有考虑到2011也是素数。
2011/1/2 Neo <neo...@gmail.com>
给老庄抓虫之后发现我之前贴的代码也有点笔误,另外稍微精简了一点,这个版本比较舒服:
(defn div? [n d]
(zero?? (rem n d)))
(defn smallest-prime-factor [number]
(loop [n number d 2]
(cond (> d (int (Math/sqrt number))) n
(= n d) n
(div? n d) d
true (recur n (inc d)))))
(def primes (lazy-cat '(2 3)
(filter #(= % (smallest-prime-factor %))
(take-nth 2 (iterate inc 5)))))
(defn prime? [n]
(and (< 1 n)
(not-any? (partial div? n) (take-while #(<= (* % %) n)
primes))))
(defn eleven_primes_strat_with [n]
(take 11 (for [m primes :when (>= m n)] m)))
(def eleven_primes (map eleven_primes_strat_with primes))
(def eleven_primes_sums (map #(reduce + %) eleven_primes))
(def magic_primes (for [n eleven_primes_sums :when (prime? n)] n))
-> (233 271 311 353 443 491 631 677 883 1367 1423 1483 1543 1607 1787
1901 1951 2011 2141 2203)
--
No, I will not fix your computer.
Neo Lee
On Saturday, January 1, 2011 at 4:25 PM, Neo wrote:
早上起床看到 Cisco 的女 CTO(@Padmasree)转推的一条内容,说 2011
这个年份是个质数,而且是连续11个质数的和(157+163+167+173+179+181+191+193+197+
199
+211=2011),好一个 geeky 的年份啊。。。
于是顺手写了一个 Clojure 来找出所有这样的数,发现 2011 是第18个符合这个条件的质数,下一次碰到这样的年份是 2141
年了,而前一个是 1951 年,我们大概只能碰到一次 XD
我的程序附后,有兴趣的朋友用自己最喜爱的语言也来写个吧,作为本讨论组的新年恭贺活动也不错。。。
(defn div? [n d]
(= 0 (rem n d)))
(defn smallest-prime-factor [number]
(loop [n number d 2]
(cond (> d (int (Math/sqrt number))) n
(= n d) n
(div? n d) dec
true (recur n (inc d)))))
(def primes (lazy-cat '(2 3)
(filter #(= %1 (smallest-prime-factor %1))
(take-nth 2 (iterate inc 5)))))
(defn prime??
if (num % i =D= 0)
return;
primes.add(num);
}
public static void main(String[] args) {
List<Integer> primeList = new ArrayList<Integer>();
for (int i = 2; i <= 3000; i++) checkPrime(primeList, i);
int sum =D 0;
for (int i = 0; i < 11; i++) sum += primeList.get(i);
int maxPrime = primeList.get(primeList.size() - 1);
for (int i = 0; sum < maxPrime; i++)
{
if (primeList.contains(sum)) System.out.write(sum);
sum +=D (primeList.get(i + 11) - primeList.get(i));
(=D n d) n
On Tuesday, January 4, 2011 at 1:28 PM, 钱宏武 wrote: