Sittleを使用したWordleの解決


エーco-worker Webdleパズルを解決するためにWebアプリを書いて、私はそれはそれをポートにそれが楽しいと思いましたScittle . それはうまく動作しますが、(あなたが見るように)あまり良くはありません.使用するapp 代わりに.

ハイレベルの概要


静的サイト開発のために以下のツールを使用しました
  • 馬場家task runner 敷地内建物.

  • Selmer テンプレート用.

  • Hiccup HTML用.

  • Scittle with reagent フロントエンドロジック用.
  • すべてがうまくいったが、scittleは不器用に見えた.遅れはいくつかのコンポーネントのあまりにも多くの再描画をトリガするミスに起因する可能性があります.読者はそれを修正するためにPRを提出する歓迎です.
  • Project
  • App
  • ヴィンセントのアルゴリズムを盗むのではなく、私はゼロからソルバーを書きました.私は、ウインドウドレッシングのために同じことを言うことができません:私は、彼のCSSを全く盗まれました.😄

    アルゴリズム


    このアルゴリズムは、下部のファンシーフィルタ/削除述語です.
    (defn filter-words [words]
      (remove unfit-word? words))
    
    優秀な最初のステップは、与えられたインデックスでどの文字が可能かを決定することです.それがそうであるならば、手紙は許容できます
  • 与えられたインデックスの緑
  • 黄色ではなく、指定されたインデックス
  • ブラックリストから行方不明
  • これらの可能性は相互に排他的である.
    (defn get-possible-letters
      "Returns a set of allowable letters for a given index"
      [index]
      (if-let [letter (get @greenlist index)]
        #{letter}
        (set/difference alphas @blacklist (get @yellowlist index))))
    
    私は、この機能を容易にするために個々のリストをモデル化しました.
    (def blacklist (r/atom #{}))
    
    (def yellowlist (r/atom [#{} #{} #{} #{} #{}]))
    
    (def greenlist (r/atom [nil nil nil nil nil]))
    
    unfit-word? 今すぐ書き込めます.
    (defn unfit-letter? [[index letter]]
      (nil? ((get-possible-letters index) letter)))
    
    (defn unfit-word? [indexed-yellows word]
      (some unfit-letter? (map-indexed vector word)))
    
    このコードは必要な作業のほとんどを表しますが、重要な部分がありません.手紙が黄色のリストにあるならば、それは語の一部でなければなりません.しかし、残念ながら、我々はそれを保証していない.
    もし、指定された一連のインデックスにない文字だけを含む集合に単語を変換することができれば、このチェックを実行することができます.
    私たちは“真実”という言葉を持っていると想像し、両方のTは黄色です.EGのようなモデルで[#{t} #{} #{} #{t} #{}] . 単語“について”条件に合う.これを逆行しましょう.
    ;; remove the indices specified by the yellowlist and see if 't' is in the resultset
    (#{\b \o \t} \t) ;=> \t
    (#{\b \o \t} \x) ;=> nil
    
    ;; how do we get #{\b \o \t}?
    ;; there are many ways but let's try this one
    (disj (set (replace-idx {0 nil 3 nil} (vec "about"))) nil)
    
    ;; `replace-idx` doesn't exist in scittle.
    ;; We could write it but let's try this instead
    (reduce-kv
     (fn [a k v]
       (if (#{0 3} k)
         a (conj a v)))
     #{} (vec "about"))
    
    ;; how do we go from [#{t} #{} #{} #{t} #{}] to #{0 3}?
    
    関数を定義しますindex-yellow-letters .
    (defn index-yellow-letters []
      (reduce-kv
       (fn [a k v]
         (reduce
          (fn [ax bx]
            (update ax bx conj k))
          a v))
       {} @yellowlist))
    
    これは、我々が欲しいものにかなり近いです.
    (reset! yellowlist [#{t} #{} #{} #{t} #{}])
    (index-yellow-letters) ;=> {\t (0 3)}
    
    次に、関数を定義しましょうunfit-subword? , ' subword 'は文字集合を指す.#{\b \o \t} 前の例では.この関数は、以前に使ったロジックの残りをカプセル化します.
    (defn unfit-subword? [word [letter ix]]
      (nil?
       (reduce-kv
        (fn [a k v]
          (if ((set ix) k)
            a (conj a v)))
        #{} (vec word))
       letter))
    
    最後にunfit-word? & filter-words この新しいロジックを考慮に入れる.
    (defn unfit-word? [indexed-yellows word]
      (or (some unfit-letter? (map-indexed vector word))
          (some (partial unfit-subword? word) indexed-yellows)))
    
    (defn filter-words [words]
      (remove (partial unfit-word? (index-yellow-letters)) words))
    

    良い


    静的サイトの構築のためのSelmer&Hiscupを使用して(そしてそれを実行するためのBabashkaのタスクランナー)素晴らしいように私は完全に機能静的サイトジェネレータを記述するためにそれらを使用したいと働いた.
    叫ぶminiserve . 私は単一のファイルを生成したかったので、私はこのプロジェクトのためにそれを必要としなかった.私が複数の出力ファイルを生成したならば、miniserveはテストに非常に役に立ちました.😄

    悪い


    「一般的な使用」静的サイトジェネレータを書きたいなら、多くのタグを加える必要があるでしょう.yogthos/selmver#278 参考のために.

    醜い


    scittleはクールですが、現在の状態で実行中です.おそらく色を切り替えるときにいくつかの遅れに気づいた.
    でもそれは私の過失かもしれない.私はこのような状態をモデル化することを選んだ.
    (def blacklist (r/atom #{}))
    
    (def yellowlist (r/atom [#{} #{} #{} #{} #{}]))
    
    (def greenlist (r/atom [nil nil nil nil nil]))
    
    あなたが想像できるように、色のトグルは、これらの“Ratomのすべての3つを変更します.”この動作は、カバーの下にいくつかのディベートがない限り、色の切り替えが必要以上に再描画をトリガーすることを意味します.あなたがこれが問題であると思うならば、私は喜んでPRを受け入れます.