Buku Pilih Petualangan Anda Sendiri adalah bentuk literatur interaktif di mana pembaca harus membuat keputusan yang mempengaruhi hasil cerita. Pada titik-titik tertentu dalam cerita, pembaca memiliki banyak pilihan yang dapat dipilih, masing-masing mengirimkan pembaca ke halaman berbeda di buku.
Misalnya, dalam pengaturan fantasi, seseorang mungkin harus memutuskan di halaman 14 apakah akan menjelajah ke gua misterius dengan "melompat" ke halaman 22, atau menjelajahi hutan terdekat dengan melompat ke halaman 8. "Lompatan" ini dapat diekspresikan sebagai pasangan nomor halaman, seperti:
14 22
14 8
Dalam kebanyakan kasus, ada banyak akhir cerita tetapi hanya beberapa yang bagus. Tujuannya adalah menavigasi cerita untuk mencapai akhir yang baik.
Tugas:
Diberikan daftar "lompatan" untuk buku yang diberikan, tugas Anda adalah menentukan rute yang akan mengarah ke akhir yang spesifik. Karena ini cukup mudah, tantangan sebenarnya adalah melakukannya dalam karakter sesedikit mungkin.
Ini kode golf .
Input sampel (di mana 1 adalah awal dan 100 adalah tujuannya):
1 10
10 5
10 13
5 12
5 19
13 15
12 20
15 100
Output sampel:
1 10 13 15 100
Input sampel:
15 2
1 4
2 12
1 9
3 1
1 15
9 3
12 64
4 10
2 6
80 100
5 10
6 24
12 80
6 150
120 9
150 120
Output sampel:
1 15 2 12 80 100
Catatan:
- Daftar lompatan akan dimasukkan oleh pengguna, baik dari file atau stdin. Anda dapat memilih mana yang paling nyaman.
- Input akan berisi 1 lompatan per baris, dengan asal dan tujuan dipisahkan oleh satu spasi.
- Garis-garis dalam input tidak dijamin dalam urutan tertentu.
- Jalur yang berhasil akan dimulai pada halaman 1 dan berakhir pada halaman 100.
- Anda dapat mengasumsikan setidaknya ada 1 jalur ke tujuan. Anda tidak perlu menemukan semua jalan, Anda juga tidak perlu menemukan yang terpendek. Temukan setidaknya satu saja.
- Nomor halaman terkecil adalah 1. Tidak ada batasan untuk nomor halaman terbesar. (Anda dapat berasumsi bahwa itu akan sesuai dengan kisaran int.)
- Loop mungkin ada. Misalnya, daftar mungkin melompat dari halaman 5 ke 10, 10 ke 19, dan 19 ke 5.
- Mungkin ada jalan buntu. Artinya, halaman tujuan mungkin tidak memiliki tempat untuk melompat.
- Sebaliknya, mungkin ada halaman yang tidak terjangkau. Artinya, halaman asal mungkin bukan tujuan lompatan apa pun.
- Tidak semua nomor halaman antara 1 dan 100 dijamin untuk digunakan.
- Output Anda harus terdiri dari rute yang valid dari nomor halaman, dimulai dengan 1 dan berakhir pada 100, dipisahkan oleh spasi.
Ingat, ini kode golf, jadi solusi terpendek menang!
EDIT: Menambahkan sampel lain untuk pengujian.
sumber
Jawaban:
Golfscript,
5857 karakterPeringatan : ini sangat tidak efisien. Ini bekerja dengan berulang kali mengkuadratkan adjacency matrix dan kemudian mencari rute; jika ada
E
tepi pada grafik maka akan menemukan setiap jalur dengan panjang hingga 2 E (dan yang lebih pendek akan menemukan banyak kali). Ini akan memberi Anda hasil untuk test case pertama dalam waktu yang wajar, tetapi jika Anda ingin mencoba yang kedua pastikan Anda memiliki beberapa gigs memori gratis dan berjalan jauh.Jika Anda menginginkan solusi yang cukup efisien maka saya menawarkan 67 karakter:
sumber
cat input | ruby1.9 golfscript.rb peter.gs
dan semua yang terjadi adalah MacBook saya menjadi sangat panas. Bagaimana saya menjalankannya?Python,
232213157143135132 karakter (jalur terpendek)Implementasi ini dapat menangani semua kasus tepi yang dijelaskan (loop, jalan buntu, halaman yatim, dll.) Dan menjamin bahwa itu akan menemukan rute terpendek ke akhir. Ini didasarkan pada algoritma jalur terpendek Djikstra.
sumber
Javascript: 189 Karakter
Ini adalah solusi rekursif yang menemukan jalur terpendek melalui petualangan.
Kode-Golf:
Untuk menguji ( PERINGATAN: infinite loop untuk input yang buruk! ):
Salin salah satu dari string input berikut (atau gunakan format serupa untuk memilih sendiri, pilih petualangan Anda sendiri):
1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
Rekatkan itu ke dalam prompt tes biola .
Kode yang diformat dan Dikomentari:
Untuk menguji ( PERINGATAN: infinite loop untuk input yang buruk! ):
Salin salah satu dari string input berikut (atau gunakan format serupa untuk memilih sendiri, pilih petualangan Anda sendiri):
1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
Rekatkan itu ke dalam prompt tes biola .
sumber
var
kata kunci memiliki cakupan global :)Ruby 1.9, 98
Tidak Disatukan:
sumber
Perl, 88 karakter
pada dasarnya versi entri Clueless 'yang dipercepat; pra-pertandingan dan pasca-pertandingan itu menyenangkan :)
sumber
Python -
239237236Sayangnya, solusi ekor-rekursif ini rentan terhadap loop dalam "cerita" ...
Penggunaan : cat ./test0 | ./sol.py Output untuk test case 1:
Output untuk test case 2:
sumber
Scala 2.9,
260256254252248247241239234227225212205 karakterTidak Disatukan:
Pemakaian:
Kompilasi dengan
scalac filename
dan jalankan denganscala C
. Input diambil melaluiSTDIN
.Untuk berjalan di ideone.com, perubahan
object C extends App
untukobject Main extends Application
menjalankannya sebagai Scala 2.8.sumber
PHP,
166146138 karakterTidak Disatukan:
Penggunaan:
sumber
STDIN
bukan sebagai argumen.Saya akan menempatkan mereka semua ke dalam array 2d dan mencari semua item dengan banyak loop, jika mereka dapat mencapai item terakhir maka saya akan mengumpulkan item terkait agar menjadi array hasil yang lain, dan dari hasil saya akan memilih array mana yang lebih kecil .
EDIT => JAVA: Saya juga menggunakan fungsi rekursif, kode lengkap di bawah ini;
sumber