今日も問題やりました
今日もウェブにある問題に挑戦してみたので、書いてみます。
まず問題
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です。力技万歳!!
以上、終了。