シンプルなManufactoriaチャレンジ。7を法とする入力を計算します。入力はビッグエンディアンバイナリ(青= 1、赤= 0)になります。出力は同じ形式である必要があります。
テストケースが提供されます。最小の部品数が優先されます。
(入力mod 7が0の場合、何も出力しません。)
シンプルなManufactoriaチャレンジ。7を法とする入力を計算します。入力はビッグエンディアンバイナリ(青= 1、赤= 0)になります。出力は同じ形式である必要があります。
テストケースが提供されます。最小の部品数が優先されます。
(入力mod 7が0の場合、何も出力しません。)
回答:
アルゴリズムは非常に単純です。ステートマシン(8つの分岐を持つ最大部分-状態の1つはロジスティック目的で複製されます)を使用してモジュラスを計算し、結果をエンコードして収集します。ほとんどすべての結果には1桁が含まれるため、部品の量を減らすために追加の圧縮ステップが使用されます。
yEdで設計され、その後Manufactoriaに転写されました。
私の意見では、あまりにも多くのコンベアベルトを使用しています。
最初に入力を単項に変換するというキースランドールのアイデアはかなり良かったので、私はそれを盗みました。;-)便利なことに、私はManufactoriaの小さなバイナリから単数へのコンバータを最適化するのに少し時間を費やしたので、その課題からほとんど動作するソリューション*の1つを選択し、迅速に最適化されたmod-7カウンターと組み合わせました。
この設計では、ロボットを上から下に移動するだけでは、無駄な余分なコンベアが必要になり始めています。部品の大幅な削減は、レイアウトをより高く、より狭くなるように再設計することによって生じる可能性があります。
(* その課題には、a)7×7ボードに適合する設計、およびb)赤マーカーである単項出力が必要でした。上記のマシンのバイナリからユニタリーへのコンバーターの部分を見ると、1つまたは2つの余分な部分があれば、どちらか一方の要件を簡単に満たすことができますが、両方ではありません。
以前の58パートバージョンは次のとおりです。
Jan Dvorakのソリューションと同様、これも7ステートFSMに基づいています。読みやすくするために、スクリーンショットで各状態に対応するゲートにラベルを付けました。ただし、ステートマシン自体は本当に簡単な部分です。トリッキーな部分は、最小限のゲート数で最終出力を生成することです。
私が便利だと思った1つのトリックは、黄色のマーカーの前に書かれたすべてを最後にバレルシフトする(また、緑色のマーカーを取り除く)最終コピーループでした:これにより、高次出力ビットの繰り返しを利用することができました出力を次のように生成します。
0: Y ->
1: BY -> B
2: YBR -> BR
3: YBB -> BB
4: RYBR -> BRR
5: BYBR -> BRB
6: RYBB -> BBR
これにより、出力2、4、5(すべてがで始まるBR
)と3、6(すべてで始まる)の出力パスをほとんど組み合わせることができますBB
。
私は実際に自分が何をしているのか分かりませんでしたが、うまくいき、勝者になるかもしれません(テストケースだけが十分な証拠になるなら)。:D
編集:2倍に最適化、少し小さくなりました(ゴミを削除)
111
、なり、常にこれは単に本当ではありません7で割り切れるであると報告さ。