pengantar
Teka-teki umum melibatkan papan segitiga dengan 15 lubang untuk tee / pasak seperti yang ditunjukkan pada gambar di bawah ini:
Dimulai dengan semua pasak di papan kecuali untuk lubang di bagian atas, titik teka-teki adalah untuk melompati pasak satu sama lain seperti checker sedemikian rupa untuk meninggalkan tepat satu pasak tersisa. Satu-satunya langkah yang valid adalah dengan melompati satu pasak ke pasak yang berdekatan ke segala arah ke lubang kosong. Pasak yang dilompati kemudian dihapus dari papan. Putar selesai saat tidak ada gerakan yang valid.
Spec
Tugas Anda adalah menulis sebuah program yang dapat menemukan solusi lengkap untuk teka-teki pasak, yaitu, yang hanya menyisakan satu pasak tersisa. Ada beberapa kemungkinan solusi, jadi program Anda hanya perlu mencetak satu.
- Program Anda tidak akan menerima input. Anda tidak diperbolehkan membaca data dari sumber luar apa pun.
- Cetak daftar 13 gerakan yang memberikan hasil 1 pasak tersisa menggunakan format ini:
Peg 1 jumps Peg 3 to Hole 6.
- Lubang / pasak diberi nomor dari atas ke bawah, kiri ke kanan, sehingga pasak / lubang atas adalah 1, penomoran hingga kanan bawah adalah 15.
- Program Anda harus menemukan solusinya saat runtime . Mencetak solusi secara langsung dengan cara apa pun selain menyelesaikannya dalam program adalah diskualifikasi otomatis.
- Bonus : menerima 10 poin bonus jika Anda dapat menghasilkan beberapa solusi unik (hanya dapat mencetak dipisahkan oleh garis kosong).
- Bonus : menerima 5 poin bonus jika nomor
15
tidak muncul di kode sumber Anda.
Mencetak gol
Ini adalah kode-golf, jadi solusi terpendek (dengan jumlah byte) yang mencetak jawaban yang benar akan menjadi pemenang. Poin bonus dikurangi dari jumlah total byte Anda. Harap berikan contoh hasil dari menjalankan program Anda serta tautan ke ideone
atau beberapa situs serupa jika mungkin menunjukkan eksekusi program Anda.
sumber
15=0xff=(1<4)-1=~(-1<<4)=...
15
dirinya sendiri;)Jawaban:
Ruby, skor
240238234 = 249 - 10 - 5Implementasi ruby biasa yang mencetak semua solusi yang memungkinkan untuk puzzle ini (membutuhkan waktu kurang dari satu menit di komputer saya). Baris pertama dari output dapat dilihat di sini:
Dan contoh online dapat ditemukan di sini .
sumber
Python, 324 karakter, skor = 319
Status pasak disimpan sebagai bitmask.
M
berisi daftar negara pasak dan instruksi untuk sampai ke keadaan itu.Saya bisa membuatnya mencetak semua solusi juga (ada 29.760 di antaranya), tetapi akan membutuhkan biaya lebih dari 10 karakter untuk melakukannya.
Saya tidak dapat mempostingnya di ideone karena membutuhkan waktu sekitar 90 detik untuk berjalan.
Keluaran:
sumber
C, 386 karakter, skor = 371
Mencetak semua 29760 solusi, dalam waktu kurang dari satu detik.
Versi ini mengasumsikan (antara lain) bahwa kompiler akan mengizinkan deklarasi printf () secara implisit. Sekitar enam karakter lagi dapat disimpan dengan memanfaatkan implisit-int, tetapi fitur itu secara teknis dihapus dari C99.
Juga, empat byte lagi dapat disimpan dengan mengganti huruf kapital dalam dua string dengan karakter kontrol yang sesuai. Saya tidak melakukannya di sini karena kompiler tidak diharuskan untuk mengizinkan string seperti itu, dan itu membuat kode sumber yang sudah padat benar-benar tidak terbaca.
Untuk kejelasan, inilah algoritma yang sama tanpa optimasi ukuran yang lebih membingungkan:
f, o, dan t adalah daftar lompatan legal yang diinisialisasi pada loop pertama. r dan i membentuk sejarah yang digunakan program untuk mundur dan menjelajahi semua game yang mungkin.
Saya yakin ini bisa diperbaiki!
sumber
>>1
oleh/2
.