当メモは2012-08-05に投稿されたものを加筆修正し、再掲したものです。
みなさまもお好きな言語で解いてみてくださいね。
目次
お題
英語
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 99. Find the largest palindrome made from the product of two 3-digit numbers.
日本語
左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である. では, 3桁の数の積で表される回文数の最大値を求めよ.
3桁の数を二つ掛けた場合に回文になる最大の数を示せって問題ですね。
Groovyで解いてみた
2012-08-05 更新- こちら より抜粋
Number.metaClass { isPalindromicNumber = { delegate.toString().with{ it == it.reverse() } } getDigits = { delegate.toString().size() } } class PalindromicNumbers implements Iterable { int n = 999*999 int end = 100*100 def digit3 = null @Override Iterator iterator() { [ hasNext : { true }, next : { if (digit3) { def r = digit3.head() digit3 = digit3.tail() return r } while (n > end) { if (n.palindromicNumber) { digit3 = (999..100).collect{ [n:n, d1:it, d2:n/it, result:n % it == 0] }.findAll{ it.result } if (digit3) { n-- def r = digit3.head() digit3 = digit3.tail() return r } } n-- } } ] as Iterator } } def result new PalindromicNumbers().takeWhile{ if (it.d1.digits == 3 && it.d2.digits == 3) { result = it } !result } assert result == [n:906609, d1:993, d2:913, result:true]
- Groovy
v1.8.7
からtakeWhile
が使えるようになったので、やっつけでやってみた(リファクタリングもしてない)。 - 最後のresultのnが答えです。(993×913=906609)
- なんかもっときれいに書ける気がする。
他の方のGroovyでの回答
- (備忘録的なblog) Project Euler-Problem4をgroovyで解いてみる
- (A blog by Jared Cacurak) A Groovy solution for Project Euler - Problem 4