当メモは2011-07-03に投稿されたものを加筆修正し、再掲したものです。
みなさまもお好きな言語で解いてみてくださいね。
目次
お題
1000以下の最大の回文素数を見つけるプログラムを書きなさい。
補足:回文数というのは右から読んでも左から読んでも同じ数字になる数。
一桁のものも含まれる。
回文数の例
1 2 3 11 22 121 1221 12221 123454321
Groovyで解いてみた
2011-07-03 更新// Thanks to http://d.hatena.ne.jp/genzouw/20100201/1265003523 def findAllPrime(int max){ assert max >= 2 def list = 2..max def primeList = [] while ( !primeList || (list && list.max() >= primeList.max()**2) ){ def checkNum = list[0] primeList << checkNum list = list.findAll{ it%checkNum != 0 } } (list + primeList).sort() } def isKaibun = { numStr -> for(i in 0 ..< (numStr.size() / 2 as int)) { if (numStr[i] != numStr[-(i+1)]) return false } true } assert '929' == findAllPrime(1000)*.toString().findAll(isKaibun).last()
2011-07-04追記
akihiro4chawonさんにコメントですっきりした方法を教えていただいたので、そちらをGParsの並列コレクションを用いて実装してみました。
import static groovyx.gpars.GParsPool.* withPool { assert 929 == (1G..1000G).parallel .filter { it.isProbablePrime(32) } .filter { it.toString().with{ it == it.reverse() } } .collection .last() }