Permainan video Minecraft adalah tentang menempatkan dan menghapus berbagai jenis blok dalam kisi integer 3D yang membentuk dunia virtual. Setiap titik kisi dapat berisi tepat satu blok atau kosong ( blok " udara " secara resmi). Dalam tantangan ini, kita hanya akan peduli dengan satu bidang 2D vertikal dari dunia 3D, dan satu jenis blok: obsidian .
Ketika obsidian membentuk garis besar persegi panjang kosong di bidang vertikal, portal bawah dapat dibuat. Kotak kosong mungkin ukuran mulai dari 2 unit lebar 3 unit tinggi hingga 22 unit lebar 22 unit tinggi. Sudut-sudut persegi panjang tidak perlu dibatasi di obsidian, hanya sisi.
Sebagai contoh, anggaplah X
obsidian dan .
kekosongan: (Jumlahnya hanya untuk tujuan identifikasi dan juga kosong.)
...................................
..XXXX....XXXX....XXXXXXXXX........
..X..X...X....X..X.........X..XXXX.
..X.1X...X.2..X..X...3...X.X..X....
..X..X...X....XXXX.........X..X.6X.
..XXXX....XXXX...XXXXXXXXXXX..X..X.
.............X.4.X....X.5.X...XXXX.
.............X...X....X...X........
..............XXX......XXX.........
...................................
Kisi ini berisi 3 portal yang valid:
- Portal 1 adalah 2 oleh 3 unit, benar-benar kosong, dan berbatasan dengan obsidian. Karena itu sah.
- Portal 2 adalah 4 oleh 3, benar-benar kosong, dan berbatasan dengan obsidian. Karena itu sah.
- Portal 3 tidak sepenuhnya kosong. Karena itu tidak valid.
- Portal 4 adalah 3 oleh 3, benar-benar kosong, dan berbatasan dengan obsidian. Karena itu sah.
- Portal 5 adalah 3 oleh 2 unit, yang terlalu kecil. Karena itu tidak valid.
- Portal 6 kehilangan bagian perbatasan. Karena itu tidak valid.
Tantangan
Tulis program atau fungsi yang menampilkan representasi string dari grid obsidian dan kekosongan, dan mencetak atau mengembalikan jumlah portal yang valid di bawah ini.
- Input dapat dari argumen stdin atau file atau fungsi.
Anda dapat berasumsi bahwa input selalu terbentuk dengan baik - yaitu kisi teks persegi panjang sempurna, setidaknya 1 karakter lebar dan tinggi, hanya berisi
X
dan.
. Anda dapat mengasumsikan bahwa ada baris baru setelah baris terakhir.Jika diinginkan, Anda dapat menggunakan dua karakter ASCII yang dapat dicetak untuk menggantikan
X
dan.
.Obsidian mungkin berada di perbatasan grid. Apa pun di luar perbatasan dianggap kosong.
Input contoh - output harus 4
:
................................................................
...................................XXXXXXXXXXXXXXXXXXXXXXXXX....
..XXXX....XXXX....XXXXXXXXX........X.......................X....
..X..X...X....X..X.........X..XXXX.X.......................X....
..X..X...X....X..X.......X.X..X....X.......................X....
..X..X...X....XXXX.........X..X..X..XXXXXXXXXXXXXXXXXXXXXXXX....
..XXXX....XXXX...XXXXXXXXXXX..X..X.X......................X..XXX
.............X...X....X...X...XXXX.X......................X..X..
.............X...X....X...X........X......................X..X..
..............XXX......XXX........XXXXXXXXXXXXXXXXXXXXXXXX...X..
..................................XX.........................XXX
Mencetak gol
Kiriman dengan byte paling sedikit menang.
Jawaban:
Perl, 81
86Menggunakan lebih dari satu regexp.
Regexp untuk lebar tertentu dari portal jauh lebih sederhana daripada yang generik:
X{$m}..{$n}(X\.{$m}X.{$n}){3,22}.X{$m}
manam
adalah lebar portal dann
adalahtotal width - 1 - m
. Regexp harus dimasukkan ke dalam pernyataan ke depan dengan lebar nol(?=...)
karena pertandingan mungkin tumpang tindih. Kemudian saya mengulangi 21 kali pengaturan regexp ini$n
dan$.
."@-"
mengevaluasi untuk memulai posisi pertandingan terakhir (/.\n/
) yang merupakan total lebar - 1.$.
digunakan sebagai variabel lain seperti yang diinisialisasi1
ketika digunakan dengan-p0
.sumber
.
sel kosong (jadi Anda tidak perlu menghindarinya).Regex (.NET flavor),
182181145132126114104100989796 bytePengenalan pola seni ASCII 2D? Kedengarannya seperti pekerjaan untuk regex! (Tidak.)
Saya tahu ini akan memulai diskusi tanpa akhir lagi tentang apakah pengiriman regex adalah program yang valid atau tidak, tapi saya ragu ini akan mengalahkan APL atau CJam, jadi saya tidak melihat ada salahnya. (Yang sedang berkata, mereka benar - benar lulus ujian keras kami untuk "Apa itu bahasa pemrograman?" .)
Ini membutuhkan input saat string harus dicocokkan, dan hasilnya adalah jumlah kecocokan yang ditemukan. Ini digunakan
_
sebagai pengganti.
, karena saya harus melarikan diri dari yang terakhir. Ini juga membutuhkan baris baru tambahan.Anda dapat mengujinya secara langsung di RegexHero atau RegexStorm ). Pertandingan akan menjadi baris obsidian atas portal. Jika Anda dapat menemukan kasus uji yang gagal, beri tahu saya!
Apa sihir ini?
Penjelasan berikut mengasumsikan pemahaman dasar tentang kelompok penyeimbang .NET . Intinya adalah bahwa tangkapan adalah tumpukan di .NET regex - setiap tangkapan baru untuk nama yang sama didorong ke tumpukan, tetapi ada juga sintaksis untuk menangkap tangkapan dari tumpukan itu lagi, serta sintaksis untuk menangkap tangkapan dari satu tumpukan dan mendorong tangkapan ke yang lain pada saat yang sama. Untuk gambar yang lebih lengkap, Anda dapat melihat jawaban saya di Stack Overflow yang harus mencakup semua detail.
Ide dasarnya adalah untuk mencocokkan pola seperti:
Di mana
n
berada antara 2 dan 22 (inklusif). Yang sulit adalah membuat semuan
dan semuam
menjadi sama. Karena karakter sebenarnya tidak akan sama, kita tidak bisa hanya menggunakan referensi-ulang.Perhatikan bahwa regex harus menyematkan baris baru, yang akan saya tulis seperti
\n
berikut ini.C #, 185 byte
Ini adalah fungsi C # lengkap, hanya untuk menjadikan ini entri yang valid. Sudah waktunya saya menulis command-line "interpreter" untuk .NET regular expressions ...
sumber
^
(atau karakter yang tidak digunakan) untuk(?!)
.Python, 219 byte
Lebih baik daripada Jawa, tapi bocah lingkaran berleher lima itu sakit. The
for/in
mungkin sedikit kompresibel menggunakan%s
substitusi, tapi itu tidak akan menghemat banyak.Diperluas:
sumber
Java, 304 byte
Ini jauh lebih lama daripada ekspresi reguler. Ini hanya mengulangi setiap kuadrat yang mungkin dalam input. Jika itu adalah portal yang valid, itu menambah penghitung dengan 1. Itu kemudian mengembalikan penghitung. Ini mungkin bisa bermain golf lebih jauh. Setiap saran dipersilahkan.
Bertakuk:
Program lengkap:
sumber