Anda diberi kisi heksagonal karakter .
dan #
, seperti ini:
. . . . . . . .
. . . . # . . .
. # . . . # . .
. . . # . . . .
. . . . . # . .
. . . . . . . .
Tugas Anda adalah untuk mengisi seluruh kotak pembatas yang selaras sumbu #
dengan yang lebih lanjut #
:
. . . . . . . .
. . # # # # . .
. # # # # # . .
. . # # # # # .
. . # # # # . .
. . . . . . . .
Kotak bounded aligned sumbu adalah bentuk heksagonal cembung terkecil yang berisi semua #
. Perhatikan bahwa dalam kasus kisi heksagonal, ada tiga sumbu yang perlu dipertimbangkan (W / E, SW / NE, NW / SE):
Berikut adalah contoh lain untuk menunjukkan bahwa dalam beberapa kasus, satu atau lebih sisi hanya akan berisi satu #
:
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . . . . . . . . . . . . .
Anda bisa melihat ini sebagai segi enam dengan sisi yang merosot, atau Anda dapat menggambar kotak pembatas di sekitar mereka, seperti yang telah saya lakukan di atas, dalam hal ini mereka masih berbentuk segi enam:
Terlalu keras? Coba Bagian I!
Aturan
Anda dapat menggunakan dua yang berbeda non-ruang dicetak karakter ASCII (0x21 untuk 0x7E, inklusif), di tempat #
dan .
. Saya akan terus merujuk mereka sebagai #
dan .
untuk sisa spesifikasi.
Input dan output dapat berupa string yang dipisahkan dengan linefeed tunggal atau daftar string (satu untuk setiap baris), tetapi formatnya harus konsisten.
Anda dapat mengasumsikan bahwa input berisi setidaknya satu #
dan semua baris memiliki panjang yang sama. Perhatikan bahwa ada dua "jenis" garis yang berbeda (dimulai dengan spasi atau non spasi) - Anda mungkin tidak berasumsi bahwa input selalu dimulai dengan tipe yang sama. Anda dapat mengasumsikan bahwa kotak pembatas selalu cocok di dalam kotak yang Anda berikan.
Anda dapat menulis sebuah program atau fungsi dan menggunakan salah satu metode standar kami untuk menerima input dan memberikan output.
Anda dapat menggunakan bahasa pemrograman apa pun , tetapi perhatikan bahwa celah ini dilarang secara default.
Ini adalah kode-golf , jadi jawaban tersingkat yang valid - diukur dalam byte - menang.
Uji Kasus
Setiap test case memiliki input dan output yang bersebelahan.
# #
. . . .
# . # # # #
. . . .
. # . #
. . . . # .
# . # .
# . # .
. . . . # .
. # . #
# . # .
# . . # # .
. # # #
. # # #
# . . # # #
. # # #
. . # . # #
. . # #
# . . # # .
# . . # # .
. . # #
. . # . # #
. . . . . . . . . . . . . . . .
. . # . # . . . . . # # # . . .
. . . . . . . . . . . # # . . .
. . . # . . . . . . . # . . . .
. . . . . . . . . . . . . . . .
. . # . . . # . . . # # # # # .
. . . . . . . . . . . # # # # .
. . . # . . . . . . . # # # . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . # . . . . . # # # # . .
. # . . . # . . . # # # # # . .
. . . # . . . . . . # # # # # .
. . . . . # . . . . # # # # . .
sumber
Jawaban:
Pyth ,
8271 byteCobalah online!
Penjelasan
Misalkan A adalah titik dengan koordinat y terendah dan B titik dengan koordinat y tertinggi.
Misalkan C adalah titik dengan nilai terendah (nilai x minus nilai y) dan titik D dengan nilai tertinggi.
Biarkan E menjadi titik dengan nilai terendah (nilai x plus nilai y) dan F titik dengan nilai tertinggi.
Maka itu sama dengan menemukan koordinat yang koordinat y adalah antara A dan B, nilai x minus nilai y adalah antara C dan D, dan nilai x plus nilai y adalah antara E dan F.
sumber
Haskell,
256 254243 byteTerima kasih @ Damian untuk bermain golf
f
!Input diambil sebagai daftar daftar karakter, output disediakan dengan cara yang sama.
Soo ini binatang buas yang harus ditulis. Ini didasarkan pada ide LeakyNun menggunakan penyaringan berdasarkan maksimum dan minimum pada koordinat item.
Saya benar-benar terkejut oleh fakta bahwa
m=map
sebenarnya menghemat byte karena tampaknya sangat mahal.Penjelasan:
Berikut ini versi yang sedikit kurang disembelih (penekanan sedikit ):
f
adalah fungsi yang memberikan masing-masing karakter indeks(y-index, x-index)
sambil mempertahankan struktur asli daftar.b
: Diberikan item dari daftar yang diindeks,b
menghitung[y-index, y - x, y + x]
.p
: Diberikan bidang yang diindeks, mengembalikan 3 fungsiInt -> Bool
, yang pertama adalah pemeriksaan indeks-y, yang kedua dari perbedaan dan yang ketiga dari jumlah.min(snd e)
merawat ruang (ruang lebih kecil dari keduanya). Fungsi ini diuraikan dalam kode golf.q
mengingat diindeks lapangan, mengubah semua yang diperlukan.
untuk#
dengan memeriksa jika itu bidang tertentu kembaliTrue
ke setiap fungsi tes.Solusi terakhir adalah komposisi
q
danf
.sumber
f=z(\y->z((,).(,)y)[0..])[0..]
h x=z x[0..]
f=h$h.curry(,)
Python 3,
380378348346 bytePerhatikan bahwa lekukan adalah dengan tab, bukan spasi.
Versi golf:
Uji di Ideone
Penjelasan (untuk versi yang tidak dipisahkan di bawah):
Semua pemrosesan dilakukan tanpa konversi apa pun, karakter spasi hanya dilewati.
Fungsi
axes_pos
menghitung 3-tupel dari koordinat "3D" imajiner, mereka diakumulasikan ke dalam (elemen bijaksana) minimum dan maksimum 3-tupel (bmin
,bmax
) untuk semua#
karakter.Koordinat dihitung dalam
def axes_pos(x, y): return y, x + y, lc - y + x
;di mana X dihitung dari 0 ke kanan, dan Y dihitung dari 0 ke bawah (dari baris pertama ke terakhir).
Koordinat imajiner pertama pada dasarnya Y, karena jelas mengapa. Kapaknya ortogonal ke batas hijau (dalam gambar OP)
Kedua adalah ortogonal ke batas merah, dan ketiga adalah ortogonal ke batas biru.
Pada lintasan kedua, penggantian dilakukan untuk semua
.
karakter yang koordinat "3D" -nya termasuk dalambmin
..bmax
range, elemen wise - ini dicentang dalam ungkapan iniall(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3))
.Versi tidak dikoleksi dengan tes, juga di Ideone :
Pembaruan 1:Dihapus tidak perlu
Perbarui 2,3:-1
untuk koordinat imajiner ketiga, karena tidak mengubah apa punPerbaikan yang diterapkan sebagian disarankan oleh
Leaky Nun
+ milik saya juga.sumber
def A(x,y):return y,x+y,len(L)-1-y+x
->A=lambda x,y:(y,x+y,len(L)-1-y+x)
len(L)-y+x
menjadix-y
Jelly ,
4535 134241 byteIni adalah daftar tautan; yang terakhir harus dipanggil pada input untuk menghasilkan output.
I / O berbentuk array string, di mana
.
menunjukkan kosong dan@
menunjukkan diisi.Cobalah online! atau verifikasi semua kasus uji .
Latar Belakang
Mari kita perhatikan contoh berikut ini.
Dengan menggambar sepasang atau garis paralel - pasangan terdekat yang membungkus semua posisi yang diisi - di masing-masing dari tiga arah, kita dapat menentukan kotak pembatas heksagonal.
Dalam implementasinya, kami mengganti semua karakter antara dua garis dengan
@
, dan semua yang berada di luar garis ini.
, dengan kemungkinan pengecualian diagonal yang hanya berisi spasi).Untuk sumbu horizontal, ini memberi
untuk sumbu diagonal jatuh, itu memberi
dan untuk sumbu diagonal naik, itu memberi
Dengan mengambil karakter minimum dari ketiganya, sejak
.
<@
, kita dapatYang tersisa untuk dilakukan adalah mengembalikan ruang.
Bagaimana itu bekerja
sumber
Python,
237230 byte7 byte berkat Dennis.
Port jawaban saya di Pyth .
Mengambil array garis sebagai input, menghasilkan array karakter 2D.
sumber
Perl,
128126 byteTermasuk +6 untuk
-0F\n
Jalankan dengan input pada STDIN. Gunakan
1
untuk diisi,0
untuk kosong. Garis tidak harus diisi dengan spasi di akhir:hexafill.pl
Menggunakan koordinat kubus. Tentukan maksimum dan minimum selama
$= == 1
loop dan isi koordinat antara batas-batas ini selama$= == 0
loop. 58 loop pertama tidak ada gunanya dan hanya ada untuk mengisi$-
dengan jumlah garissumber
TSQL, 768 byte
Saya menulis pertanyaan untuk menyelesaikan ini - yang menurut saya cukup sulit. Itu tidak mampu bersaing dengan semua jawaban pendek yang sangat bagus. Tetapi tetap ingin mempostingnya bagi mereka yang tertarik. Maaf tentang panjangnya jawaban - berharap codegolf juga tentang pendekatan yang berbeda.
Golf:
Tidak Disatukan:
Fiddle tidak berbulu
sumber
GNU Octave,
212, 196 byteMungkin bukan bahasa pilihan favorit pegolf, tapi itu yang membuat tantangan, bukan? Dengan asumsi m diambil sebagai matriks char: 178 byte berdiri sendiri dan 196 jika dimasukkan ke dalam suatu fungsi .
golf:
ungolfed:
Penjelasan : kami membangun sistem koordinat, 3 sumbu - ortogonal ke sisi segi enam, menemukan maks dan minimum masing-masing koordinat, kemudian membangun topeng logis dimulai dengan 1 di mana-mana dan secara logis dan: masing-masing kendala koordinat maks dan minimum, akhirnya mengatur ulang setiap posisi "true" yang tersisa ke char "#".
Jika Anda ingin mengujinya, Anda bisa membuat matriks m seperti ini:
lalu panggil f (m) dan bandingkan dengan m dengan membangun matriks dengan keduanya di:
sumber
m
dan output untuk disimpank
. Jawaban harus selalu berupa program lengkap atau fungsi yang dapat dipanggil.