新年好:2011的祝福!

20 views
Skip to first unread message

Neo

unread,
Jan 1, 2011, 3:25:47 AM1/1/11
to is...@googlegroups.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

我的程序附后,有兴趣的朋友用自己最喜爱的语言也来写个吧,作为本讨论组的新年恭贺活动也不错。。。

(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)




-- 
No, I will not fix your computer.

Neo Lee

庄表伟

unread,
Jan 1, 2011, 4:52:04 AM1/1/11
to is...@googlegroups.com
通过刘江的微博,已经看到这条推了,很有意思。

祝各位新年快乐。并期待着neo的Clojure分享。

2011/1/1 Neo <neo...@gmail.com>

庄表伟

unread,
Jan 1, 2011, 9:56:49 AM1/1/11
to is...@googlegroups.com
这个,我用ruby也写了程序跑了一下,跟neo的结果有所不同。呵呵。。。

Prime_number_list=[2]

def check_prime(num)
  Prime_number_list[1..Prime_number_list.length-1].each{|prime| return false if num/prime*prime==num}
  Prime_number_list << num
  return true
end

def show_year
  length=Prime_number_list.length
  sum=0
  (length-11).upto(length-2) do |i|
    sum=sum+Prime_number_list[i]
    print "#{Prime_number_list[i]}+"
  end
  sum=sum+Prime_number_list[length-1]
  puts "#{Prime_number_list[length-1]}=#{sum}"
end

3.upto(300) do |i|
  if check_prime(i)
    if Prime_number_list.length>=11
      show_year
    end
  end
end


2+3+4+5+7+11+13+17+19+23+29=133
3+4+5+7+11+13+17+19+23+29+31=162
4+5+7+11+13+17+19+23+29+31+37=196
5+7+11+13+17+19+23+29+31+37+41=233
7+11+13+17+19+23+29+31+37+41+43=271
11+13+17+19+23+29+31+37+41+43+47=311
13+17+19+23+29+31+37+41+43+47+53=353
17+19+23+29+31+37+41+43+47+53+59=399
19+23+29+31+37+41+43+47+53+59+61=443
23+29+31+37+41+43+47+53+59+61+67=491
29+31+37+41+43+47+53+59+61+67+71=539
31+37+41+43+47+53+59+61+67+71+73=583
37+41+43+47+53+59+61+67+71+73+79=631
41+43+47+53+59+61+67+71+73+79+83=677
43+47+53+59+61+67+71+73+79+83+89=725
47+53+59+61+67+71+73+79+83+89+97=779
53+59+61+67+71+73+79+83+89+97+101=833
59+61+67+71+73+79+83+89+97+101+103=883
61+67+71+73+79+83+89+97+101+103+107=931
67+71+73+79+83+89+97+101+103+107+109=979
71+73+79+83+89+97+101+103+107+109+113=1025
73+79+83+89+97+101+103+107+109+113+127=1081
79+83+89+97+101+103+107+109+113+127+131=1139
83+89+97+101+103+107+109+113+127+131+137=1197
89+97+101+103+107+109+113+127+131+137+139=1253
97+101+103+107+109+113+127+131+137+139+149=1313
101+103+107+109+113+127+131+137+139+149+151=1367
103+107+109+113+127+131+137+139+149+151+157=1423
107+109+113+127+131+137+139+149+151+157+163=1483
109+113+127+131+137+139+149+151+157+163+167=1543
113+127+131+137+139+149+151+157+163+167+173=1607
127+131+137+139+149+151+157+163+167+173+179=1673
131+137+139+149+151+157+163+167+173+179+181=1727
137+139+149+151+157+163+167+173+179+181+191=1787
139+149+151+157+163+167+173+179+181+191+193=1843
149+151+157+163+167+173+179+181+191+193+197=1901
151+157+163+167+173+179+181+191+193+197+199=1951
157+163+167+173+179+181+191+193+197+199+211=2011
163+167+173+179+181+191+193+197+199+211+223=2077
167+173+179+181+191+193+197+199+211+223+227=2141
173+179+181+191+193+197+199+211+223+227+229=2203
179+181+191+193+197+199+211+223+227+229+233=2263
181+191+193+197+199+211+223+227+229+233+239=2323
191+193+197+199+211+223+227+229+233+239+241=2383
193+197+199+211+223+227+229+233+239+241+251=2443
197+199+211+223+227+229+233+239+241+251+257=2507
199+211+223+227+229+233+239+241+251+257+263=2573
211+223+227+229+233+239+241+251+257+263+269=2643
223+227+229+233+239+241+251+257+263+269+271=2703
227+229+233+239+241+251+257+263+269+271+277=2757
229+233+239+241+251+257+263+269+271+277+281=2811
233+239+241+251+257+263+269+271+277+281+283=2865
239+241+251+257+263+269+271+277+281+283+293=2925


