Think Twice
IT技術メモ | プログラミングお題のメモ
Created: 2011-07-03 / Updated: 2023-09-04

[お題] 1000以下の回文素数で最大のものを求める


当メモは2011-07-03に投稿されたものを加筆修正し、再掲したものです。
みなさまもお好きな言語で解いてみてくださいね。

目次


お題

Copy
1000以下の最大の回文素数を見つけるプログラムを書きなさい。

補足:回文数というのは右から読んでも左から読んでも同じ数字になる数
一桁のものも含まれる。

回文数の例
Copy
1 2 3 11 22 121 1221 12221 123454321
回文素数は素数で、しかも回文数になっているもののことである。

Groovyで解いてみた

2011-07-03 更新

Copy
// 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()
ということで、答えは929

2011-07-04追記

akihiro4chawonさんにコメントですっきりした方法を教えていただいたので、そちらをGParsの並列コレクションを用いて実装してみました。

Copy
import static groovyx.gpars.GParsPool.*

withPool {
  assert 929 == (1G..1000G).parallel
    .filter { it.isProbablePrime(32) }
    .filter { it.toString().with{ it == it.reverse() } }
    .collection
    .last()
}

関連メモ


参考

参考サイト