アルゴリズム

逆FizzBuzz問題

オートマトンっぽい問題なのは分かるけど、それを実装するのは面倒くさいので必要と思われる長さのFizzBuzzシーケンスを切り出して全チェックしてます。 与えられた「Fizz Buzz リスト」 の長さを len とすると、解が含まれる範囲は先頭から高々「7 + (len -…

F# の Project Euler 26 コードを改良した

昨日のエントリの続報です。 F#版改良コード 剰余シーケンス生成関数と、剰余の既出判定関数を一つにまとめました。パフォーマンスに悪影響を与えている疑惑がある 遅延シーケンス操作部分を無くすのが目的です。結果、桁違いに早くなりました。 前回 15 秒…

F# で Project Euler 26 を解いたら遅かった

問題はこれ : Problem 26 ● F# での解答 何故か遅い。うちの環境だと 15秒以上かかる。 ideone.com で試したらやはり同じくらいかかっているようで、タイムアウトでプロセスを kill されてた。 recurringLength に 再帰回数が大きくなるような引数*1を与える…

無限シーケンスから組み合わせ生成

組み合わせ生成関数(無限シーケンス対応版)を作ってみました。 ;; Ver.1 (defn- combinations* [xs combs] (when-first [x xs] (let [new-combs (map (fn [c] (conj c x)), combs)] (lazy-cat new-combs (combinations* (rest xs) (concat combs new-combs…

続・エラトステネスの無限の篩

本題の前に、前回のコードを少し書き換えた*1ので、まずはそちらから。 ♯エラトステネスの無限の篩 Ver.1 アルゴリズム上の変更点は倍数リスト*2を「n を除く n の倍数」ではなく、「n^2 を初期値とする n の倍数」にしただけです。 (defn- diff-seq [s1 s2]…

エラトステネスの無限の篩

♯エラトステネスの篩とは 一般にエラトステネスの篩(ふるい)というと求める素数の上限を決めてそれ以下の整数(2以上)から素数の倍数を消すことで素数を篩い出すアルゴリズムです。詳細はwikipediaに分かり易く書かかれていますのでそちらをどうぞ。 こ…