No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Project Euler Problem 4 を解いてみた

問題

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.

Problem 4 - Project Euler

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)
  • なんかもっときれいに書ける気がする。