Skenarionya
Setelah seharian bekerja keras di kantor dan menjelajah stackexchange.com , saya akhirnya keluar dari pintu pada pukul 16:58, sudah lelah dengan hari itu. Karena saya masih magang, moda transportasi saya saat ini adalah bersepeda. Saya menuju ke Peugeot Reynolds 501 saya yang tepercaya , tapi sebelum saya bisa berlayar, saya harus membuka kunci. Kunci adalah kunci kombinasi empat digit standar (0-9), melalui bingkai dan roda depan. Ketika saya mencoba untuk tetap terjaga, saya menarik tangan saya untuk memasukkan dalam kombinasi.
Tantangan
Karena jari saya sangat lelah, saya ingin memutar kunci ke kombinasi yang benar dengan gerakan paling sedikit. Satu gerakan didefinisikan sebagai rotasi oleh satu posisi (36 derajat), misalnya ada satu gerakan dari 5737
ke 5738
. Namun, saya dapat menangkap hingga tiga cincin berturut-turut pada saat yang sama, dan memutarnya sebagai satu , yang hanya dihitung sebagai satu gerakan. Misalnya hanya ada satu gerakan dari 5737
ke 6837
atau ke 5626
. Pindah dari 5737
ke 6838
bukan satu gerakan, karena angka nomor 1,2 dan 4 telah bergerak ke arah yang sama, tetapi secara independen dari angka 3.
Oleh karena itu, untuk kombinasi yang diberikan, saya dapat melihat pada kunci sepeda (bilangan bulat 4 digit), berapa jumlah gerakan terendah yang dapat saya buat untuk membuatnya tidak terkunci, dan ya, saya dapat memutar ke arah mana saja kapan saja. Maksud saya, saya dapat mengubah beberapa digit dalam satu arah dan digit lainnya di arah lain: tidak semua gerakan saya akan menjadi berlawanan arah jarum jam atau searah jarum jam untuk setiap pembukaan kunci.
Karena saya malas, kode pembuka kunci saya adalah 0000.
Ini adalah kode golf saya tidak bisa repot menulis banyak kode, jadi program terpendek dalam jumlah byte menang.
Input dari stdin, dan kode Anda harus menampilkan kombinasi yang dapat saya lihat di setiap langkah setelah setiap gerakan, termasuk 0000 di akhir. Setiap output kombinasi harus dipisahkan oleh spasi / baris baru / koma / periode / ampersand.
Contohnya
Input: 1210
0100
0000
Input: 9871
9870
0980
0090
0000
Input: 5555
4445&3335&2225&1115&0005&0006&0007&0008&0009&0000
Input: 1234
0124 0013 0002 0001 0000
Saya mencoba memposting ini di http://bicycles.stackexchange.com , tetapi mereka tidak menyukainya ...
Penafian: Golf pertama, jadi apa pun yang rusak / informasi yang hilang beri tahu saya! Saya juga melakukan semua contoh dengan tangan, jadi mungkin ada solusi yang melibatkan lebih sedikit gerakan!
EDIT: Untuk jawaban yang memiliki banyak jalur solusi dengan jumlah gerakan yang sama (hampir semuanya), tidak ada solusi yang disukai.
Jawaban:
Matlab,
412327 byteGolf (Berkat @AndrasDeak untuk bermain golf
s
!):Kode ini menggunakan beberapa pemrograman dinamis untuk menemukan 'jalur' terpendek dari nomor yang diberikan untuk
0000
hanya menggunakan langkah-langkah yang mungkin. Tantangannya pada dasarnya adalah jalur terpendek prioblem (atau Anda mungkin dapat mempertimbangkan langkah-langkah sebagai kelompok komutatuve), tetapi kesulitan datang dengan implementasi yang efisien . Struktur dasar adalah dua array 10.000 elemen, satu untuk menyimpan jumlah langkah untuk sampai ke indeks itu, yang lain untuk menyimpan pointer ke 'simpul' sebelumnya dalam grafik kami. Ini secara bersamaan menghitung 'jalur' ke semua angka yang mungkin lainnya.Contoh:
Kode Lengkap (termasuk beberapa komentar):
sumber
6444
kode Anda memberikan 6444 7554 8664 9774 0884 0994 0004 0003 0002 0001 0000, sedangkan saya menemukan jawabannya menjadi 6444 6333 6222 6111 6000 7000 8000 9000 0000. Jawaban saya adalah 8 langkah, Anda adalah 10. Saya tidak dapat melihat masalah, dan tampaknya ada di sana baik dalam versi golf dan ungolfed. Ini diperbaiki dalam suntingan terbaru Anda.s
baris terakhir seharusnya[0,1,1,1]
. Maka Anda mendapatkan solusi 8 langkah juga! Saya minta maaf atas ketidaknyamanan =)Batch - 288 byte
Bahkan jika Anda mengatakan mereka harus berurutan (berdering), saya berasumsi dengan logika (mengikuti contoh) bahwa saya dapat melewatkan yang di tengah, mulai dari1234
hingga0224
.Ini adalah solusi Batch saya: 236 byte.Edit: solusi yang diperbaiki
Solusi baru (diperbaiki sesuai dengan komentar yang mendasarinya) adalah 288 byte.
sumber
1234
ke0224
adalah tidak satu gerakan. Idenya adalah bahwa dengan hanya menggunakan dua jari saya dapat memegang hingga tiga cincin berturut-turut dengan satu genggaman.Haskell - 310 byte
Ini berfungsi dengan berulang kali membuat daftar kombinasi baru dengan menerapkan setiap belokan yang mungkin untuk setiap kombinasi yang telah tercapai hingga salah satunya adalah kombinasi yang tepat. Duplikat dihapus dari daftar pada setiap iterasi untuk menjaga penggunaan memori tumbuh secara eksponensial.
Sebagai solusi brute force, ini sangat tidak efisien dan dapat memakan waktu beberapa menit untuk berjalan.
Saya tidak punya banyak pengalaman dengan Haskell, jadi beberapa hal mungkin bisa dilakukan dengan lebih baik.
sumber