今日も問題やりました

今日もウェブにある問題に挑戦してみたので、書いてみます。

 

まず問題

3桁の数の積で表される回文数の最大値を求めよ

 回文数っていうの左右どちらから読んでも、同じになる数字のことだそうです。

12321みたいな。

 

で、コードは

まず回文数かどうかを判断する述語を作りました。

 

(defn kaibun? [val]

  (if (= (str val) (apply str (reverse (str val) ) ) )

    true

    false

  )

)

カッコめっちゃ多いですね。

そして次に3桁の数の積のシーケンスを定義しました。

これが難しかった。

 

(def big-seq (loop [vec [] val 100]

  (if (= val 1000)

    vec

    (recur (into vec (for [n (take 900 (iterate inc 100))] (* n val))) (inc val))

  )

))

 3桁の数の積を全部取ってきてます。

これこそ遅延シーケンスの真骨頂なんですかね?

評価したらすごいことになりました。

 

であとはフィルターにかけると

 

(filter kaibun? big-seq) 

 ずらっ~~と結構な数が出てきました。

シーケンス内の最大値を取ってくれる関数とかないのかな?と

ちょっと探したのですがないかもなんで、力技

パッと見、900000台を見つけたので、

 (filter #(< 900000 %) (filter kaibun? big-seq))

 したら、結果が(906609 906609)

 

素晴らしい! 最大値は906609です。

 

何と何をかけたのかもわかりませんが、906609です。力技万歳!!

以上、終了。