Dalam tantangan ini, Anda diberikan peta medan dua dimensi, dilihat dari samping. Sayangnya, beberapa bagian dari medan mengambang di udara, yang berarti mereka akan runtuh. Tugas Anda adalah memprediksi di mana mereka mendarat.
Input
Input Anda adalah satu atau lebih string yang dipisahkan baris baru dengan panjang yang sama, hanya berisi karakter #
(tanda angka, menandakan batu) atau .
(periode, menandakan ruang kosong).
Hasil
Output Anda memiliki format yang sama dengan input, tetapi dengan modifikasi berikut. Mari kita lihat string input sebagai kisi batuan dua dimensi. Setiap batu di input yang terhubung ke bagian bawah grid oleh jalur batuan yang berdekatan adalah tegas ; batu lainnya longgar . Batuan yang berdekatan secara diagonal tidak dianggap berdekatan. Semua batu lepas akan jatuh lurus ke bawah, dan berakhir sebagai tumpukan di atas batu yang kokoh atau baris bawah. Batuan lepas tidak saling menempel, sehingga jatuh secara individual, bukan sebagai bentukan besar. Outputnya adalah grid yang dihasilkan.
Contohnya
Input
..###. .##.#. .#.... .##.#.
tidak mengandung batu lepas, sehingga hasilnya identik dengan itu.
Input
...#.. .#..#. .#..## .#...# .##### .#...#
berisi satu batu lepas di bagian atas, yang jatuh di atas batu perusahaan di bawahnya. Outputnya adalah
...... .#..#. .#..## .#.#.# .##### .#...#
Input
.#####.... .#....#### ###.###..# #.#...##.. .####..#.# ......###. ..#...#..# ..#...#..#
memiliki sekelompok besar batuan lepas di sebelah kiri. Kelompok itu rusak ketika batu-batu itu jatuh, demikian juga hasilnya
.......... ....###### ..#.###..# . #...##.. .##....#.. .##...#### ####..#..# #####.#..#
Klarifikasi
- Anda dapat mengambil input dari STDIN dan output ke STDOUT, atau menulis fungsi.
- Ini adalah kode-golf, jadi program terpendek (dalam byte) adalah pemenangnya.
- Celah standar tidak diijinkan.
Jawaban:
CJam,
180 ... 133 101 ... 94 9087 bytePasti ada banyak golf yang mungkin, tetapi saya ingin mempostingnya terlebih dahulu setelah membuatnya berfungsi sepenuhnya.Mengambil kisi-kisi batu (terdiri dari
.
dan#
tanpa baris baru) dari STDIN dan mencetak hasilnya ke STDOUTPEMBARUAN : Menggunakan pengisian banjir parsial yang tidak efisien tetapi lebih pendek untuk mengetahui batu yang kokoh.
UPDATE 2 : Mengubah algoritma untuk membuat batu jatuh. Jauh lebih pendek sekarang!
UPDATE 3 : Melakukan beberapa optimasi kecil dan pada akhirnya saya dapat menurunkan jumlah byte menjadi setengah dari kode asli!
Cara kerjanya :
Untuk penimbunan banjir, kami mengulangi seluruh panjang grid (grid) kali. Dalam setiap iterasi, kami dijamin untuk mengkonversi setidaknya 1
#
yang secara langsung menyentuh spasi ke(spasi). Ruang di sini mewakili grup rock yang kuat. Dengan demikian, pada iterasi panjang (kisi-kisi), kami dijamin memiliki semua batuan keras yang diwakili oleh spasi.
Cobalah online di sini
sumber
Perl 5: 98
98 termasuk 2 flag baris perintah.
Penjelasan:
sumber
JavaScript (ES6) 232
Sebagai fungsi dengan parameter string dan mengembalikan string.
Pada awalnya, tambahkan baris bawah '1' untuk mengidentifikasi garis tanah.
Pencarian lingkaran pertama untuk batuan tetap (yang berada di dekat '1') dan menandainya sebagai '1' juga. Pencarian diulang sampai tidak ada lagi batuan keras yang ditemukan.
Loop kedua memindahkan karakter '#' yang tersisa ke baris bawah. Sekali lagi, ini diulang sampai tidak ada batu yang bisa dipindahkan.
Akhirnya, ganti '1' dengan '#' lagi dan potong baris bawah.
Kurang golf
Uji (Anda dapat memiliki bukti batu apa yang keras dan apa yang telah jatuh)
sumber
APL,
130119Karena tidak mungkin (sejauh yang saya tahu) untuk memasukkan baris baru ketika input diminta, program ini mengambil matriks karakter sebagai input.
Algoritma yang digunakan adalah pertama mengkonversi ke matriks biner (
0
adalah udara dan1
batu) kemudian mengisi banjir dari baris bawah untuk menandai batuan perusahaan sebagai2
. Kemudian partisi setiap kolom menjadi "ruang di antara batu-batu yang kokoh" dan urutkan setiap partisi untuk membuat batu yang lepas "jatuh" ke udara.Sunting1: Golf beberapa menggunakan algoritma mengisi banjir yang berbeda
Tes berjalan
Jalankan 1
Tentukan matriks karakter
A
dan cetak:Kemudian beri makan
A
ke dalam program:Jalankan 2
sumber
JS - 443 byte
Banjir mengisi batu dari bawah, lalu membawa batu yang tidak terisi banjir ke bawah. Menggunakan banyak rekursi dengan isi banjir sehingga dapat sedikit memperlambat browser Anda.
Ini sebuah fungsi - sebut saja dengan
g("input")
JSFiddle: http://jsfiddle.net/mh66xge6/1/
JSFiddle Ungolfed: http://jsfiddle.net/mh66xge6/
sumber
Python 3, 364 byte
Saya yakin lebih banyak yang bisa diperas dari ini ... tapi itu tidak akan pernah bisa bersaing dengan CJam dan Perl.
Mirip dengan jawaban lain. Satu kekhasan adalah bahwa itu membalikkan grid terbalik terlebih dahulu (untuk membuat indeks lingkaran lebih nyaman) dan menambahkan baris & kolom tambahan
.
(untuk menghindari masalah dengan-1
indeks pembungkus ). Jalankan dengan meneleponP(string)
.sumber