Saya pernah mengalami permainan (mini) ini di mana Anda memiliki 4 atau lebih pipa vertikal yang dihubungkan oleh sejumlah pipa horisontal dan Anda harus menjatuhkan bola atau air ke dalam pipa vertikal.
Ada 2 jenis yang saya ketahui:
- Masukkan benda ke dalam ember / keranjang di bawah salah satu pintu keluar (tebak pipa yang akan dilemparkan)
- Tebak pipa dari mana objek itu berasal.
Pipa sampel:
| | |-------|
|-------| |-------|
| |-------| |
|-------|-------|-------|
| |-------| |
|-------| |-------|
|-------| |-------|
| |-------| |
Aturan dasar:
- Saat bergerak melalui pipa horizontal objek akan turun jika memungkinkan
- Saat bergerak melalui pipa vertikal, objek akan berubah menjadi pipa horizontal jika memungkinkan.
Pekerjaan Anda
- Tulis program yang akan membuat kisi-kisi pipa acak (lihat contoh pipa).
- Harus ada setidaknya 4 pipa vertikal dan cukup banyak pipa horizontal setidaknya 10.
- Panjang pipa vertikal terserah Anda.
- Perlihatkan jalur yang diperlukan objek untuk mencapai bagian bawah dan tunjukkan berapa banyak belokan yang diperlukan untuk sampai ke sana.
- (Opsional) input untuk menentukan titik awal, pipa bernomor 1..N dari kiri ke kanan.
Tampilan:
| vertical pipe
- horizontal pipe
: vertical pipe used by the object
= horizontal pipe used by the object
V Object starting point
^ Object ending point
Contoh:
V
: | |-------|
:=======: |-------|
| :=======: |
|-----!-:=======: |
| :=======:-------|
|-------| :=======:
|-------| :=======:
| :=======: |
^
14 turns were taken to get to the end.
Detail
Objek memasuki pipa 1 dan mulai bergerak ke bawah, ke kiri ke pipa horizontal pertama.
Kembali ke bawah dan ke pipa kedua diikuti oleh putar-U ke pipa ketiga.
Pada akhir pipa ketiga Anda melihat tanda seru,
seharusnya tidak ada dalam hasil Anda, tetapi saya menggunakan ini untuk menunjukkan kepada Anda objek itu bisa lurus ke depan.
Namun aturan nomor 1 mencegah itu.
Pemenang akan ditentukan oleh suara dalam 3 minggu dari sekarang 24-02-2014 (dd-mm).
Selamat coding ^. ^
popularity-contest
Teun Pronk
sumber
sumber
Jawaban:
Mathematica
Kode 2D menghasilkan grafik yang menunjukkan jalur air. Saya menampilkan nomor vertex untuk pemeriksaan silang yang nyaman dengan tampilan 3D. Biasanya angka titik akan disembunyikan.
Memasukkan:
Sebenarnya, hasilnya berisi banyak objek. Objek pertama
result[[1]]
,, adalah grafik 2D yang ditunjukkan di sini.Pipa 3 dimensi
Tube
(garis 3D) diplot dalam 3 ruang. Koordinat dihitung berdasarkan simpul dari grafik 2D sepanjang koordinat ke-3 yang dihasilkan secara acak (Hal ini memungkinkan pipa untuk mengambil posisi yang berbeda sepanjang y setiap kali kode dijalankan.)Sumbu ditampilkan untuk membantu pembaca meyakinkan dirinya sendiri bahwa rendering 3D memang didasarkan pada rendering 2D.
Input 3D yang menarik di sini adalah:
Angka atau baris, kolom dan kolom entri diambil dari kode 2D. Mereka tidak harus dimasukkan kembali.
Kode 2D
Dalam beberapa hari mendatang saya akan mendokumentasikan dan merapikan kode untuk 2D dan 3D.
Kode 3D dan hasilnya
sumber
C #
(via LINQPad, dalam mode "C # Program";)
Akan harus menerapkan Equitable Stroke Control, sejauh mungkin bermain golf, tapi ini adalah pendekatan saya di C # (well, LINQPad, tapi siapa yang mau semua boilerplate yang digunakan untuk membuat aplikasi C # berfungsi?) .
Definisi grid adalah variabel, dengan sejumlah pipa vertikal dan tinggi struktur keseluruhan, dan diulang-acak dengan melewatkan benih (lihat
PipeGrid
konstruktor).Dengan tidak adanya jawaban pasti tentang ke arah mana objek akan mengalir jika salah satu arah itu mungkin, saya telah memungkinkan Anda untuk menentukan perilaku dari sejumlah opsi (lihat
SolveBehavior
enumerasi /PipeSolver
konstruktor).Mulai vertikal dapat ditentukan (lihat
PipeSolver.Solve
).Saya berasumsi bahwa pipa horizontal selalu berada di antara dua pipa vertikal yang berdekatan , yaitu tidak ada pipa horisontal yang dapat memotong pipa horizontal.
Memperbarui:
Khawatir output teks lama saya mungkin sedikit membosankan untuk konteks popularitas ini, saya menawarkan versi yang diperpanjang yang juga menggambarkan jalur yang diambil sebagai gambar. Saya telah memodelkannya sebagai mobil, mengemudi melalui jaringan jalan yang mengerikan, mencoba untuk sampai ke bawah, tetapi dengan GPS terburuk di dunia yang memaksa Anda berbelok di setiap persimpangan.
Sebagai bonus, ini juga membuatnya lebih jelas untuk melihat 'belokan'.
Nikmati - vroom vroom !!
Contoh hasil:
(vertikal: 10, tinggi: 10, benih acak: 5, mulai pipa: 2, selesaikan perilaku: FlipFlop})
sumber
C #
Waktu yang menyenangkan! :-)
Kode ini memastikan setidaknya ada beberapa pipa lurus di kedua ujung setiap pipa. Ini juga memastikan tidak ada belokan ambigu.
Keluaran:
sumber
Funciton
Seolah-olah Funciton belum menjadi salah satu bahasa yang paling tidak berguna di dunia, ini jelas merupakan program yang paling tidak berguna yang saya tulis sejauh ini.
Karena ini terlihat jelek di StackExchange karena spasi baris tambahan, pertimbangkan untuk menjalankan yang berikut di konsol JavaScript browser Anda untuk memperbaikinya:
Karena Funciton tidak memiliki generator angka acak, saya memutuskan untuk membiarkan Anda memasuki pola pipa. Karena pengkodean pola tidak jelas, membenturkan tombol angka pada keyboard Anda secara acak sama baiknya dengan generator angka acak.
Input diharapkan menjadi tiga angka desimal yang dipisahkan oleh spasi. Angka pertama adalah lebarnya (satu lebih sedikit dari jumlah pipa vertikal); yang kedua adalah indeks pipa awal, dan yang terakhir adalah angka yang mengkodekan pola pipa horizontal; Anda dapat membuatnya sebesar yang Anda inginkan. Jika lebarnya negatif atau indeks pipa di luar jangkauan, hasilnya adalah
Impossiburu.
Program ini secara otomatis memastikan bahwa tidak ada dua pipa horisontal yang bersebelahan, yang dapat menyebabkan belokan yang ambigu.
Penjelasan
Program utama menemukan dua spasi pertama dan membagi angka. Ini menjalankan ketiga (pola pipa) melalui
░
dan kemudian memanggil▒
dengan hasilnya, yang mengembalikan output serta jumlah putaran yang diambil. Itu kemudian menambahkan teksn turns were taken to get to the end.
, di manan
jumlah putaran dihitung oleh▒
.░
mengambil nomor dan memasukkan0
-bit setelah setiap1
-bit, sehingga memastikan tidak ada dua pipa horizontal berturut-turut.▒
menghasilkan output dengan memanggil secara berurutan▓
dan kemudian menggeser jumlah bit yang tepat dari pola pipa sampai nol. Ini juga menambah atau mengurangi “pipa saat ini” dengan tepat.▓
menghasilkan satu baris output. Dalam setiap iterasi, ia menggeser keluar satu bit dari pola pipa dan kemudian memutuskan apakah akan menghasilkan│
(+ 4 spasi),║
(+ 4 spasi)├────┤
,,╔════╝
atau╚════╗
; dalam tiga kasus terakhir, ia menghilangkan karakter pertama dari iterasi berikutnya. Iterasi terakhir menghasilkan│\r\n
atau║\r\n
sesuai kebutuhan.Contoh output
Memasukkan:
Keluaran:
Memasukkan:
Keluaran:
Memasukkan:
Keluaran:
sumber
Groovy, 311
Ini diformat:
Output dari sampel:
Output lainnya:
(Saya tahu saya melakukan kode-golf bukan popularitas, tapi itu hanya gaya saya)
sumber
JavaScript
Kanvas HTML mendengarkan acara klik dan menemukan deretan pipa terdekat dan menggunakannya untuk titik awal. Keluaran diambil pada kanvas dan ada juga textarea yang berisi keluaran ASCII yang didefinisikan oleh OP.
Algoritma akan memastikan bahwa tidak ada dua yang menghubungkan pipa horisontal. Selain pembatasan itu, probabilitas didefinisikan dalam variabel awal dan yang digunakan untuk menentukan secara acak apakah pipa horizontal harus terjadi atau tidak.
JSFIDDLE
Keluaran
sumber