Memasukkan
- Matriks biner mewakili dinding sebuah ruang bawah tanah.
- Posisi pemain di dalam ruang bawah tanah.
- Arah yang sedang dihadapi pemain (0 = Utara, 1 = Timur, 2 = Selatan, 3 = Barat)
Keluaran
Representasi pseudo-3D dari dinding yang ada di bidang pandangan pemain, sebagai seni ASCII karakter.
Berikut adalah beberapa kerangka keluaran yang memungkinkan, bersama dengan peta dan kompas yang sesuai untuk membantu memahami (tetapi menggambar peta dan kompas bukan bagian dari tantangan).
Spesifikasi
Bidang pandang
Pemain memiliki dinding di bidang pandangnya, berlabel dari ke . Di bawah ini adalah posisi dinding relatif terhadap pemain (berwarna kuning), di semua arah yang mungkin.
Menggambar dinding
Dinding seharusnya ditarik dari ke dalam urutan yang tepat ini, mengingat bahwa setiap bagian yang diambil sebelumnya dapat ditimpa oleh dinding yang lebih dekat. Anda tentu saja dapat menerapkannya secara berbeda selama hasil akhirnya sama.
Seluruh output digambar dengan 7 karakter yang berbeda: " "
, "'"
, "."
, "|"
, "-"
, "_"
dan ":"
.
Karena merinci bentuk dinding di tubuh tantangan ini akan membuatnya terlalu panjang, mereka diberikan dalam tautan TIO berikut:
Karakter yang bukan bagian dari dinding yang diberikan ditandai dengan "?"
dalam diagram ini. Mereka harus diperlakukan sebagai karakter 'transparan' yang tidak digambar sama sekali. Di sisi lain, semua ruang di dalam dinding 'padat' dan harus menimpa karakter lain yang mungkin telah ditarik sebelumnya.
Aturan
Tentang input
- Anda dapat menggunakan koordinat 0-diindeks atau 1-diindeks.
- Anda dapat menggunakan 4 nilai berbeda dari pilihan Anda untuk arahan.
- Anda mungkin berasumsi bahwa akan selalu ada dinding di sekelilingnya.
- Pemain dijamin berada di kotak kosong.
- Masukan dijamin valid.
Tentang output
- Dinding harus digambar persis seperti yang dijelaskan.
- Namun, format output juga fleksibel: string tunggal, array string, matriks karakter, dll.
- Memimpin dan mengikuti spasi dapat diterima asalkan konsisten.
Ini adalah kode-golf .
Uji kasus
Semua uji menggunakan matriks berikut:
[ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
[ 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 ],
[ 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1 ],
[ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 ],
[ 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ]
x=3, y=3, d=0
x=6, y=4, d=3
x=4, y=4, d=1
x=1, y=5, d=2
x=7, y=7, d=3
x=6, y=6, d=1
x=8, y=1, d=2
x=7, y=6, d=1
Output yang diharapkan:
------------------------------ ------------------------------
x=3, y=3, d=0: x=6, y=4, d=3:
------------------------------ ------------------------------
__ __ '. .'
|'. .'| | |
| '.--------------.' | |----. |
| | | | | | '.--------. |
| | | | | | | | |
| | | | | | | | |
| | | | | | .'--------' |
| .'--------------'. | |----' |
__|.' '.|__ | |
.' '.
------------------------------ ------------------------------
x=4, y=4, d=1: x=1, y=5, d=2:
------------------------------ ------------------------------
.' __ ________________________ .'
| | |
-------. .----| | |
| '.--------.' | | | |
| | | | | | |
| | | | | | |
| .'--------'. | | | |
-------' '----| | |
| __|________________________|
'. '.
------------------------------ ------------------------------
x=7, y=7, d=3: x=6, y=6, d=1:
------------------------------ ------------------------------
'. '.
|'. |'.
| '. | '.
| | '. .- | |--.--------.--------.-
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '- | |--'--------'--------'-
| .' | .'
|.' |.'
.' .'
------------------------------ ------------------------------
x=8, y=1, d=2: x=7, y=6, d=1:
------------------------------ ------------------------------
'. __ '.
|'. .'| |
| '. .' | |----.--------------.-------
| | '. .' | | | | |
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '. | | | | |
| .' '. | |----'--------------'-------
|.' '.|__ |
.' .'
Tantangan terkait:
Tantangan dari tahun 2013 ini terkait erat. Tetapi memiliki kriteria kemenangan yang berbeda (code-challenge), spesifikasi keluaran yang jauh lebih longgar, dan membutuhkan I / O interaktif.
sumber
Jawaban:
Bersihkan (dengan Snappy ),
800785670644 byte460402 byte kode +360242-byte string literal(lolos di sini dan di TIO karena tidak valid UTF-8)
Anda dapat memverifikasi panjang literal di sini.
Cobalah online!
Kompresi tajam sebenarnya cukup baik dalam hal ini, meskipun berfokus pada kecepatan, karena ada begitu banyak karakter tunggal yang dijalankan dalam string yang dikompresi.
String yang tidak dikompresi (dengan
#
diganti dengan\n
untuk kejelasan) adalah:Ini mengkodekan versi sisi kiri dari komponen layar yang berbeda dengan
!
bukannya baris baru, dan~
bukannya?
, yang kemudian diisi dengan~
hingga 30 karakter sebelum memiliki mereka sendiri dan pembalikan garis mereka ditambahkan ke daftar pencarian.Sisa kode hanya menangani pencarian terkoordinasi dengan kasus di luar batas yang diabaikan.
sumber
Python 2 ,
864854848826810 byteCobalah online!
sumber
Arang ,
500332 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Pendekatan yang agak membosankan, saya khawatir; banyak pencetakan literal string terkompresi. Penjelasan:
Pad array dengan dua
0
s ekstra di setiap sisi.Iris
7x7
subbagian dari array yang berpusat pada koordinat yang diberikan.Putar array yang sesuai untuk arah yang diberikan.
(note trailing space) Gambar
30×10
kotak kosong sehingga output selalu ukuran yang konsisten.Gambarlah masing-masing secara terpisah, yang mencerminkan di antaranya.
Ambil array deskriptor dinding, pisahkan menjadi beberapa bagian (string, koordinat y, koordinat x), filter pada potongan yang memiliki dinding pada posisi yang relevan di bagian array yang relevan, dan lilitkan melewati dinding. Posisi dihitung dengan mengekstraksi 12 dinding dari array dan mengindeksnya menggunakan chunk index karena ini lebih golf daripada mencari dinding secara langsung menggunakan chunk index.
Lompat ke koordinat dinding dan cetak. Perhatikan bahwa mencerminkan meniadakan X-koordinat dari
[0, 30)
ke(-30, 0]
sehingga pada satu lulus kanvas secara efektif bergeser 29 karakter ke kiri.sumber
Ruby ,
412 391 385383 byteCobalah online!
Mengambil input sebagai array nilai kebenaran / kepalsuan (catatan
0
itu benar di Ruby, tetapinil
salah.)Menghasilkan array karakter.
Penjelasan
Blok ditarik dari depan ke belakang dengan jarak yang
n
berkurang dan posisi sisi ke sisim
berputar melalui-1,1,0
kiri, kanan, tengah. Blok tengah E pada baris terjauh sebenarnya digambar dua kali karena kita perlu memeriksa kedua blok A / B dan blok C / D.n,m
dand
digunakan untuk memodifikasi nilaix
-y
nilai dan untuk array pencariana
. Jika dix
luar rentangnil
dikembalikan untuk sel di luar rentang dan tidak ada kesalahan yang dilemparkan, tetapi jikay
berada di luar rentangnil
akan dikembalikan untuk baris dan Ruby akan melempar kesalahan ketik ketika mencoba mencari sel. Untuk menghindari hal ini, array rangkap tiga dalam arah vertikal sebelum pencarian. Jika nilai kebenaran ditemukan, sebuah blok digambar.Output dibangun dalam array array
b
10 elemen yang mewakili kolom output, dan ditransformasikan ke dalam 10 baris di akhir fungsi. Wajah depan penuh dari semua blok digambar (apakah itu muncul di viewport atau tidak) sehingga diperlukan ruang tambahan dalam array untuk menghindari kesalahan di luar jangkauan. Kisaranj
nilai dalam viewport adalah dari-15
ke+14
, ini diimbangi oleh 15 saat menyimpan ke array untuk memberikan kisaran0
ke29
. Untuk setiap blok digambar tiga nilai dihitung:p
danq
masing-masingr
untuk sudut kiri dan kanan dinding depan, dan untuk bagian belakang dinding samping.j
diulang dari minimum ke maksimum dari tiga nilai ini menggambar kolom pada gilirannya.Ada 3 jenis garis: horizontal
-
atau_
, vertikal|
atau:
, dan diagonal dengan" .'"
pola berulang . Di manap < j < q
kolom yang berisi spasi ditutup dengan-
atau_
ditarik untuk membentuk wajah depan. Di manaj
berada di luar rentang ini, kolom yang berisi ruang,|
atau:
digambar dengan simbol darit=" .'"
untuk membentuk tepi dan / atau sisi muka. Ini dikelola oleh variabelk=j
manaj
positif atauk=-j-1
di manaj
negatif. Jumlah karakter antara topi atas dan bawah adalahk/3*2
. Untuk benar menangani tepi luar blok terjauh di manan=3
,k
harus diambil modulo 9, tetapi ini tidak boleh dilakukan untuk nilai yang lebih kecil darin
.k
Oleh karena itu diambil modulo36/-~n
, di mana-~n
dievaluasi untukn+1
.Kode tidak dikunci
sumber