Cluck Cluck. Tidak ada yang tahu mengapa ayam itu menyeberang jalan, mungkin ada ayam jago di sisi lain. Tapi kita bisa mencari tahu caranya. Tulis sebuah program, yang, dari kiri ke kanan, melintasi "jalan" ini (atau apa pun).
1356 | 1738
3822 | 1424
3527 3718
9809 | 5926
0261 | 1947
7188 4717
6624 | 9836
4055 | 9164
2636 4927
5926 | 1964
3144 | 8254
Program Anda "memotong" nya, bergerak dari kiri ke kanan. Anda mulai pada nomor apa pun di kolom paling kiri yang Anda suka. Dari sana, Anda dapat pindah ke karakter yang berdekatan di sebelah kanan. Jika Anda mulai di sudut kiri atas, 1, Anda bisa pergi ke 3 atau 8. Setiap nomor yang Anda tuju, termasuk nomor awal, ditambahkan ke jumlah. Spasi tidak menambah jumlah Anda. "|" memaksa Anda untuk bergerak ke atas atau ke bawah, bukan ke suatu tempat ke kanan. (Anda TIDAK BISA bergerak maju pada karakter ini) Tujuan Anda adalah untuk sampai ke sisi lain dengan jumlah sekecil mungkin. Program Anda harus mencetak jumlah di bagian akhir, dan itu harus dapat menyelesaikan jalan apa pun. Lebih disukai, bisa juga memiliki input untuk jalan, tetapi itu tidak diperlukan. Program Anda harus mencetak path dan jumlahnya. Byte kode yang paling sedikit menang.
Untuk memperjelas, Anda dapat memindahkan secara diagnosis kecuali jika Anda berada di bilah vertikal. Anda hanya dapat bergerak ke atas dan ke bawah saat berada di bilah vertikal.
Untuk spesifikasi jalan yang lebih jelas, ini pada dasarnya adalah serangkaian teks (atau array kolom atau baris, jika Anda lebih suka berpikir seperti itu) yang mengikuti aturan karakter, dan tidak mungkin ada apa-apa TAPI karakter-karakter tersebut di jalan. Bisa ada angka, spasi, baris ("|"), atau baris baru. Jika jalan diaspal oleh orang mabuk, seperti dalam jawaban ProgrammerDan, itu masih jalan yang valid, dan program Anda harus dapat menyelesaikan jalan tersebut. Itu tidak dianggap sebagai jalan jika tidak mungkin untuk pergi ke sisi lain (Misalnya, tidak ada jalan keluar dari garis lurus bar).
Program Anda tidak diharuskan untuk menentukan apakah jalan tidak valid.
Kunci:
Nomor apa saja - menambahkan nomor ke jumlah Anda, bergerak maju.
Spasi - Maju, tidak ada yang ditambahkan ke jumlah Anda.
"|" - Naik atau turun, tidak ada yang ditambahkan ke jumlah Anda.
EDIT: Contoh solusi, seperti yang disarankan. Saya tidak bisa membuat yang sangat besar, saya tidak bisa mendapatkan IDE untuk menyelesaikannya untuk saya ATM.
Ambil jalan kecil ini:
9191 | 8282
1919 | 2727
5555 5555
Solusinya akan menjadi jalur 1, 1, 1, 1, ruang, pembagi, pembagi, ruang, ruang, 2, 2, 2, 2 dengan total 12.
EDIT # 2: Solusi untuk jalan pertama pada pertanyaan ini, sebagaimana ditentukan oleh program Geobits dan masyarakat, adalah 0,2,0,1,,,, 1,4,1,4 dengan jumlah 13.
sumber
|
berturut-turut?0,2,0,1, , , ,1,4,1,4 -> 13
Jawaban:
Pyth,
168143141 byte [sekarang Drunken Road kompatibel]Test case saya berfungsi, tetapi karena kesalahpahaman di pihak saya, itu tidak akan berfungsi dengan baik dengan contoh awal. Saya sedang berusaha memperbaikinya.Sekarang bekerja untuk contoh asli dan jalan mabuk
Beberapa kode yang
BENAR-BENARkurang jelek:Uji di Sini
Saya mengujinya di jalan 10 + 9 x 40.
sumber
Java, 955 byte
Jelas tidak akan memenangkan penghargaan apa pun, menjadi Java dan semuanya, tapi saya suka masalah ini dan ingin memasukkan entri saya sendiri.
Fitur dan batas:
Ok, cukup jibba jabba. Versi golf:
Sesuai kebiasaan saya, github dengan kode tidak disunat .
Solusi untuk jalan "pertama":
Contoh kedua:
Sampel Brian Tuck:
"Mabuk" Contoh Brian:
Solusi divisualisasikan:
Nikmati!
Sunting: Sekarang saya hanya pamer (dua jalan raya bergabung! Bisakah dia berhasil?)
Larutan:
(bonus: jalur dari ungolfed):
Detail tentang Algoritma
Penjelasan lebih lengkap tentang teknik Pemrograman Dinamis yang saya gunakan diminta, jadi begini:
Saya menggunakan metode mark-and-precompute dari solusi. Itu memiliki nama yang tepat, tetapi saya sudah lama melupakannya; mungkin orang lain bisa menawarkannya?
Algoritma:
Catatan:
Itu dia. Kami memindai dari atas ke bawah, dari kanan ke kiri, satu kali; satu-satunya sel yang tersentuh (berpotensi) lebih dari satu kali adalah pipa, namun, setiap pipa hanya "terpecahkan" satu kali, membuat kita tetap berada dalam jendela O (m * n) kita.
Untuk menangani ukuran peta "ganjil", saya memilih untuk melakukan pra-pemindaian dan menormalkan panjang baris dengan menambahkan karakter nol. Karakter kosong dihitung sebagai "biaya nol" bergerak sama dengan pipa dan spasi. Kemudian, dalam mencetak solusinya, saya berhenti mencetak biaya atau bergerak ketika salah satu tepi jalan dinormalisasi tercapai, atau karakter nol tercapai.
Keindahan algoritma ini sangat sederhana, menerapkan aturan yang sama untuk setiap sel, menghasilkan solusi lengkap dengan menyelesaikan sub-masalah O (m * n), dan dalam hal kecepatan agak cepat. Itu menukar memori, membuat dua salinan dalam memori peta jalan secara efektif, yang pertama untuk menyimpan data "biaya terbaik" dan yang kedua untuk menyimpan data "bergerak terbaik" per sel; ini tipikal untuk pemrograman dinamis.
sumber
c
sebagai-1>>>1
.