2011/1/1 庄表伟 <zhuang...@gmail.com>

Neo

unread,
Jan 1, 2011, 11:51:33 AM1/1/11
to is...@googlegroups.com
显然错了,比如 2077 = 31*67,不是质数。。。

-- 
No, I will not fix your computer.

Neo Lee

Neo

unread,
Jan 1, 2011, 11:55:14 AM1/1/11
to is...@googlegroups.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

庄表伟

unread,
Jan 1, 2011, 9:59:33 PM1/1/11
to is...@googlegroups.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>

庄表伟

unread,
Jan 1, 2011, 10:12:19 PM1/1/11
to is...@googlegroups.com
修改了代码,这回结果跟你一样的,代码比上次的还更少些了。哈哈,所以我喜欢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>

Neo

unread,
Jan 1, 2011, 10:13:40 PM1/1/11
to is...@googlegroups.com
另外看你前几个结果,怎么4也当作质数了。。。没仔细看代码,不知道哪里有点小问题。。。

刘江同志那个推有两个错:2011并不是第一个,并且要强调2011本身也是质数。

庄表伟

unread,
Jan 1, 2011, 10:17:55 PM1/1/11
to is...@googlegroups.com
都已经改掉了,嘿嘿,现在的代码应该是对的了。

2011/1/2 Neo <neo...@gmail.com>

Jeffrey Zhao

unread,
Jan 2, 2011, 10:09:48 AM1/2/11
to is...@googlegroups.com
其实这段代码基本没有体现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

Jeffrey Zhao

unread,
Jan 2, 2011, 10:24:49 AM1/2/11
to is...@googlegroups.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

庄表伟

unread,
Jan 2, 2011, 10:30:17 AM1/2/11
to is...@googlegroups.com
喜欢ruby,不是因为他的语言先进,而是因为他可以允许种种“script”。所想即所写,当然,我的很多语法都忘光了,所以写出的东西尤其难看。

另外:%的语法竟然忘记了。
又及:经过反复的抛砖引玉,总算引出来第三个回这个帖的同学了。

2011/1/2 Jeffrey Zhao <je...@live.com>

Jeffrey Zhao

unread,
Jan 2, 2011, 10:32:56 AM1/2/11
to is...@googlegroups.com
这段C#代码里其实有句话写不是很C#……
 
var sum = 0;
11.Times(i => sum += primeList[i]);
 
一般都是这么写的:
 
var sum = primeList.Take(11).Sum();
 
所以还是很好看的。

Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: @jeffz_cn

Jeffrey Zhao

unread,
Jan 2, 2011, 10:39:53 AM1/2/11
to is...@googlegroups.com
我倒觉得script与否只是看这个语言有没有提供一个shell,其实C#,F#,Scala等等都有Shell。例如刚才的代码如果在C# Shell里写,什么static void Main之类的也都不需要了,怎么想就怎么写,就更像Ruby语言了……
 
还有如果你说“所想即所写”是指语言本身是否接近自然思维的话,其实就是看语法设计了。这方面Ruby的一些特性倒的确有所帮助。

庄表伟

unread,
Jan 2, 2011, 10:52:49 AM1/2/11
to is...@googlegroups.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>

LI Daobing

unread,
Jan 2, 2011, 10:59:19 AM1/2/11
to is...@googlegroups.com
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感觉都不会有太大差距了唉......

--
Best Regards
LI Daobing

庄表伟

unread,
Jan 2, 2011, 11:01:15 AM1/2/11
to is...@googlegroups.com
呵呵,这个我以前还真不知道,谢了。

2011/1/2 LI Daobing <lida...@gmail.com>

Neo

unread,
Jan 2, 2011, 11:10:52 AM1/2/11
to is...@googlegroups.com
补充一句,Ruby 里的 inject 其实就是函数式编程里常见的 reduce,而经常并提的 map 是 Ruby 有的(话说为啥把 reduce 改叫 inject 我也不知道。。。)

