Anda tinggal di dalam terminal yang lebar 80 karakter. Anda bosan, jadi Anda memutuskan untuk bermain kartu domino. Tidak, bukan jenis membosankan yang terlihat seperti Scrabble, jenis kesenangan di mana Anda menghabiskan waktu satu jam mengatur mereka untuk menonton mereka jatuh dalam sedetik.
Di terminal, domino terlihat seperti ini:
| upright domino
\ left-tilted domino
/ right-tilted domino
__ fallen domino
Seperti kita ketahui, jika domino miring menyentuh yang tegak, domino kedua juga dimiringkan. Satu-satunya pengecualian untuk ini adalah jika dua domino miring menyentuhnya:
|\ --> \\ /| --> // /|\ --> /|\
Sesuaikan konstanta gravitasi terminal Anda sehingga transisi ini membutuhkan 100 ms.
Jika domino miring dimiringkan oleh domino lain atau dinding terminal, perjalanannya berakhir.
Tidak ada domino miring di
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
(80 karakter) akan bergerak, karena dua kartu domino miring paling luar didukung oleh dinding terminal dan semua yang lain didukung oleh kartu domino lainnya.
Namun, jika ruang dalam arah miring kosong, domino jatuh:
| \\ --> |__\ // | --> /__|
Terminal. Konstanta gravitasi. Anda mengerti maksudnya ...
Akhirnya, ada angin sepoi-sepoi dari kiri, jadi domino miring kanan jatuh lebih cepat daripada yang miring kiri:
|/ \| --> |__\|
Tugas
Tulis program / fungsi yang menunjukkan animasi bermain domino di terminal.
Kode Anda harus melakukan hal berikut:
Baca string dari input, yang mewakili keadaan awal domino.
String ini akan berisi tidak lebih dari 80 karakter dan hanya terdiri dari domino yang dijelaskan di atas dan ruang kosong.
Cetak status dan tunggu 100 ms.
Ubah status seperti dijelaskan di atas.
Jika status berubah, kembali ke 2.
Aturan tambahan
Panjang string input tidak mempengaruhi lebar terminal; bahkan jika string lebih pendek dari 80 karakter, dinding terminal masih terpisah 80 karakter.
Setiap kali langkah 2 dijalankan, negara harus dicetak ke lokasi yang sama, menimpa negara sebelumnya.
Karena beberapa bahasa tidak mampu menunggu tepat 100 ms, jangan ragu untuk menunggu jumlah antara 50 dan 1000 ms.
Aturan standar kode-golf berlaku.
Contohnya
Untuk kondisi awal
||\/||
cetak yang berikut ini (satu di atas yang lain):
||\/|| |\\//| \\\/// __\\//__
Untuk kondisi awal
/||||\
cetak yang berikut ini
/||||\ //||\\ ///\\\
Untuk kondisi awal
/|||\
cetak yang berikut ini
/|||\ //|\\
Untuk kondisi awal
|/ \|/ \|/ \|/ \|
cetak yang berikut ini:
|__\|__\|__\|__\|
Untuk keadaan awal (80 karakter)
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
cetak yang berikut ini
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
/
atau/|
dan Anda akan melihat ubin tidak jatuh sepanjang jalan sebagaimana mestinya.\033
dengan byte ESC literal, menghemat 3 byte.Perl 5,
154146Harus menggunakan karakter sementara untuk mempertahankan negara antara 2 regex.
Untuk menghadapi risiko sesuatu seperti / | | | \ akan berakhir sebagai / / / \ \ daripada / / | \ \.
Uji
sumber
s, \\|/ ,__,g
bukans/ \\|\/ /__/g
.ES6 ,
220218195 byteDiperkecil
Lebih mudah dibaca
sumber
() = > {
dan}()
dapat dengan mudah dihapus dari kode Anda. 2. Saya tidak berpikir kotak peringatan adalah format output yang dapat diterima untuk animasi. Anda bisa menyematkan JS Anda dalam HTML atau membuat perubahan yang diperlukan sehingga akan bekerja dari baris perintah. 3. Dalam kedua kasus, kode Anda harus menunggu sekitar. 100 ms antara mencetak satu negara dan berikutnya.console.log("^[c"+d)
saja, di mana^[
karakter ESC (satu byte)..replace
ke[R='replace']
, lalu setiap yang berikutnya menjadi[R]
, ini akan mengurangi sedikit. Anda juga dapat menyimpan beberapa byte dengan menggunakansetTimeout(f,100,d)
tempat pengaturan saat ini.C #, 335 byte
Bukan pilihan bahasa yang bagus.
Saya menyalahgunakan penundaan yang diizinkan antara 50 dan 1000 untuk memilih nomor dua digit.
Baris dan lekukan baru ditambahkan untuk kejelasan:
sumber
PHP, 175 byte
Tidak dicincang:
Pada dasarnya golf regex. Pertama ratakan setiap domino yang jatuh yang memiliki ruang (dan karena urutan yang cocok dari kiri ke kanan, "angin" berhembus). Lalu datanglah bagian yang jelek (kutukan kamu tebas!)
/|\
, lalu lewati.(/)|
dan ganti dengan//
|(\)
dan ganti dengan\\
Ini membuat domino jatuh. Akhirnya, tunggu saja 100 ms untuk langkah selanjutnya.
Menggunakan
()
sebagai pembatas pada regex berarti/
s tidak perlu melarikan diri, yang membantu minimal!sumber
POSIX shell + sed, 144
Ini ada dua bagian. Pekerjaan utama menggulingkan domino adalah
sed
penggantian pola standar , mengumpulkan garis ke ruang penahanan. Kami sementara berubah/|\
menjadi/:\
untuk melindunginya, pulih pada akhirnya.Karena
sed
tidak ada cara memasukkan penundaan (saya melihat ke terminfo / termcap, tetapi tidak dapat menemukan cara standar), saya membungkus setiap barisprintf "...\r"; sleep .1
untuk mencetak baris setiap 100ms. Saya benar-benar melakukan ini terlebih dahulu, ketika kita hanya memiliki satu baris, karena karakter dalam perintah tidak akan tersentuh oleh salah satu pengganti dari menjatuhkan.Semua diuji menggunakan
dash
dan GNUcoreutils
, denganPOSIXLY_CORRECT
pengaturan di lingkungan.sumber