Anda akan diberi array bersarang. Program Anda harus memvisualisasikan array.
Tapi bagaimana caranya?
Misalnya, mari kita asumsikan kita memiliki array bertingkat, seperti [["1","2"],[["1","2"],"3"],"4",[[[["5"]]]],"6"]
.
Array bersarang ini dapat divisualisasikan sebagai:
->1
->2
-->1
-->2
->3
>4
---->5
>6
Contohnya
Input 1:
["Atom",["Proton",["Up Quark", "Up Quark", "Down Quark"], "Neutron", ["Up Quark", "Down Quark", "Down Quark"], "Electron"]]
Output 1:
>Atom
->Proton
-->Up Quark
-->Up Quark
-->Down Quark
->Neutron
-->Up Quark
-->Down Quark
-->Down Quark
->Electron
Input 2:
[["1","2"],["3","4"]]
Output 2:
->1
->2
->3
->4
Aturan
- Anda dapat menggunakan string (atau tipe lain yang berfungsi seperti array bersarang) sebagai input.
- Level maksimum "lapisan" adalah 2 ^ 32-1.
code-golf
printable-ascii
Matthew Roh
sumber
sumber
Jawaban:
APL, 32 byte
Uji:
Penjelasan:
{
...}∘0
: jalankan fungsi berikut dengan0
terikat ke⍵
:1=≡⍺:
: jika input memiliki kedalaman 1 (yaitu array yang tidak mengandung array lain):⍵/'->'
: buat string yang mengandung⍵
-
s dan⍵
>
s,1↓
: jatuhkan elemen pertama,⍵↑
: dan ambil⍵
elemen pertama . Ini menghasilkan string yang berisi⍵-1
tanda hubung dan satu>
.⍺,⍨
: tambahkan input ke dalamnya,⎕←
: dan output ke layar⋄
: jika tidak,⍺∇¨⍵+1
: tambahkan 1 ke⍵
dan terapkan fungsi ke setiap array bersarangsumber
('Atom' ('Proton' ('Up Quark' 'Up Quark' 'Down Quark') 'Neutron' ('Up Quark' 'Down Quark' 'Down Quark') 'Electron'))
.Mathematica,
585756 byteTerima kasih kepada Greg Martin untuk menghemat 1 byte.
Terima kasih kepada ngenisis karena telah menghemat 1 byte.
sumber
Java 7,
153141114 byte-39 byte terima kasih kepada @ Barteks2x
Penjelasan:
Kode uji:
Coba di sini.
Keluaran:
sumber
for(int j=i;j-->0;r+="-");
untuk juga melakukan apa yang dilakukan baris berikutnya, dan menggunakan argumen generik alih-alih Obyek []:String r="";<T>String c(int i,T[] o){for(T x:o)if(x instanceof Object[])c(i+1,(T[])x);else for(int j=i;j-->=0;r+=j<0?">"+x+"\n":"-");return r;}
Dan bahkan 1 karakter lebih sedikit jika melewati 1 bukannya 0 sebagai yang pertama argumennya ok.[]
dari parameter untuk menyimpan 1 byte tambahan memberikan kesalahan. Lihat kesalahan di sini di > Debug setelah menjalankan.String r="";<T>String c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return r;}
ini bekerja. Anda juga dapat melakukan trik generik yang sama dengan string untuk menyimpan byte tambahan tetapi mengharuskan baik menyimpan hasil dalam variabel sebelum mencetaknya, atau gips eksplisit (panggilan metode ambigous):String r="";<T,S>S c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return(S)r;}
String r="";<T,S>S c(S p,T a){for(T x:(T[])a)if(x instanceof Object[])c("-"+p,x);else r+=p+">"+x+"\n";return(S)r;}
Dan persyaratan untuk string yang dilemparkan pada tipe pengembalian saat memanggil itu hilang.PHP,
77 7473 byte4 byte disimpan berkat @manatwork.
fungsi rekursif, membutuhkan PHP 7.1 atau lebih baru untuk indeks string negatif.
"$e"
adalahArray
untuk array; begitu"$e"!=$e
juga denganis_array($e)
.>
-
ke awalan untuk setiap levelsumber
function f($a,$p=""){foreach($a as$e)echo$p,is_array($e)?f($e,"-"):">$e\n";}
is_array($e)
bisa diganti dengan$e[-1]!==""
.$e[-]==""
... dan dengan kondisi terbalik$e[-1]>""
. Temuan yang bagus!$e[-1]>""
bisa diganti"$e"==$e
. Setidaknya dalam PHP 5.6 kuno saya gunakan.C99 (GCC),
201187140112109formulir diperluas:
Ini mengambil string dalam format yang benar dan berakhir ketika menemukan pencocokan terakhir
]
.Itu tidak menggunakan rekursi dan menggunakan tipe panjang untuk benar - benar mencapai aturan kedua: 2 ^ 32-1 level . Sebagian besar bahasa scripting memiliki kedalaman rekursi terbatas atau hanya crash pada stack overflow.
Saya tidak terbiasa bermain golf di C, bantuan apa pun dihargai :)
Terima kasih di bolov untuk tipsnya! Terima kasih khusus kepada Titus yang selalu siap untuk bermain golf (bahkan di C)!
Dua byte lainnya disimpan oleh fakta bahwa kita dapat menyelesaikan setelah kita mencocokkan yang terakhir
]
dan tidak perlu mencocokkan char null.Itu dapat diuji di Wandbox .
sumber
for(int d=1 ...
?long
memiliki 4 karakter sementaraint
hanya memiliki 3, dan tidak ada alasan bahwa Anda perlu membuatnya di atas2^32 - 1
untuk pengiriman Anda untuk menjadi valid, menghemat satu byte.2^31-1
.The maximum level of "layers" is 2^32-1.
.2^31-1
jauh lebih sedikit dari2^32-1
.2^32-1
tidak pasint
sementara cocokunsigned
ataulong
(itu pada kebanyakan sistem / kompiler tentu saja). Karenanyaint
tidak akan membuat jawaban yang benar (seperti kebanyakan jawaban di sini gagal menjadi).JavaScript (ES6),
5851 byteSunting: Disimpan 7 byte ketika @Arnauld menunjukkan bahwa saya dapat menggabungkan dua pendekatan saya.
sumber
PHP,
129 123 112 109 95 9591 bytesolusi iteratif mengambil string dari STDIN:
Jalankan dengan
echo '<input>' | php -nR '<code>'
atau coba online .kerusakan
Senang bahwa jumlahnya ada dalam tanda kutip; jadi saya hanya perlu satu tindakan pada satu waktu.
ASCII mengutak-atik
Menambahkan 3 tanda hubung ke
$p
dan menghapus 2 untuk[
, 4 untuk]
menambahkan satu untuk[
dan menghapus satu untuk]
.sumber
Python 2,
6564 byteRight now my answer consistently starts with no dashes, so
["foo", "bar"]
is:sumber
import sys, pprint; pprint.pprint(sys.argv)
is 43 bytes but I do not know if it breaks code golf rules.f=lambda o,d=0:o<''and'\n'.join(f(e,d+1)for e in o)or'-'*d+'>'+o
import sys, pprint.pprint as p; p(sys.argv)
is still 43 but a good suggestion none the less ;D Tryingimport sys.argv as v
actually lengthens it somewhat ~48 bytes. If one could eliminate sys.argv they'd save alot but the program becomes quite useless then. A recursive approach is quite long,def p(L,d=0): [p(i,d+1) if isinstance(i,list) else print(">"*d + i) for i in L]
, ~80 bytes.Perl 5, 55 bytes
53 bytes of code +
-nl
flags.Try it online!
Not optimal for regex because of some edgy cases that could potentially occur (in particular, if an element of the array contains brackets inside).
A recursive anonymous function would be barely longer though (61 bytes):
Try it online!
But the way Perl deals with parameters isn't optimal for golfing functions: no optional parameters means I have to do a second function (anonymous) calling the first one, and I have to explicitly get the last parameter with that long
my$v=pop
.sumber
Ruby,
49 4546 bytesExample:
Explanation:
Recursive function: if
x==[*x]
then x is an array, and we iterate over it. If not, indent it.sumber
Haskell, 104 bytes
Haskell doesn't have nested lists with different depths, so I have to parse the input string on my own. Luckily the library function
reads
can parse Strings (i.e."
-enclosed char sequence), so I have a little help here.Usage example:
Try it online!.
How it works:
The function
#
goes through the string char by char and keeps the nesting level (the first parameterl
) as a string of-
with a final>
. If the head of the list can be parsed as a String, takel
and the String followed by recursive call with the String removed. If the first char is a Space, skip it. If it's a,
, take a newline and go on, if it's]
, lower the nesting level and go on and else (only[
left) raise the nesting level and go on. Recursion ends with the empty input string. The main function(">"#)
sets the nesting level to">"
and calls#
.sumber
SWI-Prolog, 115 byte
Jeda baris ditambahkan hanya untuk keterbacaan, tidak termasuk dalam jumlah byte.
p
predikat secara rekursif melintasi array, menambahkan '-' ke awalanF
saat memindahkan level lebih dalam.w
digunakan untuk menulis array awalan serta elemen aktual ke output.Contoh:
sumber
Batch, 249 byte
Mengganggu Batch mengalami kesulitan membandingkan koma. Contoh dijalankan:
sumber
Retina ,
635452 byteDisimpan 2 byte berkat Martin Ender
Cobalah online!
Penjelasan
Pertama, array dipecah dengan mengganti setiap string yang dikutip dengan semua yang datang sebelumnya, ditambah dirinya sendiri, ditambah dengan baris baru. Dengan memecahnya seperti ini, dimungkinkan untuk menemukan kurung pembuka yang tidak cocok sebelum setiap string.
Transliterasi ini akan diganti
[
dengan-
, biarkan]
tidak berubah, dan hapus semua karakter lain (-~
semuanya dapat dicetak ASCII). Namun, itu hanya menggantikan karakter yang muncul sebelum string terakhir pada setiap baris.Selanjutnya semua instance
-]
dihapus. Ini sesuai dengan pasangan braket yang cocok, dan kami hanya ingin tanda kurung yang tidak cocok. Setelah ini dihapus, setiap baris memiliki jumlah-
s sama dengan berapa banyak kurung pembuka yang tidak cocok datang sebelum itu.Terakhir
-
sebelum a"
diganti dengan>
, untuk membentuk panah.Akhirnya, semua yang tersisa
]
dan"
s akan dihapus.sumber
Röda , 54 byte
Cobalah online!
Ini adalah fungsi yang membaca array input dari aliran. Untuk setiap item, ia memanggil dirinya sendiri secara rekursif atau mencetak item.
sumber
Python 3, 80 Bytes
Lambda Python mendukung rekursi, siapa tahu?
Ini adalah balasan / pujian untuk jawaban orlp .
sumber
=
. Saya juga curiga Anda bisa menjatuhkan semua spasi setelah ketiganya)
, tapi saya tidak terlalu terbiasa dengan bermain golf di Python.Groovy, 92 byte
sumber
Ditumpuk , 27 byte
Cobalah online!
Mengambil input dari atas tumpukan dan membiarkan output pada STDOUT. Ini sederhana seperti melakukan peta kedalaman, mengulangi
-
d
waktu, menyatu dengan '>' dan elemen itu sendiri.sumber
Gema, 63 karakter
Seperti solusi penguraian lainnya, anggap tidak akan ada tanda kutip ganda yang lolos.
Contoh dijalankan:
sumber
jq,
7067 karakter(
6764 karakter kode + 3 opsi opsi baris perintah)Contoh dijalankan:
Tes online
sumber