Tantangan manufactoria sederhana. Hitung modulo input 7. Input akan berada dalam biner big-endian (biru = 1, merah = 0). Outputnya harus dalam format yang sama.
Kasus uji disediakan. Hitungan bagian terkecil menang.
(jika input mod 7 adalah 0, tidak menghasilkan apa-apa.)
code-golf
manufactoria
Keith Randall
sumber
sumber
Jawaban:
Algoritma ini cukup mudah: Hitung modulus menggunakan mesin negara (bagian terbesar dengan delapan cabang - salah satu negara diduplikasi untuk keperluan logistik), kemudian menyandikan dan mengumpulkan hasilnya. Karena hampir setiap hasil mengandung satu digit, langkah kompresi tambahan digunakan untuk mengurangi jumlah bagian.
Dirancang dalam YEd, kemudian ditranskripsi ke Manufactoria.
Menggunakan sabuk konveyor terlalu banyak, menurut saya.
sumber
5843 bagianhttp://pleasingfungus.com/Manufactoria/?lvl=33&code=c16:9f0;q15:9f3;q14:9f3;q13:9f3;c12:9f3;c15:10f1;r15:10f3;r14:10f3;r13:10f3;b13:10f3 ; q12: 10f4; p11: 10f4; c16: 11f1; i15: 11f7; q14: 11f7; q13: 11f7; q12: 11f7; c11: 11f2; r15: 12f3; b14: 12f3; c12: 12f3; c15: 13f0; c14: 13f0; : 13f0; c13: 13f0; r13: 12f3; y10: 3f3; c10: 4f2; g10: 5f1; q10: 6f4; y11: 3f0; q11: 4f6; r11: 5f3; p11: 6f4; b11: 7f1; i12: 4f7; ; c12: 5f3; q12: 6f0; g12: 2f3; c12: 3f3; p13: 4f6; y13: 3f0; c13: 5f0; c12: 7f3; b12: 8f3; & ctm = Mod7; Input: _binary_number_big_endian._mutputar _mutputar _mutputar _mutputar _mutputar _mutputar _mutputar_pengaturan : | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrrb: brb | bbrb: bbr; 13; 3; 1 ;
Gagasan Keith Randall untuk pertama kali mengkonversi input ke unary cukup bagus, jadi saya mencurinya. ;-) Mudahnya, saya baru saja menghabiskan waktu mengoptimalkan konverter biner-ke-unary kecil di Manufactoria , jadi pilih saja salah satu solusi saya yang hampir berfungsi * dari tantangan itu dan kombinasikan dengan penghitung mod-7 yang cepat dioptimalkan.
Desain ini sekarang pada titik di mana hanya mendapatkan robot dari atas ke bawah mulai membutuhkan konveyor tambahan yang tidak berguna. Pengurangan bagian lebih lanjut yang signifikan mungkin akan datang dari mendesain ulang tata letak menjadi lebih tinggi dan lebih sempit.
(* Tantangan itu membutuhkan a) desain agar sesuai dengan papan 7 × 7, dan b) output unary berada dalam marker merah. Jika Anda melihat bagian konverter biner ke unary dari mesin di atas, Anda akan perhatikan bahwa, dengan satu atau dua bagian tambahan, ia dapat dengan mudah memenuhi kedua persyaratan, tetapi sayangnya, tidak keduanya.)
Berikut versi 58-bagian sebelumnya:
http://pleasingfungus.com/Manufactoria/?lvl=32&code=g12:f3;q13:13f5;c14:13f0;c15:12f3;c9:6f2;c9:7f1;c9:8f1;c9:9f1;c10:4f3 ; c10: 5f3; i10: 6f5; c10: 7f2; c10: 9f0; b11: 3f2; p11: 4f1; c11: 5f1; p11: 6f2; p11: 7f2; c11: 8f3; p11: 9f3; b11: 10f2; c11: 10f2; : 3f2; c12: 4f2; c12: 5f0; r12: 6f3; c12: 7f3; i12: 8f1; i12: 9f5; y12: 10f3; c13: 3f2; c13: 4f3; i13: 5f1; c13: 6f3; c13: 7f2; ; i13: 8f0; c13: 9f1; c14: 3f3; c14: 4f2; p14: 5f5; c14: 6f1; p14: 7f6; p14: 8f7; r14: 9f3; c15: 4f3; q15: 5f0; c15: 6f3; c15: cf: : 7f3; i15: 8f6; c15: 9f3; q15: 10f7; c15: 11f3; r12: 12f2; p13: 12f7; b14: 12f0; b14: 11f3; b12: 11f3; y14: 10f3; y15: 13f0; & ctm = Mod7 ; Masukan: _binary_number_big_endian._Output: _that_binary_number_mod_7; bbb: | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrrb: brb | bbrb: bbr; 13; 3; 1 ;
Seperti solusi Jan Dvorak , ini juga didasarkan pada FSM 7-negara. Saya telah memberi label pada gerbang yang terkait dengan setiap kondisi di tangkapan layar untuk membuatnya lebih mudah dibaca. Mesin negara itu sendiri, bagaimanapun, benar-benar bagian yang mudah; bagian yang sulit adalah menghasilkan hasil akhir dengan jumlah gerbang minimal.
Salah satu trik yang saya temukan berguna adalah copy putaran terakhir yang menggeser-geser semua yang ditulis sebelum penanda kuning ke ujung (sementara juga melepas penanda hijau): ini memungkinkan saya untuk menggunakan pengulangan dalam bit output orde tinggi oleh menghasilkan output sebagai:
Ini memungkinkan saya sebagian besar menggabungkan jalur output untuk output 2, 4 dan 5 (yang semuanya dimulai dengan
BR
) dan 3 dan 6 (yang dimulai denganBB
).sumber
60 bagian
Solusi saya agak sedikit berbeda. Ini mengkonversi biner ke unary terlebih dahulu, kemudian melakukan mod 7. Saya tidak bisa mengalahkan Ilmari.
sumber
Saya sebenarnya tidak tahu apa yang saya lakukan tetapi itu berhasil dan saya mungkin akan menjadi pemenang (jika hanya test case yang akan menjadi bukti yang cukup). : D
EDIT: Dioptimalkan 2 kali, sedikit lebih kecil sekarang (Sampah dihapus)
sumber
111
, itu akan selalu dilaporkan sebagai habis dibagi oleh 7. Ini sama sekali tidak benar.