Diberikan array kedalaman apa pun, gambarkan isinya dengan batas di +-|
sekitar masing-masing subarray. Itu adalah karakter ASCII untuk plus, minus, dan pipa vertikal.
Misalnya, jika arraynya adalah [1, 2, 3]
, gambar
+-----+
|1 2 3|
+-----+
Untuk array bersarang seperti [[1, 2, 3], [4, 5], [6, 7, 8]]
, gambar
+-----------------+
|+-----+---+-----+|
||1 2 3|4 5|6 7 8||
|+-----+---+-----+|
+-----------------+
Untuk larik kasar seperti [[[1, 2, 3], [4, 5]], [6, 7, 8]]
, gambar
+-------------------+
|+-----------+-----+|
||+-----+---+|6 7 8||
|||1 2 3|4 5|| ||
||+-----+---+| ||
|+-----------+-----+|
+-------------------+
Perhatikan bahwa ada lebih banyak ruang setelah menggambar [6, 7, 8]
. Anda dapat menggambar konten di baris paling atas, tengah, atau paling bawah, tetapi apa pun yang Anda pilih, Anda harus tetap konsisten.
Tantangan ini terinspirasi oleh kata kerja kotak<
dari J.
Aturan
- Ini adalah kode-golf sehingga kode terpendek menang.
- Orang bawaan yang memecahkan masalah ini tidak diizinkan.
- Array input hanya akan berisi nilai integer atau array nonnegatif. Setiap array akan homogen, artinya elemen-elemennya akan hanya dengan array atau hanya integer, tetapi tidak pernah campuran keduanya.
- Setiap subarray dapat disarangkan dengan kedalaman apa pun.
- Output dapat berupa string atau array string di mana setiap string adalah garis output.
Uji Kasus
[]
++
||
++
[[], []]
+---+
|+++|
|||||
|+++|
+---+
[[], [1], [], [2], [], [3], []]
+-----------+
|++-++-++-++|
|||1||2||3|||
|++-++-++-++|
+-----------+
[[[[[0]]]]]
+---------+
|+-------+|
||+-----+||
|||+---+|||
||||+-+||||
|||||0|||||
||||+-+||||
|||+---+|||
||+-----+||
|+-------+|
+---------+
[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
+---------------------------------+
|+-------------+---------+-----+-+|
||+-----------+|+-------+|+---+|1||
|||+---------+|||+-----+|||2 1|| ||
||||+-------+|||||3 2 1|||+---+| ||
|||||4 3 2 1|||||+-----+|| | ||
||||+-------+|||+-------+| | ||
|||+---------+|| | | ||
||+-----------+| | | ||
|+-------------+---------+-----+-+|
+---------------------------------+
-1
karena saya juga membatasi integer menjadi non-negatif. Maka hanya perlu membersihkan output untuk nilai-nilai yang tidak valid.Jawaban:
Dyalog APL , 56 byte
Terima kasih kepada ngn karena membantu menghapus sekitar sepertiga dari byte.
TryAPL
Tentukan fungsi , lalu jalankan setiap test case dan bandingkan dengan
]Display
utilitas bawaan.[1, 2, 3]
[[1, 2, 3], [4, 5], [6, 7, 8]]
[[[1, 2, 3], [4, 5]], [6, 7, 8]]
[]
[[], []]
[[], [1], [], [2], [], [3], []]
[[[[[0]]]]]
[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
Penjelasan
Secara keseluruhan, ini adalah fungsi anonim
{...}
di atas sebuah lampiran⊂
. Yang terakhir hanya menambahkan tingkat lain dari nesting yang mendorong yang pertama untuk menambahkan bingkai luarFungsi anonim dengan spasi-putih (
⋄
adalah pemisah pernyataan):Ini dia lagi, tetapi dengan fungsi utilitas yang terpisah:
Sekarang saya jelaskan masing-masing fungsi:
CloseBox
mengambil tabel dan mengembalikan tabel yang sama, tetapi dengan kolom pertama tabel ditambahkan di sebelah kanan tabel. Dengan demikian, mengingat tabel 1-by-3XYZ
, fungsi ini mengembalikan tabel 1-by-4XYZX
, sebagai berikut:⊢
argumen (lit. apa yang ada di kanan) yang,
ditebalkan ke⊣/
kolom paling kiri (lit. reduksi kiri masing-masing baris)CreateVertical
mengambil sebuah tabel dan mengembalikan sebuah string yang terdiri dari karakter yang cocok|
dengan sisi-sisi tabel, tetapi dengan dua+
s didahulukan untuk mencocokkan dua baris-
. Akhirnya tabel akan diputar satu baris secara siklis untuk mendapatkan satu+---...
baris di atas dan di bawah. Dengan demikian, diberikan tiga tabel baris, fungsi ini kembali++|||
, sebagai berikut:'++' ,
dua plus ditambahkan ke'|' ⍴⍨
stile yang dibentuk kembali oleh≢
penghitungan argumen (rows ')AddHorizontals
mengambil daftar-daftar, membuatnya menjadi tabel, menambahkan dua baris-
s di atas, menambahkan karakter tepi kiri yang sesuai di sebelah kiri, kemudian memutar satu baris ke bawah, sehingga tabel memiliki batas di atas , kiri, dan bawah. Sebagai berikut:1 ⊖
putar satu baris (baris atas ke bawah) dariCreateVertical ,
string yang++|||...
diawali (sebagai kolom) menjadi'-' ⍪⍣2
minus yang ditambahkan dua kali ke bagian atas↑
argumen yang diubah dari daftar-daftar ke tabel{
Fungsi anonim}
: Jika argumennya adalah daftar sederhana (bukan bersarang), buatlah itu menjadi tabel karakter (dengan demikian, mengingat daftar 3-elemen1 2 3
, fungsi ini mengembalikan tabel karakter 1-oleh-lima karakter yang identik secara visual1 2 3
). Jika argumennya bukan daftar sederhana, pastikan unsur-unsurnya adalah tabel karakter sederhana; pad mereka dengan ketinggian yang sama; bingkai masing-masing di bagian atas, bawah, dan kiri mereka; menggabungkan mereka; dan akhirnya ambil kolom pertama dan tambahkan di sebelah kanan. Sebagai berikut:{
mulai definisi fungsi anonim⍵ ≡ ∊⍵:
jika argumen identik dengan rata argumen (yaitu itu adalah daftar sederhana), maka:⍉
transpos⍪
columnized⍉
dialihkan⍕ ⍵
argumen stringified; lain:CloseBox
Tambahkan kolom paling kiri di sebelah kanan⊃ ,/
AddHorizontals¨
add--
on yang diungkapkan (karena pengurangan tertutup) di- s di atas dan bawah dari masing-masing↓ ↑ ↓¨
padded-to-equal-height * dari∇¨ ⍵
fungsi anonim ini diterapkan pada setiap argumen yang}
mengakhiri definisi fungsi anonim* Lit. buat setiap tabel menjadi daftar-daftar, gabungkan daftar-daftar-daftar (padding dengan string kosong untuk mengisi baris pendek) ke dalam tabel, lalu bagi tabel menjadi daftar daftar-daftar-daftar
sumber
JavaScript (ES6),
223203 byteSolusi Port of @ MitchSchwartz Ruby. Versi sebelumnya yang bekerja dengan membungkus array secara rekursif (dan karenanya bekerja untuk konten yang arbitrer, bukan hanya bilangan bulat):
Catatan: Meskipun saya menggunakan operator spread dalam daftar argumen saya, untuk mendapatkan output yang diinginkan, berikan parameter tunggal array asli daripada mencoba untuk menyebarkan array; ini memiliki efek membungkus output di kotak luar yang diinginkan. Sayangnya biaya kotak luar saya 18 byte, dan ruang-memisahkan bilangan bulat saya biaya 8 byte, kalau tidak visualisasi alternatif berikut akan cukup untuk 197 byte:
sumber
Cannot read property 'map' of undefined
untuk array kosong seperti[]
. Sebab[1,2,[]]
, subarray terakhir tidak ditampilkan untuk saya.[1,2,[]]
karena contoh Anda hanya menampilkan array yang berisi bilangan bulat atau array tetapi tidak keduanya.Ruby, 104 byte
Fungsi anonim yang mengharapkan string. Misalnya,
{{{{{4 3 2 1}}}}{{{3 2 1}}}{{2 1}}{1}}
menghasilkanAnda dapat menggunakan kode ini untuk pengujian:
Ini dimulai dari baris tengah dan bekerja ke luar. Pertama, contoh
}{
diganti dengan|
. Kemudian, sementara masih ada kurung kurawal, semua{...}
string terdalam ditransformasikan ke dalam+-
urutan yang sesuai sementara karakter selain|{}
diubah menjadi spasi. Pada akhirnya, kawat gigi perantara diubah menjadi pipa.sumber
Brainfuck, 423 byte
Diformat dengan beberapa komentar:
Cobalah online.
Mengharapkan input diformat seperti
(((((4 3 2 1))))(((3 2 1)))((2 1))(1))
dengan baris baru yang tertinggal, dan menghasilkan output dari form:Ide dasarnya adalah menghitung karakter mana yang akan dicetak berdasarkan kedalaman sarang. Format output sedemikian rupa sehingga indeks baris batas atas kotak sama dengan kedalaman array yang sesuai, dengan simetri melintasi baris tengah.
Rekaman ini dibagi menjadi 7-sel node, dengan masing-masing node mewakili kolom dalam output.
Loop pertama mengkonsumsi input dan menginisialisasi node, melacak kedalaman dan apakah kolom sesuai dengan tanda kurung (yaitu, apakah kolom berisi perbatasan vertikal), dan mengecilkan kejadian
)(
menjadi node tunggal.Loop berikutnya menghasilkan satu baris per iterasi. Di dalam loop ini, loop lain melintasi node dan mencetak satu karakter per iterasi; disinilah sebagian besar pekerjaan dilakukan.
Selama loop inisialisasi, tata letak memori sebuah node pada awal iterasi adalah
x d 0 c 0 0 0
di mana
x
adalah sebuah boolean flag untuk apakah char sebelumnya adalah kurung penutup,d
adalah depth (plus satu), danc
merupakan karakter saat ini.Selama loop pencetakan karakter, tata letak memori sebuah simpul di awal iterasi adalah
0 0 d1 d2 c p y
di mana
d1
menunjukkan kedalaman dibandingkan dengan indeks baris untuk bagian atas;d2
mirip dengand1
tetapi untuk bagian bawah;c
adalah karakter input untuk kolom itu jika angka atau spasi, jika tidak nol;p
menunjukkan fase, yaitu bagian atas, tengah, atau bawah; dany
merupakan bendera yang disebarkan dari kiri ke kanan, melacak apakah kita telah mencapai baris tengah. Perhatikan bahwa karenay
menjadi nol setelah memproses sebuah simpul, kita dapat menggunakany
sel dari simpul sebelumnya untuk mendapatkan lebih banyak ruang kerja.Pengaturan ini memungkinkan kita untuk tidak secara eksplisit menghitung kedalaman maks selama fase inisialisasi; yang
y
bendera back-disebarkan untuk memperbaruip
sel-sel sesuai.Ada
-1
sel di sebelah kiri node untuk memudahkan navigasi, dan ada sel di sebelah kanan node yang melacak apakah kita telah mencetak baris terakhir.sumber
PHP + HTML, tidak bersaing (
170141135130 byte)disimpan 29 byte yang terinspirasi oleh SteeveDroz
tidak bersaing karena tidak ada keluaran ascii dan karena saya membiarkan browser melakukan semua pekerjaan yang menarik
sumber
<b>
tag alih-alih<div>
dan Anda tidak perlu menentukan warnaborder
. (Menyimpan 9 byte)<b>
, saya juga dapat menghapuswhite-space
atribut, menyimpan 19 byte lagi. besar! Dan saya bisa menggantinyapadding
denganmargin
JavaScript (ES6), 221
Fungsi non rekursif mengembalikan array string (masih menggunakan subfungsi rekursif di dalamnya)
Ini berfungsi dalam 2 langkah.
Langkah 1: secara rekursif membangun representasi string dari array input bersarang. Contoh:
[[[1, 2, 3], [],[4, 5]], [6, 7, 8]]
->"OOO1 2 3,,4 5C,6 7 8CC"
O
danC
tandai buka dan tutup subarray. Subarrays numerik sederhana dirender dengan elemen yang dipisahkan oleh spasi, sedangkan jika anggota array adalah subarrays mereka dipisahkan oleh koma. String ini terus melacak dari struktur bertingkat dari array input, sementara aku bisa mendapatkan barisan tengah output hanya menggantiOC,
dengan|
. Sementara secara rekursif membangun string temp ini, saya juga menemukan level kedalaman max dan menginisialisasi array string kosong yang akan berisi bagian atas setengah dari output.Catatan: kotak luar itu rumit, saya menyarang input di dalam array luar lain, maka saya telah menjatuhkan baris pertama dari output yang tidak diperlukan
Langkah 2: memindai string temp dan membangun output
Sekarang saya memiliki array string kosong, satu untuk setiap level. Saya memindai string temp, melacak level saat ini, yang meningkat untuk masing-masing
O
dan menurun untuk masing-masingC
. Saya memvisualisasikan ini seperti itu:Plus yang naik dan turun mengikuti level saat ini
Untuk setiap karakter, saya menambahkan karakter ke setiap baris output, mengikuti aturan:
- jika digit atau spasi, beri tanda '-' di level saat ini dan di bawah, beri spasi di atas
- selain itu, beri tanda '+' di level saat ini, beri tanda '-' jika di bawah dan beri tanda '|' jika di atas
Selama pemindaian temp, saya juga membuat baris tengah diganti
OC,
dengan|
Pada akhir langkah ini, saya memiliki bagian atas dan baris tengah, saya hanya perlu mirror bagian atas untuk mendapatkan bagian bawah dan saya sudah selesai
Lebih sedikit golf, kode komentar
)
Uji
sumber
Ruby,
245241 byteBiaya overhead yang diperlukan untuk membungkus semuanya dalam kotak serta menyelaraskan semuanya cukup berat ...
Output array string, dengan satu string per baris, sesuai spesifikasi. Selaras bawah, bukan pada kasus uji sampel selaras atas karena menghemat 1 byte.
Cobalah online!
sumber
PHP, 404 Bytes
Semua solusi bekerja dengan kedalaman maksimum array lebih rendah dari 10. untuk nilai yang lebih besar kedalaman harus disimpan dalam array dan bukan dalam sebuah string.
Diperluas
untuk 425 Bytes kita bisa membuatnya dengan REGEX
Diperluas
455 Bytes untuk solusi rekursif
Diperluas
sumber
$j!="]"?:$c--;
->$c-=$j=="]";
(-2). 2)($l=="]"?"":" ")
->" "[$l==$j]
(-5). Pergantian yang paling mirip di loop kedua. 3)if($r!=""){$n.=$r;$d.=+$c;}
->$n.=$r;if($r>"")$d.=+$c;
(-3). 4)$l=$j;$j!="["?:$c++;
->$c+="["==$l=$j;
(-5). 5)$x=0
tidak diperlukan (-4). 6)for($y=0;$y<$m;$y++)
->for($y=$m;$y--;)
(-4). 7)join("\n",$z),"\n$n\n".(join("\n",array_reverse($z)));
->join("\n",array_merge($z,[$n],array_reverse($z)));
(-4) 8) spasi putih yang tidak perlu:foreach($e[0]as$f)
(-1)($j==",")
(-2). 10)if($r>"")$d.=+$c;
->$d.=$r>""?+$c:"";
(-0)$d.=$l?$t;
sudah usang (-10) 2)$s.=$l?"|":"";return$s;
->return$s."|"[$l];
(-6). 3) kawat gigi usang{$e=v($v,$t+1,$k+1==$c);}
(-2). 4){$e=$v." "[$k+1==$c];$d.=str_pad("",strlen($e),$t+1);}
->$d.=str_pad("",strlen($e=$v." "[$k+1==$c]),$t+1);
(-5).