Mod 7 di Manufactoria


12

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.

http://pleasingfungus.com/Manufactoria/?ctm=Mod7;Input:_binary_number_big_endian._Output:_that_binary_number_mod_7;bbb :|brrr:b|brrrr:br|bb:bb:bbrrb:brrbbrbrrbbbbbrbbrbbrbbbbrbbbrbbbbrbrbrbbrbbrbbbrbrbbr tentang brbbr> brbbr> brbbr> 13; 3; 1 ;

(jika input mod 7 adalah 0, tidak menghasilkan apa-apa.)


"kode-golf" dalam hal ini berarti "bagian paling sedikit"?
John Dvorak

Karena saya bahkan belum menyelesaikan masalah kenaikan, saya tidak tahu bagaimana menyelesaikannya. Manufactoria menyenangkan.
Justin

@ JanDvorak: ya.
Keith Randall

@KeithRandall Kami tidak pernah menandai kode-golf dengan manufactoria. Kami harus menghapus tag di sini atau menambahkannya ke pertanyaan lain.
Howard

@ Howard: Saya akan mengatakan menambahkannya (atau kode tercepat atau sibuk berang-berang atau tantangan kode atau apa pun yang paling menggambarkan skor), dan biarkan manufactoria menjadi tag bahasa yang sederhana .
Ilmari Karonen

Jawaban:


5

### Manufactoria, 85 bagian ditempatkan

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.


5

58 43 bagian

Screenshot pada 43-bagian mod7 mengurangi di Manufactoria

http://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:

Cuplikan layar peredam mod 7 bagian 58 di Manufactoria, dengan status berlabel

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:

0:  Y   ->
1: BY   ->   B
2:  YBR ->  BR 
3:  YBB ->  BB
4: RYBR -> BRR
5: BYBR -> BRB
6: RYBB -> BBR

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 dengan BB).


Saya tidak menemukan kekurangan dalam desain Anda. Pekerjaan bagus menghemat ruang.
John Dvorak

Ps. Berikut ini adalah tes yang bagus untuk implementasi berbasis mesin negara seperti ini: angka 8890 = BRRRBRBRBBBRBR harus memberikan output 0, mengunjungi setiap negara dua kali (dan menyatakan 0 sekali lagi di akhir) dan mengambil setiap kemungkinan transisi keadaan sekali.
Ilmari Karonen


0

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

masukkan deskripsi gambar di sini

EDIT: Dioptimalkan 2 kali, sedikit lebih kecil sekarang (Sampah dihapus)


Sebenarnya saya tidak tahu apakah ini akan bekerja dengan angka yang lebih besar (atau berbeda dari kasus uji).
Leo Pflug

1
-1 hanya berfungsi untuk kasus uji. Jika angka dimulai dengan 111, itu akan selalu dilaporkan sebagai habis dibagi oleh 7. Ini sama sekali tidak benar.
John Dvorak
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.