-- 
No, I will not fix your computer.

Neo Lee

(defn prime?? [n]
(div?? n d) dec

Jeffrey Zhao

unread,
Jan 2, 2011, 11:11:59 AM1/2/11
to is...@googlegroups.com
好的语言就该如此:基于一套核心的语法规则,可以使用类库的方式“补”出各种东西,俺不喜欢Java的一个原因之一就是想补都补不好……

LI Daobing

unread,
Jan 2, 2011, 11:14:13 AM1/2/11
to is...@googlegroups.com
主要是 ruby 创始人的英语没学好

比如用 downcase 而不是 lowercase
用 start_with 而不是 starts_with
用 slice 而不是 sub
...

only joke

2011/1/3 Neo <neo...@gmail.com>:

Jeffrey Zhao

unread,
Jan 2, 2011, 11:23:02 AM1/2/11
to is...@googlegroups.com
reduce也有叫fold的,例如haskell和Erlang(还分foldl和foldr)和F#(叫做fold和foldBack),在C#也叫Aggregate,Groovy和Ruby等叫做inject……还有更多详见:http://en.wikipedia.org/wiki/Fold_(higher-order_function)
 

Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: @jeffz_cn
 
From: Neo
Sent: Monday, January 03, 2011 12:10 AM
Subject: Re: 新年好:2011的祝福!
 
for (int i =D 0; sum < maxPrime; i++)

LI Daobing

unread,
Jan 2, 2011, 11:27:28 AM1/2/11
to is...@googlegroups.com
也有失败的案例, 比如 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感觉都不会有太大差距了唉......

--
Best Regards
LI Daobing

Jeffrey Zhao

unread,
Jan 2, 2011, 11:33:07 AM1/2/11
to is...@googlegroups.com
���ҿ������ڡ�����ĺ���ʽ���������˵�����Ӧ��������ģ�����F#��

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��򸽺�����Ȥ���������Լ���ϲ��������Ҳ��д���ɣ���Ϊ������������깧�ػҲ���?����

LI Daobing

unread,
Jan 2, 2011, 11:34:01 AM1/2/11
to is...@googlegroups.com
说到这里我倒想起来 Python 和 Ruby 的最大分野其实是在对函数式编程的态度上,

Python 的目标是 Simple, 正在逐步抛弃函数式编程, 鼓励大家使用 list comprehension, sum,
itertools, 而不是内置的 map/reduce, 正在逐步转变为一个动态语言版的 Java

Ruby 则热情拥抱了函数式编程, 所以会鼓励大家用 code block

2011/1/3 Neo <neo...@gmail.com>:

LI Daobing

unread,
Jan 2, 2011, 11:41:42 AM1/2/11
to is...@googlegroups.com
个人仍然认为命令式语言对于工程来讲是最优的, 因为命令式语言的思考方式最简单, 每条语句只是通过副作用(side
effect)来影响上下文(context)而已, 前后语句间无须切换上下文.

函数式则极力避免语句的副作用,导致编程人员需要递归思考, 语句间不停切换上下文环境,对编程人员要求太高。

关于这一点,大家可以看看手边的算法书,几乎都是用的命令式的写法。

另外的一点原因是, 业务逻辑通常是条款式的, 翻译成命令式语言也更直接。


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
>>>>>> 我的程序附后,有兴趣的朋友用自己最喜爱的语言也来写个吧,作为本讨论组的新年恭贺活动也不错。。。
>>>>>>

Neo

unread,
Jan 2, 2011, 11:49:01 AM1/2/11
to is...@googlegroups.com
John Hughes 在那篇著名的「Why Functional Programming Matters」里提出,函数式编程提供了优异的对复杂问题进行分解和粘合的工具,尤其是高阶函数(first-class functions)和惰性计算特性(lazy computing),所以能够提供更优良的模块化能力,有助于写出低错的程序。虽然已经是近30年前的论文,但我觉得其洞察力还是非常有教益的,能让我们更好的理解函数式编程的核心价值,而不至于迷失在各式各样的语言特性中。

-- 
No, I will not fix your computer.

Neo Lee

Jeffrey Zhao

unread,
Jan 2, 2011, 12:01:34 PM1/2/11
to is...@googlegroups.com
first-class functions基本没什么可说的,不过对于lazy还是strict倒还是有诸多争论,lazy也不是函数式编程语言的标配。
 
有人认为,把strict的程序变的lazy,要比把lazy的程序变得完全strict要简单许多,而且要在脑子里理解一个稍微复杂些lazy的程序会让人感到吃不消。lazy的语言强迫人们杜绝side effect,因为lazy加上side effect会让问题变得无比复杂。还有就是空间占用。对于一个lazy的语言写出的程序,很难一次达到空间的最优,换个说法就是“空间基本是需要优化”的,还好现在的探测工具对于探测空间占用是什么造成的。空间问题也会有不少有趣的陷阱,比如两段看上去是效果一样代码,一个是常数空间,一个是线性空间。
 
还有就是我认为,对于程序员来说,strict是自然的,而lazy是需要学习的……

Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: @jeffz_cn

Jeffrey Zhao

unread,
Jan 3, 2011, 9:41:19 PM1/3/11
to is...@googlegroups.com
?�����ⲻ�dz��ڡ���չ�������ϣ����dz��ڡ�Ԫ��̡��ϡ����������ԣ��ܶ༼�����������ӣ�����ȥ��ǿ�󣬵�ȷҲ��ǿ�󣬵����ռ��������󲿷ֻ��ǶԳ���Ա���ѺõĹ�ϵ��

���Բ����Ǹ�����õģ�������Բ��ѣ��ѵ����ƹ㣬Ҫ��������������ʵ���ѵá���˵��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��򸽺�����Ȥ���������Լ���ϲ��������Ҳ��д���ɣ���Ϊ������������깧�ػҲ���?����
>>>>>

Neo

unread,
Jan 3, 2011, 10:07:07 PM1/3/11
to is...@googlegroups.com
请期待 Clojure 的分享。。。我看好它不是没理由的 :D

-- 
No, I will not fix your computer.

Neo Lee

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++元编程的人就很少了。我觉得没有一个平衡的概念之前就设计语言,基本就是自己玩玩的……
-----原始邮件-----
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>

给老庄抓虫之后发现我之前贴的代码也有点笔误,另外稍微精简了一点,这个版本比较舒服:


(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??

Jeffrey Zhao

unread,
Jan 3, 2011, 10:21:06 PM1/3/11
to is...@googlegroups.com
支持,其实我也喜欢玩这些,只是我见过太多死守Java的程序员,它们连XX,YY和ZZ都不愿意接受,就不期待他们接受别的东西了。
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

huo ju

unread,
Jan 3, 2011, 11:37:00 PM1/3/11
to is...@googlegroups.com
死守也没啥啊,还有死守C的钱老师嘛。

2011/1/4 Jeffrey Zhao <je...@live.com>:

--
Regards,
huoju

钱宏武

unread,
Jan 3, 2011, 11:49:04 PM1/3/11
to is...@googlegroups.com
我没有死守C,只是说,相对其他语言,我C用的较多

huo ju

unread,
Jan 3, 2011, 11:54:11 PM1/3/11
to is...@googlegroups.com
我又不是贬义…那么改成,还有死守C的阙宏宇总可以了吧。

2011/1/4 钱宏武 <qhw...@gmail.com>:

--
Regards,
huoju

Tinyfool

unread,
Jan 3, 2011, 11:56:39 PM1/3/11
to is...@googlegroups.com
还有死守C语言的Linus呢,落后的人还是蛮多的,233

2011/1/4 钱宏武 <qhw...@gmail.com>



--
Tinyfool的Blog http://tiny4.org/blog/

钱宏武

unread,
Jan 4, 2011, 12:28:59 AM1/4/11
to is...@googlegroups.com
我知道火炬不是贬义,我的意思是,我是有点死守C, 但我也写其他的语言,只是不多,别给人一种映像,我只会C

钱宏武

Neo

unread,
Jan 4, 2011, 12:59:24 AM1/4/11
to is...@googlegroups.com
Alan J. Perlis(ACM首任主席,图灵奖得主)说:A language that doesn't affect the way you think about programming, is not worth knowing.(如果一门编程语言不能影响你对思考编程的方式,那么它不值得去学。)[1],Google 研究院的老大 Peter Norvig 则建议从这个角度出发,学习半打以上的编程语言来开发思维[2]:

Learn at least a half dozen programming languages. Include one language that supports class abstractions (like Java or C++), one that supports functional abstraction (like Lisp or ML), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), one that supports coroutines (like Icon or Scheme), and one that supports parallelism (like Sisal).
... 包括一种支持类抽象的(Java或者C++),一种支持函数式抽象的(Lisp或者ML),一种支持语法抽象的(Lisp),一种支持声明式规约的(Prolog或者C++模板),一种支持协程的(Icon或者Scheme),再加一种支持并发的(如SISAL)。

我自己的感觉是,从这些不同的角度去了解语言是很有益处的,但是并不需要都很精通;而留着1、2门很熟练的看家本事是需要的,可以用来干急活——如果碰到不熟悉而且确实有其它方法、工具更适合的问题,也有准备,毕竟就那么些典型的问题,连 Peter Norvig 都指举了这个几种,怕啥。。。




-- 
No, I will not fix your computer.

Neo Lee

shiwei xu

unread,
Jan 4, 2011, 1:09:37 AM1/4/11
to is...@googlegroups.com
程序员的特色之一,就是什么话题都可以扯到语言之争上来。

2011/1/4 Neo <neo...@gmail.com>

Jeffrey Zhao

unread,
Jan 4, 2011, 1:19:51 AM1/4/11
to is...@googlegroups.com
思维是一方面,领域也是一方面。例如在操作系统方面,C语言无可替代,因为C语言本来就是为了进行冯诺依曼机上的编程,而不是为了多么“编程思维”的。在这些领域(主要是对性能敏感)下面,一些如Lambda演算等思维方式没法最为高效地映射在冯诺依曼机上。
 
当然,除了这些方面,其他大部分领域都是可以有很多替代语言的,这时候就可以来锻炼开发思维了。

Jeffrey Zhao

unread,
Jan 4, 2011, 1:20:21 AM1/4/11
to is...@googlegroups.com
现在好像就是在谈语言话题不是么……

shiwei xu

unread,
Jan 4, 2011, 1:27:33 AM1/4/11
to is...@googlegroups.com
哦,我以为只是新年祝福。

2011/1/4 Jeffrey Zhao <je...@live.com>

Neo Lee

unread,
Jan 4, 2011, 2:10:49 AM1/4/11
to is...@googlegroups.com
Alan J. Perlis(ACM首任主席,图灵奖得主)说:A language that doesn't affect the way you think about programming, is not worth knowing.(如果一门编程语言不能影响你对思考编程的方式,那么它不值得去学。)[1],Google 研究院的老大 Peter Norvig 则建议从这个角度出发,学习半打以上的编程语言来开发思维[2]:

Learn at least a half dozen programming languages. Include one language that supports class abstractions (like Java or C++), one that supports functional abstraction (like Lisp or ML), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), one that supports coroutines (like Icon or Scheme), and one that supports parallelism (like Sisal).
... 包括一种支持类抽象的(Java或者C++),一种支持函数式抽象的(Lisp或者ML),一种支持语法抽象的(Lisp),一种支持声明式规约的(Prolog或者C++模板),一种支持协程的(Icon或者Scheme),再加一种支持并发的(如SISAL)。

我自己的感觉是,从这些不同的角度去了解语言是很有益处的,但是并不需要都很精通;而留着1、2门很熟练的看家本事是需要的,可以用来干急活——如果碰到不熟悉而且确实有其它方法、工具更适合的问题,也有准备,毕竟就那么些典型的问题,连 Peter Norvig 都指举了这个几种,怕啥。。。




-- 
No, I will not fix your computer.

Neo Lee

On Tuesday, January 4, 2011 at 1:28 PM, 钱宏武 wrote:

庄表伟

unread,
Jan 4, 2011, 9:06:06 AM1/4/11
to is...@googlegroups.com
个人认为,语言之争,不是坏事。赵姐夫当初从C#出发对Java的攻击,我就认为很有道理。一场深入的语言之争,无论原本的立场如何,只要不是屁股决定脑袋,参与的人都会有很多收获。

从这个角度来说,我期待更多的语言之争,如果因此能够影响大家对编程的思考模式,那就善莫大焉。

2011/1/4 Neo Lee <neo...@gmail.com>
Reply all
Reply to author
Forward
0 new messages