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 horisontal dunia 3D, dan satu jenis blok: peti .
Peti memungkinkan pemain menyimpan item. Ketika dua peti berdekatan secara orthogonal dalam bidang horizontal yang sama, teksturnya saling terhubung dan dada ganda dengan dua kali kapasitas terbentuk. Tidak ada yang lebih besar dari dada ganda yang bisa dibuat; tidak ada peti tiga atau peti empat.
Balok dada hanya dapat ditempatkan di titik kisi kosong jika empat titik yang berdekatan secara orthogonal semuanya kosong, atau jika persis satu berisi blok dada yang belum menjadi bagian dari peti ganda. Aturan penempatan ini memastikan bahwa tidak akan pernah ada ambiguitas tentang blok dada mana yang terhubung untuk membentuk peti ganda.
Misalnya, anggaplah .
ruang kosong dan C
sebuah peti: (Angka-angka juga ruang kosong dan hanya untuk tujuan identifikasi.)
.......C..
.1.C2.C3..
........5C
.CC4..CC..
..........
- Sebuah peti dapat ditempatkan di tempat 1 karena 4 tetangganya kosong.
- Sebuah dada dapat ditempatkan di tempat 2 karena dada tetangga belum menjadi bagian dari dada ganda.
- Dada tidak bisa diletakkan di posisi 3 karena akan ada ambiguitas tentang bagaimana bentuk dada ganda.
- Dada tidak dapat ditempatkan di tempat 4 karena dada tetangga sudah merupakan bagian dari dada ganda.
- Sebuah dada dapat ditempatkan di tempat 5. Dada ganda diagonal tetangga tidak mempengaruhi apa pun.
Dengan asumsi area di luar grid kosong, mengubah setiap .
di grid menjadi *
jika peti dapat ditempatkan di sana menghasilkan ini:
******.C**
***C**C.**
*..***..*C
.CC.*.CC.*
*..***..**
Tidak semua *
ruang dapat ditempati dengan peti pada saat yang bersamaan, tetapi jika Anda hanya memiliki satu peti, itu bisa ditempatkan di salah satu dari mereka.
Tantangan
Tulis program atau fungsi yang menggunakan a .
dan C
kisi, dan ubah setiap .
menjadi *
jika peti dapat ditempatkan di sana, mencetak atau mengembalikan kisi yang dihasilkan.
Input dapat dari stdin atau file atau sebagai argumen string ke suatu fungsi.
Anda dapat mengasumsikan input terbentuk dengan baik - yaitu kotak teks persegi panjang yang sempurna, setidaknya 1 karakter lebar dan tinggi, hanya berisi
.
danC
Anda dapat secara opsional mengasumsikan ada baris tambahan setelah baris terakhir (dan mungkin ada satu di output ).Anda bisa menganggap susunan peti di input konsisten dengan aturan di atas. Tidak akan pernah ada ambiguitas tentang peti mana yang membentuk peti ganda.
Jika diinginkan, Anda dapat menggunakan tiga yang berbeda ASCII printable karakter di tempat
.
,C
dan*
. Anda tidak boleh menggunakan sesuatu yang lain sebagai pengganti baris baru.Semua peti adalah peti normal. Tidak terjebak dada atau dada ender .
Mencetak gol
Pengajuan dengan byte paling sedikit menang.
Untuk tantangan terkait Minecraft yang sedikit lebih menantang, coba Nether Portal Detection .
Jawaban:
CJam,
82 76 66 62 5854 byteFormat input mengharapkan
0
sel udara dan8
sel dada. Keluaran berisi1
untuk semua sel yang dapat ditempatkan dengan Dada.PEMBARUAN :
Memperbaiki bug. Meningkat 3 byte :(lebih lanjut golf :). 4 byte disimpan berkat @ Sp3000Input contoh:
Keluaran:
Saya pikir saya sudah selesai bermain golf untuk saat ini ...
Penjelasan
Cobalah online di sini
sumber
.NET Regex ( Retina ),
434416310 + 1 = 311 byteSetelah tantangan terakhir yang saya jawab di regex (Tantangan Portal Belanda terkait dengan tantangan ini), saya akhirnya mulai menulis alat baris perintah, yang bertindak sebagai juru bahasa untuk ekspresi reguler gaya .NET, sehingga saya dapat menjawab pertanyaan dengan regex tanpa ditantang bahwa mereka bukan bahasa yang berdiri sendiri. Saya menamainya Retina.
Sekarang, tantangan ini tidak cocok dengan pengajuan regex, tapi saya hanya harus menggunakan Retina sekarang. ;) (Plus, Sp3000 menantang saya untuk melakukannya dalam obrolan.) Jadi, ini dia:
File Regex
File pengganti
File regex sebagian besar hanya regex, kecuali yang
`
memungkinkan Anda meletakkan beberapa opsi dalam file, dalam hal ini hanya mode multiline. Ketika diberi dua file, Retina secara otomatis mengasumsikan ganti semua mode. Kedua file ini mendefinisikan program yang membaca input dari STDIN dan mencetak hasilnya ke STDOUT.Anda juga dapat mengujinya di RegexHero dan RegexStorm . Regex berfungsi baik dengan dan tanpa membuntuti baris baru, dan digunakan
_
sebagai pengganti.
. (Rupanya, RegexStorm kadang-kadang memiliki masalah jika tidak ada baris baru, tetapi RegexHero tampaknya menangani kedua case tersebut dengan baik.)Ada banyak sekali duplikasi di regex, dan saya punya beberapa ide untuk memperpendeknya secara signifikan ... Saya akan mencobanya nanti dan kemudian menambahkan penjelasan. Sementara itu, beri tahu saya jika Anda dapat menemukan input yang menghasilkan hasil yang salah.
sumber
J,
7573 byteMenggunakan format dalam pertanyaan, masing-masing menggunakan
.
/*
/C
untuk ruang / ruang yang dapat digunakan / dada.Sunting: memperbaiki bug kecil (saya tidak sengaja menggunakan torus alih-alih memperlakukan sekitarnya sebagai ruang kosong dengan benar).
Penjelasan
sumber
C, 193
2 baris baru yang tidak perlu untuk kejelasan. Perubahan yang berkaitan dengan kode yang tidak disatukan meliputi: karakter sebagai kode ascii alih-alih literal karakter; penataan ulang v = 0, strlen, dan strchr untuk menyimpan karakter (strchr adalah yang paling jelek, karena itu berarti bahwa perhitungan yang seharusnya dilakukan sekali saja, dilakukan 5 kali per sel!)
Fungsi C tidak menerima string sebagai argumen atau mengembalikannya sebagai nilai, jadi yang terbaik yang bisa saya lakukan adalah sebagai berikut:
q
adalah pointer ke string input. Fungsi memodifikasi string dan ketika fungsi mengembalikan output ditemukan dalam string asli.Untuk meringkas aturan:
kotak kosong (yang tidak mengandung C atau baris baru) dapat dikonversi jika memiliki maksimum 1 tetangga dengan C
... DAN tetangga itu tidak punya tetangga dengan huruf C.
Fungsi g berisi fungsi f yang berulang turun dari kedalaman 1 ke kedalaman 0. Dengan hanya 2 tingkat rekursi,
f(r,0)
panggilan rekursif sederhana akan dilakukan, tidak perluf(r,d-1)
!Kode yang tidak digabungkan dalam program pengujian
Input string tes di-hardcode.
gets
danscanf
tidak akan menerima string input dengan baris baru di dalamnya; mereka memotong-motongnya di setiap baris baru.Keluaran berdasarkan contoh pertanyaan
sumber
JavaScript (ES6) 124
129Menggunakan karakter 0 (*), 6 (C), 7 (.)
Tidak diikat dan dijelaskan
Uji di Firefox / konsol FireBug
Keluaran
sumber
Perl, 66
Konflik dada pencocokan regexp berakhir pada sisi yang panjang, jadi tidak ada yang bersaing dengan CJam saat ini.
Gunakan 0 dan 2 untuk ruang kosong dan dada pada input, 1 untuk menandai bintik pada output.
Coba di sini .
sumber
Python 2 - 281 byte
(Baris 8 dan 9 dimaksudkan dengan karakter tab tunggal, yang dikonversi SE menjadi 4 spasi. Setiap baris dalam program ini memiliki 0 atau 1 byte spasi kosong terkemuka.)
Input:
0
untuk tanpa dada,2
untuk dadaOuput:
0
untuk tanpa dada,2
untuk dada yang ada,1
untuk kemungkinan dada baruYa Tuhan, ini mengerikan. Saya harus benar-benar keluar dari latihan. Saya melemparkan setiap trik yang saya tahu dan keluar ... yah, itu keluar sebagai 281 byte, kalah setiap jawaban kecuali yang ada di regex , haha. Sejujurnya saya merasa seperti bermain golf dengan baik, jadi saya menduga algoritma saya kurang ideal.
Tidak Terkumpul:
sumber