灵感的来临,没有任何预兆;灵感的消失,也不会有告别仪式;用文字记下她们吧,让灵感永存……

用 Q 求解回文数等

davies 发表于 2008 年 06 月 10 日

有人用 J 语言来解决欧拉问题 36,我用 Q 语言的解法为:

q)0 {x+y*(all yy=reverse yy:string y)&all b=reverse b:(-32+b?1b)#b:0b vs y}/ til 1000000

或者

q)sum where {all (x=reverse x:string x),b=reverse b:(-32+b?1b)#b:0b vs x} each til 1000000

简要说明一下:

是否是十进制的回文数:{all x=reverse x:string x}

是否是二进制的回文数:{all b=reverse b:(-32+b?1b)#b:0b vs x}

产生一百万以下的数组:til 1000000

如果用 K 语言来写,肯定跟 J 语言一样短而晦涩。Q 语言的可读性还是强不少的。

他还做了第35题,用 Q 语言实现如下:

q) repu:{raze $[1<n:count x;x {x[y] ,/: repu x _y }/: til n;x]} /全排列
q) primes:00b,999998#1b  / 初始化质数标志位
q) {$[primes[x];primes[x*2_til floor 1000000%x]:0b;0b]} each 2+til 499999 / 标记非质数
q) sum where {all `boolean$ primes "I"$repu string x} each til 1000000 /

Q 还是相当精炼的语言,唯一的不足是不知道怎么实现惰性求值,或者协程(concurrence),有的话可以进一步提高效率。

网友留言:

我来留言