用 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),有的话可以进一步提高效率。