pengantar
Saya punya kamar yang penuh cermin ajaib . Mereka adalah artefak misterius yang dapat menduplikasi item apa pun, kecuali cermin ajaib lainnya. Secara lebih eksplisit, versi duplikat item akan muncul di sisi lain dari cermin, pada jarak yang sama. Namun, jika ada cermin ajaib lain di jalan di kedua sisi, antara cermin duplikat dan item (asli atau duplikat), duplikat tidak terbentuk. Item asli dapat berupa kiri atau kanan cermin, dan duplikat akan muncul di sisi lain. Juga, item duplikat itu sendiri dapat diduplikasi oleh mirror lain. Item tidak pernah memblokir duplikasi item lain (kecuali dengan langsung pada posisi calon duplikat).
Memasukkan
Input Anda adalah string yang terdiri dari karakter .#|
, yang mewakili ruang kosong, item, dan cermin ajaib. Akan selalu ada setidaknya satu cermin ajaib di input.
Keluaran
Output Anda akan menjadi string lain di mana setiap cermin ajaib telah menggandakan setiap item yang bisa, sesuai dengan aturan di atas. Anda dapat mengasumsikan bahwa akan selalu ada ruang kosong di tempat di mana item duplikat muncul (sehingga mereka tidak akan keluar batas).
Contohnya
Pertimbangkan string input
.#.|.....|......#
A B C D
di mana kami telah menandai beberapa posisi untuk kejelasan. Cermin B
duplikat item A
, yang berakhir di sebelah kanan:
.#.|.#...|......#
A B C D
Mirror C
lalu menggandakan item baru:
.#.|.#...|...#..#
A B C D
Mirror C
tidak dapat menduplikasi item A
, karena mirror B
menghalangi. Itu juga tidak dapat menduplikasi item D
, karena mirror B
ada di sisi lain. Demikian juga, mirror B
tidak dapat menduplikasi item D
atau duplikat di sebelahnya, karena mirror C
menghalangi, jadi ini adalah output yang benar.
Sebagai contoh lain, pertimbangkan inputnya
.##..#...|#..##...|..##....#.
AB C DE FG H IJ K
Cermin D
dapat menggandakan A
dan B
ke kanan, dan E
dan G
ke kiri.
C
dan F
sudah merupakan duplikat satu sama lain. Tali itu menjadi
.##.##..#|#..##.##|..##....#.
AB C DE FG H IJ K
Cermin H
dapat menggandakan E
,, F
dan duplikat dari A
dan B
ke kanan, dan I
ke kiri.
G
dan J
sudah duplikat satu sama lain, dan mirror D
di jalan K
. Sekarang kita punya
.##.##..#|#..#####|#####..##.
AB C DE FG H IJ K
Akhirnya, mirror D
dapat menggandakan duplikat dari I
ke kiri. Kita berakhir dengan
.#####..#|#..#####|#####..##.
AB C DE FG H IJ K
Aturan dan penilaian
Anda dapat menulis program lengkap atau fungsi. Hitungan byte terendah menang. Kiriman yang tidak menggunakan mesin regex bersaing secara terpisah dari yang melakukannya, dan dapat ditandai dengan (tidak ada regex) .
Uji kasus
"|" -> "|"
"..|.." -> "..|.."
".#.|..." -> ".#.|.#."
"..#|.#." -> ".##|##."
".#..|....|.." -> ".#..|..#.|.#"
".|..|.#....." -> "#|#.|.#....."
"...|.#...|....#" -> ".##|##...|...##"
"......#|......." -> "......#|#......"
".#.|.....|......#" -> ".#.|.#...|...#..#"
".......|...#.##|...." -> "##.#...|...#.##|##.#"
"...#..||.......#..#...#" -> "...#..||.......#..#...#"
".##|.#....||#||......#|.#" -> ".##|##....||#||.....##|##"
".##..#...|#..##...|..##....#." -> ".#####..#|#..#####|#####..##."
".#|...||...|#...|..##...|#...." -> ".#|#..||.##|##..|..##..#|#..##"
"....#.|...#.|..|.|.....|..#......" -> "..#.#.|.#.#.|.#|#|#.#..|..#.#...."
"..|....|.....#.|.....|...|.#.|..|.|...#......" -> ".#|#...|...#.#.|.#.#.|.#.|.#.|.#|#|#..#......"
Jawaban:
Retina , 50 byte
Cobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)
Saya kira ini adalah kebalikan dari pengiriman (tanpa regex).
Penjelasan
Ini hanyalah pengganti regex, yang diterapkan berulang kali (
+
) hingga string berhenti berubah. Saya menggunakan kelompok penyeimbang untuk memastikan bahwa dua posisi cermin adalah jarak yang sama dari cermin yang diberikan (backreferences tidak akan berlaku, karena string yang tepat di kedua sisi|
mungkin berbeda).Ini diganti dengan
#$2#
yang menggantikan karakter pertama dan terakhir dari pertandingan dengan a#
.sumber
Perl, 49 byte
Kredit penuh untuk @Martin Ender untuk yang ini menyarankan regex ini 15 byte lebih pendek dari saya.
47 byte kode +
-pl
benderaUntuk menjalankannya:
Bagian pertama (
([.#])
) dan terakhir ((?!\1)[^|]
) sama dengan jawaban Retina (lihat penjelasan di sana).Bagian tengah (
(\||[^|](?2)[^|])
) menggunakan rekursi perl ((?2)
) untuk mencocokkan mirror (\|
) atau (|
) dua karakter bukan-mirror-([^|]
) dipisahkan oleh pola yang sama ((?2)
).Versi saya yang lebih lama (dan lebih jelek):
s/([.#])(([^|]*)\|(??{$3=~s%.%[^|]%gr}))(?!\1)[^|]/#$2#/&&redo
sumber
Haskell (tanpa regex), 117 byte
sumber
PHP,
123117100 byteprogram mengambil argumen command line, regex diambil dari @Martin Ender / Dada. Jalankan dengan
-r
.sumber
C, 176 byte
Tidak disatukan
sumber
'#'
dan'.'
dengan35
dan46
masing - masing.x,i,j;void t(char*a){while(a[i]++)if(a[i]=='|'){for(j=x;a[j++]&&j<=i*2-x;j++){if((a[j]==35)&&(a[2*i-j]==46)){a[2*i-j]=35;i=-1;break;}if((i-j)&&(a[j]=='|'))break;}x=i+1;}}
- 170 byteJavaScript (ES6), 170 byte
Tidak Disatukan:
sumber