Diberikan masukan dari "jalan" seni ASCII, menampilkan jalan dengan semua jalan buntu berlabel.
Ini jalan:
########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########
Ini adalah jalan dengan jalan buntu yang berlabel huruf X
:
########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX
Jalan buntu didefinisikan sebagai setiap ubin jalan yang berbatasan dengan n ubin jalan lain, setidaknya n-1 yang dianggap sudah mati oleh peraturan ini. "Berbatasan" ada di empat arah mata angin, jadi ubin yang berbatasan secara diagonal tidak masuk hitungan.
Aturan ini diterapkan berulang kali, karena jalan buntu yang baru dibuat dapat, dengan sendirinya, menciptakan lebih banyak jalan buntu . Perhatikan juga bahwa ubin jalan apa pun yang berbatasan hanya dengan satu ubin jalan lain dianggap buntu saat pertama kali aturan diterapkan.
Input dan output dapat berupa string tunggal (dengan garis yang dipisahkan oleh karakter apa pun yang bukan #
atau .
) atau array / daftar / dll. Jika bahasa Anda mendukungnya, Anda juga dapat mengambil input dengan setiap baris menjadi argumen fungsi.
Anda dapat mengasumsikan berikut tentang input:
Akan selalu ada setidaknya satu "loop" —yaitu, sekelompok
#
karakter yang dapat diikuti tanpa batas. (Kalau tidak, setiap ubin akan menjadi jalan buntu.)Ini menyiratkan bahwa input akan selalu 2 × 2 atau lebih besar, karena loop terkecil adalah:
## ##
(Yang, kebetulan, harus berupa output tanpa perubahan.)
Semua
#
karakter akan terhubung. Artinya, jika Anda melakukan mengisi banjir pada siapa saja#
, semuanya akan terpengaruh.
Karena ini adalah kode-golf , kode terpendek dalam byte akan menang.
Contoh di atas dan kisi 2 × 2 yang kecil dapat digunakan sebagai kasus uji (tidak ada banyak kasus tepi untuk dibahas dalam tantangan ini).
'#
dan"#"
berbeda di CJam?"#"
sama dengan['#]
.JavaScript (ES6),
110109 byte1 byte disimpan berkat @ edc65 !
Penjelasan
Pendekatan yang sangat sederhana untuk masalah ini. Mencari masing-masing
#
, dan jika ada kurang dari 2#
s di sekitarnya, gantikan denganX
. Ulangi proses ini berkali-kali sampai dijamin semua jalan buntu telah diganti denganX
s.sumber
l=~r.search
alih-alihl=1+r.search
. (Hanya 1 byte disimpan)Python (3.5)
362331329314 byteterima kasih kepada @Alissa. dia membantu saya memenangkan ~ 33 byte
Penjelasan
Definisi fungsi
Tambahkan batas '.' di kanan dan kiri papan
Tambahkan batas '.' di atas dan bawah
Fungsi Lambda untuk menguji '#'
Ulangi panjang input untuk memastikan kami tidak melupakan jalan buntu
Ulangi kolom dan garis
Uji apakah kita memiliki '#' di sekitar dan di posisi
Ganti '#' dengan 'X'
Pangkas perbatasan yang diisi dengan '.' dan bergabung dalam string
Pemakaian
sumber
split()
sebagai gantisplitlines()
. 2)t=['.'*(c+2)]+['.'+i+'.'for i in s]+['.'*(c+2)]
lebih pendek. Dan itu dapat dipersingkat bahkan lebih:d='.';t=[d*c]+t+[d*c];t=[d+i+d for i in t]
3) Anda tidak perlu semua daftar (zip (....)), gunakanprint('\n'.join([''.join(i[1:-1])for i in t])
'str' object does not support item assignment
. daftar daftar memungkinkan saya untuk menggunakan t [h] [x] = 'X'r
,g
dand
) dari fungsi Anda (menghemat beberapa tabulasi). Mungkin beberapa bermain di sekitar split () mungkin membantut=[d+list(i)+d for i in s.split()]
:, kemudian menghitung panjang, kemudian menambahkan garis-titik ke akhir dan ke awal, dan kemudian mengubah siklus Anda untuk bekerja dengan panjang yang diperpanjang ini. Tidak yakin apakah itu akan mempersingkat kodenya, tetapi mungkin