Einstein menulis teka-teki. Dia mengatakan bahwa 98% dunia tidak dapat menyelesaikannya.
Saya memecahkan teka-teki ini dalam sekitar 25 menit saat di kereta untuk bekerja. Ini pada dasarnya hanya deduksi.
Teka-teki
Ada 5 rumah dalam 5 warna berbeda berturut-turut.
Di setiap rumah tinggal seseorang dengan kebangsaan yang berbeda.
5 pemilik minum minuman jenis tertentu, merokok cerutu merek tertentu, dan memelihara hewan peliharaan tertentu.
Tidak ada pemilik yang memiliki hewan peliharaan yang sama, merokok cerutu merek yang sama, atau minum minuman yang sama.
Pertanyaan: Siapa yang memiliki ikan?
Untuk memecahkan teka-teki ini Einstein menyediakan 15 petunjuk:
- Orang Inggris itu tinggal di rumah merah.
- Orang Swedia memelihara anjing sebagai hewan peliharaan.
- Orang Denmark minum teh.
- Rumah hijau berada di sebelah kiri langsung rumah putih.
- Pemilik rumah kaca minum kopi.
- Pemilik yang merokok Pall Mall memunculkan burung.
- Pemilik rumah kuning itu merokok Dunhill.
- Pemilik yang tinggal di rumah pusat minum susu.
- Orang Norwegia tinggal di rumah pertama.
- Pemilik yang merokok Blends tinggal di sebelah orang yang memelihara kucing.
- Pemilik yang memelihara kuda itu tinggal di sebelah orang yang merokok Dunhill.
- Pemilik yang merokok Bluemasters minum bir.
- Jerman merokok Pangeran.
- Orang Norwegia itu tinggal di sebelah rumah biru.
- Pemilik yang merokok Blends tinggal di sebelah orang yang minum air.
Dengan petunjuk ini Anda bisa menemukan solusi.
Tugas Anda: Buat program yang akan memecahkan teka-teki ini untuk Anda. Pengodean keras solusinya tidak diizinkan (ya)
Diperbolehkan untuk membuat hardcode petunjuk dalam format apa pun.
Format contoh:
//Hints in order
(Nationality:Brit)==(Color:Red)
(Nationality:Swede)==(Pet:Dogs)
(Nationality:Dane)==(Drink: Tea)
(Color:Green)/(Color:White)
(Color:Green)==(Drink:Coffee)
(Smoke:PallMall)==(Pet:Birds)
(Color:Yellow)==(Smoke:Dunhill)
(House:3)==(Drink:Milk)
(Nationality:Norwegian)==(House:1)
(Smoke:Blend)/\(Pet:Cats)
== Berarti sama dengan
/ berarti di sisi kiri
\ berarti di sisi kanan
/ \ berarti kiri atau kanan
Seperti saya katakan itu diizinkan untuk petunjuk hardcode atau memilikinya sebagai input.
Output: Output harus dalam format berikut (Dengan nilai-nilai yang benar, hanya mengatakan untuk troll;))
_____________ _____________ _____________ _____________ _____________
| Number | | Number | | Number | | Number | | Number |
| Nationality | | Nationality | | Nationality | | Nationality | | Nationality |
| Color | | Color | | Color | | Color | | Color |
| Drink | | Drink | | Drink | | Drink | | Drink |
| Smoke | | Smoke | | Smoke | | Smoke | | Smoke |
| Pet | | Pet | | Pet | | Pet | | Pet |
--------------- --------------- --------------- --------------- ---------------
The <Nationality> in the <Color> house owns the fish!
Kotak seni Ascii dapat diubah oleh Anda, asalkan itu kotak, tidak peduli simbol apa yang Anda gunakan.
Pengetahuan tentang teka-teki dan solusi ini tidak dapat digunakan dalam program. Itu harus menggunakan logika murni dan deduksi untuk memecahkan teka-teki.
Menandai ini sebagai codegolf tetapi mungkin merupakan tantangan kode, tidak yakin. Setiap pemikiran tentang kriteria memenangkan untuk tantangan kode merasa bebas untuk dibagikan :)
Untuk sekarang ini adalah kode-golf sehingga program dengan bytecount terendah menang.
Selamat mencoba dan Selamat coding :)
Jawaban:
Prolog - 954 Karakter
Keluaran
Kunci:
sumber
Ruby 322 + input 442
Pencarian paksa dari hampir 25 miliar jawaban yang mungkin.
Komputer saya akan memakan waktu sekitar 75 hari untuk menjalankan program ini.
Saya tidak pernah memverifikasi jika program ini mencetak jawaban yang benar!
Jalankan sebagai
ruby riddle.rb < riddle.in
riddle.rb (332 bytes)
riddle.in (442 bytes)
File input harus berisi 5 baris nama, diikuti oleh garis ekspresi logis. Nomor rumah adalah 0 hingga 4. Harus ada a
fish
.Program ini memanggil
Array#permutation
lima kali untuk menemukan semua cara untuk memesan susunan kebangsaan, warna, minuman, merokok dan hewan peliharaan. Loop panjang adalahc.product(*d){|a|...}
, panggilanArray#product
untuk mengulangi hampir 25 miliar kemungkinan jawaban. Tubuh loop memiliki bentuk(f=eval ...)&&(...)
. Bagianeval ...
mengevaluasi ekspresi logis. Jika semuanya benar, makaf
nomor rumah ikan dan&&(...)
bagian yang mencetak jawabannya. House nomor 0 benar di Ruby.Golf kode berarti tidak menambahkan kode untuk kecepatan! Tapi saya kurang 75 hari untuk menjalankan program!
sumber
Prolog, 653 karakter
sumber
Smalltalk 1332 karakter
Menggunakan Smalltalk polos:
Keluaran:
Karena versi golf hampir tidak dapat dibaca, berikut adalah kode pengembang dengan nama, lekukan, dan ruang yang layak untuk dibaca:
Menggunakan pustaka pemecah kendala:
Menggunakan pustaka pemecah kendala, yang sangat mirip dengan yang dijelaskan dalam manual OZ / Mozart. Seperti yang saya perkirakan Anda akan mengeluh bahwa ini tidak berlaku untuk kontes ;-), ini ditambahkan hanya untuk hiburan dan inspirasi Anda (mencari paket contraint dalam bahasa Anda), tidak berkumun, dan tidak menghitung karakter.
Perhatikan operator "=:", yang berarti "menyatukan dengan". Solver menggunakan algoritma backtracking pada set kendala yang ditentukan dalam blok masalah. Kode yang tersisa mencetak solusi ke dalam kotak:
Keluaran:
Sunting: oops - Saya lupa mencetak baris "who have the fish" dalam versi biasa.
sumber
Ruby 1166 karakter
Sunting: Diperbarui untuk format output yang benar
Berjalan secara konsisten dalam waktu kurang dari 0,2 detik pada MBP i5.
Sumber: Lihat Di Github
Satu-liner:
Empuk dengan baris baru agar sesuai dengan halaman:
Output:
Kode Tidak Terkunci
Output:
Penggunaan
shuffle
dalam pengaturan awal memastikan jalur solusi unik setiap kali. Anda dapat melihat ini dengan jumlah upaya yang mengubah antar proses. Ini mengurangi kebutuhan untuk memberi makan pada input secara terpisah, meskipun mengubah kode untuk melakukannya akan sepele.sumber