Lingkaran Maze Checker

12

Anda tahu mainan kayu dengan bantalan bola kecil di mana tujuannya adalah untuk bergerak di sekitar labirin? Ini agak seperti itu. Diberi labirin dan serangkaian gerakan, tentukan di mana bola berakhir.

Papan dipegang secara vertikal, dan bola hanya bergerak karena gravitasi ketika papan diputar. Setiap "bergerak" adalah rotasi (dalam radian).

Labirin hanyalah dinding bundar konsentris, dengan masing-masing dinding memiliki tepat satu bukaan ke koridor luar, mirip dengan ini (anggaplah dinding itu lingkaran dan tidak runcing):

labirin

Seperti yang Anda lihat, bola dimulai di tengah dan berusaha keluar. Bola akan langsung jatuh begitu orientasi yang benar tercapai, bahkan jika itu tengah melalui rotasi. Rotasi tunggal dapat menyebabkan bola jatuh melalui beberapa bukaan. Misalnya, rotasi >= n * 2 * picukup untuk menghindari labirin apa pun.

Untuk tujuan permainan, bola yang terletak di dalam 0.001radian pembukaan dianggap "pas", dan akan jatuh ke koridor berikutnya.

Memasukkan:

Input ada dalam dua bagian:

  • Labirin diberikan oleh bilangan bulat yang nmewakili berapa banyak dinding / lubang di labirin. Ini diikuti oleh ngaris-garis, dengan satu angka pada masing-masing, yang mewakili di mana lorong ke koridor berikutnya.

  • Bergerak diberikan sebagai bilangan bulat yang mmewakili berapa banyak gerakan yang diambil, diikuti (lagi pada garis terpisah) dengan mrotasi searah jarum jam dari papan dalam radian (negatif berlawanan arah jarum jam).

Semua posisi bagian diberikan sebagai 0 rad = up, dengan radian positif akan searah jarum jam.

Untuk contoh gambar di atas, input mungkin terlihat seperti ini:

7                        // 7 openings
0
0.785398163
3.14159265
1.74532925
4.71238898
4.01425728
0
3                        // 3 moves
-3.92699082
3.14159265
0.81245687

Keluaran: Keluarkan nomor koridor tempat bola berakhir. Koridor diindeks nol, mulai dari tengah, jadi Anda mulai masuk 0. Jika Anda melewati satu lubang, Anda berada di koridor 1. Jika Anda keluar dari seluruh labirin, keluarkan bilangan bulat apa pun>= n

Untuk input sampel, ada tiga gerakan. Yang pertama akan menyebabkan bola jatuh melalui dua lubang. Yang kedua tidak menemukan pembukaan, dan penemuan ketiga satu . Bola sekarang berada di koridor 3, jadi output yang diharapkan adalah:

3

Perilaku tidak ditentukan untuk input yang tidak valid. Input yang valid terbentuk dengan baik, dengan n >= 1dan m >= 0.

Penilaian adalah golf kode standar, jumlah byte terkecil yang menang. Celah standar dilarang. Input tidak boleh berupa hard-coded, tetapi dapat diambil dari input standar, argumen, konsol, dll. Keluaran dapat berupa konsol, file, apa pun, buat saja outputnya terlihat di suatu tempat.

Geobit
sumber
"Perilaku tidak ditentukan untuk input yang tidak valid." << - Ini harus dimasukkan ke dalam semua teka-teki!
TheDoctor
Dalam kasus hipotetis itu, Anda juga bisa menghitung π kapan pun diperlukan dengan akurasi variabel, meningkatkan akurasi hingga cukup untuk mengetahui apakah bola jatuh atau tidak. Masalah yang saya miliki dengan toleransi untuk fit (atau setidaknya kata-katanya saat ini) adalah jika A) berturut-turut lebih dekat dari 0,001 satu sama lain sehingga bola hanya jatuh dua level jika toleransi diperhitungkan B) ketika bola berada dalam 0,001 lubang, ia melompat ke lubang (jika Anda benar-benar ingin membaca sesuatu di dalam kata-katanya).
Wrzlprmft
@Wrzlprmft Bola tidak melompat ke lubang. Pikirkan ambang sebagai artinya bahwa lubang sedikit lebih lebar dari bola. Masih jatuh ke lokasi yang sama, hanya satu tingkat lebih jauh. Jika Anda membayangkan ambangnya 1, Anda hanya akan bekerja dengan lubang besar, bukan melompat bola ke tengah lubang saat jatuh.
Geobits
Mengapa input dalam format yang tidak nyaman seperti ini? Saya cukup yakin saya telah bermain golf seluruh program lebih pendek dari apa yang saya butuhkan untuk membacanya: /
Tal

Jawaban:

2

Perl, 211 191

Dengan baris baru dan lekukan agar mudah dibaca:

$p=atan2 0,-1;
@n=map~~<>,1..<>;
<>;
while(<>){
    $_=atan2(sin,cos)for@n;
    $y=abs($n[$-]+$_)<$p-.001
        ?$_
        :($_<=>0)*$p-$n[$-];
    $_+=$y for@n;
    $p-.001<abs$n[$-]&&++$-==@n&&last;
    $_-=$y;
    .001<abs&&redo
}
print$-

Jumlah gerakan dalam input dibuang, stdin eof mengindikasikan akhir gerakan.

pengguna2846289
sumber
5

JavaScript 200

function f(i){with(Math)for(m=i.split('\n'),o=m.slice(1,t=+m[0]+1),m=m.slice(t+1),c=PI,p=2*c,r=0,s=1e-3;m.length;c%=p)abs(c-o[r])<s?r++:abs(t=m[0])<s?m.shift(c+=t):(b=t<0?-s:s,c+=p-b,m[0]-=b);return r}

EDIT : Ini adalah contoh animasi yang membuktikan bahwa pemecah ini bekerja: http://jsfiddle.net/F74AP/4/

animasi

Fungsi harus dipanggil lewat string input.
Ini adalah contoh yang diberikan oleh OP:

f("7\n0\n0.785398163\n3.14159265\n1.74532925\n4.71238898\n4.01425728\n0\n3\n-3.92699082\n3.14159265\n0.81245687");

Ia mengembalikan 3sebagaimana dimaksud.

Michael M.
sumber
2
Dari tantangan, "... input tidak boleh dikodekan ..." . Kecuali saya salah, itu artinya Anda harus membacanya, dan Anda juga harus memiliki program yang lengkap. Ini sepertinya hanya fungsi.
Rainbolt
2
Saya tidak mengerti, nilainya tidak tersandi kode! "... Input tidak boleh berupa hard-coded, tetapi dapat diambil dari input standar, argumen, konsol, dll .". Mengenai program yang lengkap , saya tidak melihat di mana ia ditentukan dan lagi pula, IMO ini adalah solusi JS lengkap.
Michael M.
Saya tidak menentukan program lengkap, jadi saya tidak melihat masalah dengan fungsi saja. Namun, masukan yang ditetapkan sebagai dipisahkan oleh baris baru, belum diatur dalam array asli. Itu harus sederhana untuk memuaskan.
Geobits
1
@ Geobits, saya akan memodifikasinya nanti, lihat biola ini: jsfiddle.net/F74AP/1
Michael M.
1
@ Geobits, benar! Kesalahan tanda sederhana ... Tetap ;-)
Michael M.