Berkat pertanyaan ini untuk inspirasi
Dalam tantangan ini kami akan mewakili garis domino sebagai string |
, /
dan \
. Anda akan diberikan serangkaian kartu domino sebagai input dan Anda harus menentukan seperti apa bentuknya ketika sudah selesai. Berikut adalah aturan bagaimana domino jatuh
Domino berdiri
|
, kiri dari domino jatuh kiri\
, juga akan menjadi domino jatuh kiri.Domino berdiri
|
,, hak domino jatuh kanan/
, juga akan menjadi domino jatuh kanan.Jika domino berdiri berada di antara jatuh kiri
\
dan/
domino jatuh kanan , itu akan tetap berdiri.
Aturan-aturan ini diterapkan berulang kali hingga pengaturannya tidak lagi berubah.
Berikut adalah contoh bagaimana satu input mungkin sampai pada kesimpulannya
|||||||\/|||||||\||\|||/||||||\|||||
||||||\\//|||||\\|\\|||//||||\\|||||
|||||\\\///|||\\\\\\|||///||\\\|||||
||||\\\\////|\\\\\\\|||////\\\\|||||
|||\\\\\////|\\\\\\\|||////\\\\|||||
||\\\\\\////|\\\\\\\|||////\\\\|||||
|\\\\\\\////|\\\\\\\|||////\\\\|||||
\\\\\\\\////|\\\\\\\|||////\\\\|||||
Tugas Anda adalah menulis kode yang menemukan dan mengeluarkan hasil akhir dari suatu input. Anda dapat mengasumsikan bahwa input selalu valid dan mengandung setidaknya 2 karakter.
Ini adalah kode-golf sehingga jawaban akan dicetak dalam byte dengan lebih sedikit byte yang lebih baik.
Uji kasus
|||/|||| -> |||/////
|||\|||| -> \\\\||||
|/||||\| -> |///\\\|
||/|||\| -> ||//|\\|
||\|||/| -> \\\|||//
sumber
Jawaban:
Retina , 32 byte
Cobalah online!
Penjelasan
The
+
memberitahu Retina untuk menjalankan penggantian dalam satu lingkaran sampai gagal mengubah string. Setiap penggantian menghitung satu langkah domino yang jatuh. Penggantian itu sendiri sebenarnya adalah tiga penggantian dalam satu, tetapi ini memastikan bahwa mereka terjadi secara bersamaan:Hanya pertandingan ini
/|\
(serta/\\
dan/\\
, tetapi mereka tidak peduli) dan reinserts itu tidak berubah. Tujuan dari ini adalah untuk melompati|
dengan domino yang jatuh di kedua sisi, karena ini lebih pendek daripada mengesampingkan kasus-kasus dengan lookaround terpisah dalam dua kasus lainnya.Ini cocok
/|
dan mengubahnya menjadi//
.Ini cocok
|\
dan mengubahnya menjadi\\
.sumber
$1$2$2$3$3
untuk mengalahkan bahasa-bahasa golf.Python 2 ,
1151141111089895 byte-1 byte berkat ovs
Cobalah online!
sumber
b=0;
dan mengganti kemunculanb
olehid
untuk menghemat dua byte!V , 23 byte
Cobalah online!
Sungguh, ini sangat mirip dengan jawaban retina, hanya saja tampilannya lebih jelek. Menggunakan kompresi regex.
Hexdump:
Penjelasan:
ò
memberitahu V untuk menjalankan sampai string tidak berubah. Sisanya adalah regex terkompresi. Mari kita mengonversinya menjadi setara dengan vim ...sumber
SNOBOL4 (CSNOBOL4) ,
117115112111 byteCobalah online!
Kredit untuk jawaban python Rod untuk ide untuk kondisi berhenti dengan variabel kedua untuk melihat perubahan daripada pengujian
D '/|' | '|\'
.sumber
Haskell ,
114107 byteCobalah online! Baris pertama mendefinisikan fungsi anonim.
Penjelasan:
until=<<((==)=<<)$g
adalah fungsi titik perbaikan (lihat di sini untuk penjelasan) yang menerapkan fungsig
ke string input hingga hasilnya tidak lagi berubah.zip3('|':s)s(tail s++"|")
menciptakan untuk setiap domino, yaitu karakter dalam strings
, triple dengan domino pra dan sukses, padding dengan|
di tepi. Misalnya/\|
menjadi[(|,/,\),(/,\,|),(\,|,|)]
(mengabaikan melarikan diri).t
diterapkan ke masing-masing tiga kali lipat untuk menghitung posisi baru bagian tengah rangkap tiga.sumber
Perl 5 , 39 + 1 (
-p
) = 40 byteCobalah online!
sumber
Prolog (SWI) , 132 byte
Cobalah online!
Program ini mendefinisikan predikat
+/2
yang benar jika argumen kedua adalah versi menetap dari yang pertama. Kedua argumen adalah daftar kode karakter.Penjelasan
Solusi ini menggunakan DCG untuk mencari tahu apa langkah selanjutnya dan kemudian berulang kali menghitung langkah berikutnya sampai langkah selanjutnya sama dengan langkah saat ini.
DCG
Kelima baris kode ini mendefinisikan aturan DCG (Definite Clause Grammar)
+
yang digunakan dalam program untuk menghitung satu langkah pengguluhan domino. DCG dalam Prolog bekerja dengan menemukan kasus pertama dari aturan yang sisi kanannya cocok dengan string dan menentukan argumen aturan di sisi kiri melalui proses itu. Jika suatu kasus gagal untuk mencocokkan maka ia akan mundur dan mencoba kasus berikutnya.Baris ini mewakili kasus dasar
+
aturan. Ini hanya menyatakan bahwa jika tidak ada domino saat ini maka pada langkah berikutnya masih akan ada domino.Sejak program ini berurusan secara eksklusif dengan daftar kode karakter penting untuk dicatat bahwa kode karakter untuk
/
,\
, dan|
adalah 47, 92, dan 124 masing-masing. Kasus+
aturan ini menangani/|\
string.Kasing ini menangani kartu domino yang jatuh tepat di atas kartu domino. Karena itu datang setelah kasus untuk penanganan
/|\
itu tidak akan digunakan untuk kemungkinan itu.Menangani kasing untuk domino jatuh yang jatuh yang menabrak domino di sebelah kiri itu.
Ini adalah kasus wildcard. Karena tidak ada yang berubah selain apa yang dijelaskan di atas, selama ada teks yang tersisa di string input, maka hanya akan menyalinnya ke output selama tidak cocok dengan kasus-kasus di atas.
Predikatnya
Predikat utama mengambil dua argumen, yang pertama adalah pengaturan domino awal, yang kedua adalah domino menetap. Karena ini adalah Prolog yang kedua dapat ditentukan dan program akan menghitungnya. Predikat di dalam dan dari dirinya sendiri adalah
+(N,X,[])
panggilan yang cukup sederhana DCG dan menghitung langkah selanjutnya dari domino yang menyimpannyaN
.(X=N,Y=N;N+Y)
memeriksa apakah langkah berikutnya dari kartu domino adalah sama dengan arus dan jika disetY
untuk itu karena kartu domino pasti telah menetap dan jika tidak berulang, panggil predikat yang sama dengan langkah selanjutnya dari kartu dominoN
alih-alihX
.sumber
APL (Dyalog) , 36 byte
Cobalah online!
-3 Sebagian berkat Sapi Quack .
Terasa sangat tak terserang ... :(
sumber
wajah , 166 byte
Mengambil input sebagai argumen baris perintah dan output ke STDOUT. Ini hanya berfungsi di commit 86494f6 dan seterusnya karena perbaikan bug di komit itu.
Dibungkus untuk estetika:
Dan ungolfed / berkomentar:
Ada beberapa trik halus di sini yang mengurangi beberapa byte tambahan, seperti
penamaan variabel | dan /, yang nilai ASCII-nya diakses melalui introspeksi kemudian dalam kode
yang
'|
pada baris pertama dari loop utama, yang disebut sana bukannya pada baris kedua untuk mengatur | pointer untuk digunakan di bagian kedua dari loop utamasumber
Perl 5 , 52 + 1 (-p) = 53 byte
-6 byte terima kasih kepada mik
Mungkin bukan yang terbaik untuk Perl, tapi itulah yang bisa saya lakukan.
Penjelasan
Cobalah online!
sumber
-p
bukannya-a
menghilangkan kebutuhan untukprint;
; menggunakanwhile
sebagai akhiran ke ekspresi dummy (mis.0
) akan menghemat 2 byte lagiPerl 5 , 44 (kode) + 1 (
-p
) = 45 byteCobalah online!
Penjelasan
sumber
Bersihkan , 98 byte
Cobalah online!
sumber
Ruby , 83 byte
Secara teknis curang dengan
9.times
, atau bahkan hanya999.times
tetapi saya tidak merasa seperti murah :)Masih memiliki potensi bermain golf yang sangat besar. (Catatan:
y while undone
jauh lebih lama darix.size.times
)Cobalah online!
sumber
R , 114 byte
Cobalah online!
Mengembalikan string yang lolos.
sumber
C (gcc) , 183 byte
Cobalah online!
sumber