Tantangan sederhana untuk Senin malam Anda (yah, atau Selasa pagi di belahan dunia lain ...)
Anda diberi input array bertumpuk, bilangan bulat positif yang berpotensi acak-acakan:
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]
Tugas Anda adalah menentukan kedalamannya, yang merupakan kedalaman bersarang terbesar dari semua bilangan bulat dalam daftar. Dalam hal ini, kedalaman 11
adalah 6
, mana yang terbesar.
Anda dapat mengasumsikan bahwa tidak ada array yang kosong.
Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter function (out).
Input dapat diambil dalam format string atau daftar yang nyaman yang mendukung array non-persegi panjang (dengan array bersarang dari kedalaman berbeda), selama informasi aktual tidak diproses sebelumnya.
Anda tidak boleh menggunakan built-in yang terkait dengan bentuk array (termasuk built-in yang menyelesaikan tantangan ini, yang memberi Anda dimensi array bersarang). Satu-satunya pengecualian untuk ini adalah mendapatkan panjang array.
Aturan standar kode-golf berlaku.
Uji Kasus
[1] -> 1
[1, 2, 3] -> 1
[[1, 2, 3]] -> 2
[3, [3, [3], 3], 3] -> 3
[[[[1], 2], [3, [4]]]] -> 4
[1, [[3]], [5, 6], [[[[8]]]], 1] -> 5
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14] -> 6
[[[[[[[3]]]]]]] -> 7
sumber
≡
apakah primitif bawaan APL untuk ini .\
dalam input? EDIT: nevermind baru saja mencobanya. Itu bahkan tidak berhasil. Sial, bisakah saya tidak menggunakan CMD args?Jawaban:
K, 4 byte
Di K,
,/
akan bergabung dengan semua elemen daftar. Ungkapan umum,//
beralih ke titik tetap, meratakan daftar bersarang semena-mena sepenuhnya.,/\
akan beralih ke titik yang tetap dengan cara yang sama, tetapi mengumpulkan daftar hasil antara. Dengan menghitung berapa banyak hasil antara yang kami kunjungi sebelum mencapai titik tetap (#
), kami mendapatkan jawaban yang kami inginkan: kedalaman bersarang maksimum."Hitungan gabungan pemindaian titik tetap".
Dalam aksi:
sumber
Retina , 10
Di sini format input agak dibuat-buat -
_
karakter digunakan untuk pemisah daftar, sehingga input akan terlihat seperti ini{1_{{2_3_{{4}_5}_6_{7_8}}_9_{10_{{{11}}}}_12_13}_14}
}{
dan semua\w
karakter lainnya . Ini memiliki efek a) membuat semua daftar di semua tingkatan hanya terdiri dari satu elemen dan b) menghapus semua karakter non-daftar-struktural.{
. Ini memberikan tingkat bersarang yang paling dalam.Cobalah online.
Jika itu terlalu banyak, maka jawaban sebelumnya adalah:
Retina , 13
Asumsi daftar terkandung dalam kurung kurawal
{}
.Cobalah online .
sumber
_
alih-alih,
tetapi itu mungkin sedikit peregangan._
pemisah mungkin terlalu dibuat-buat. Jadi saya meninggalkan kedua versi dalam jawabanPython 2, 33 byte
Secara rekursif mendefinisikan kedalaman dengan mengatakan kedalaman angka adalah 0, dan kedalaman daftar adalah satu lebih dari kedalaman maksimum elemen-elemennya. Angka vs daftar diperiksa dengan membandingkan ke kamus kosong
{}
, yang jatuh di atas angka tetapi di bawah daftar pada pemesanan sewenang-wenang Python 2 untuk tipe bawaan.sumber
Pyth -
11107 byte1 byte disimpan berkat @Dennis
4 byte disimpan berkat @Thomas Kwa
Cobalah online di sini .
Terus menjumlahkan array sampai berhenti berubah, yang berarti hanya angka, apakah ini secara kumulatif untuk menyimpan semua hasil antara dan mendapatkan panjang dengan membuat urange dengan panjang yang sama dengan daftar dan mengambil elemen terakhir.
sumber
m!!d
bisa menjadi&R1
.l
tidak diizinkan di OP.Haskell, 43 byte
Contoh penggunaan:
maximum.scanr(#)0 $ "[1, [[3]], [5, 6], [[[[8]]]], 1]"
->5
.Haskell tidak memiliki daftar campuran (
Integer
campur denganList of Integer
), jadi saya tidak dapat mengeksploitasi beberapa fungsi deteksi daftar dan saya harus menguraikan string.Saya mulai dari kanan dengan
0
dan menambahkan 1 untuk setiap]
, kurangi 1 untuk setiap[
dan pertahankan nilai sebaliknya.scanr
menyimpan semua hasil antara, jadimaximum
bisa lakukan itu berfungsi.sumber
JavaScript (ES6), 35 byte
Penjelasan
Fungsi rekursif yang mengembalikan kedalaman maksimum array, atau
0
jika melewati angka.sumber
MATL , 11
14 15byteKurung kurawal digunakan dalam MATL untuk jenis array ini. Bagaimanapun, input diambil dan diproses sebagai string, sehingga tanda kurung sama-sama dapat digunakan, memodifikasi dua karakter dalam kode.
Cobalah online!
sumber
Oktaf, 29 byte
Peta
[
ke 1 dan]
-1, lalu ambil jumlah kumulatif maksimum.Input adalah string dari formulir
Sampel dijalankan pada ideone .
sumber
{
,}
? Setara oktaf dengan array di OP adalah array sel, saya pikirJulia,
5526 byteIni adalah fungsi rekursif yang menerima array satu dimensi dengan konten tipe
Any
dan mengembalikan integer. Saat mengirimkan array ke fungsi, awali semua tanda kurungAny
, yaituf(Any[1,Any[2,3]])
.Pendekatannya cukup sederhana. Untuk input a , kita kalikan a dengan 0 dan periksa apakah hasilnya skalar 0. Jika tidak, kita tahu bahwa a adalah array, jadi kita menerapkan fungsi ke setiap elemen a , ambil maksimum dan tambahkan 1.
Disimpan 29 byte berkat Dennis!
sumber
Ruby, 53 byte
Input dari STDIN, output ke STDOUT.
sumber
Jelly,
107 byteCobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
Memperbarui
Saat menulis jawaban ini, saya perhatikan bahwa Jelly bertingkah agak aneh untuk daftar acak-acakan, karena saya menghitung kedalaman daftar sebagai yang bertambah minimum yang kedalaman barang yang .
Ini telah diatasi dalam versi terbaru, sehingga kode berikut ( 6 byte ) akan berfungsi sekarang.
Ini menjumlahkan deretan array alih-alih menggabungkannya.
sumber
ŒḊ
lebih baru dari tantangan?Mathematica, 18 byte
sumber
Mathematica,
2720 byteFungsi rekursif sederhana.
sumber
If
, menghemat 7 byte. (Beri tahu saya jika Anda ingin sebuah petunjuk.)Replace
Solusi berbasis setidaknya selama ini ...Map
ping lebih integer adalah no-op:Max[#0/@#]+1&[0#]-1&
. The-1
juga dapat masuk ke dalam panggilan batin seperti...&[0#-1]&
.PHP, 61 byte
fungsi rekursif yang menggunakan dirinya sebagai fungsi pemetaan untuk mengganti setiap elemen dengan kedalamannya.
sumber
PHP,
8472646360 byteCatatan: membutuhkan PHP 7 untuk operator perbandingan gabungan. Juga menggunakan pengkodean IBM-850
Jalankan seperti ini:
[
dan]
$i
ke int. Offset string dilemparkan ke int secara implisitsumber
C,
9869 byteOff 29 byte terima kasih @DigitalTrauma !!
Mengambil string sebagai input dan mengembalikan hasilnya sebagai integer.
Contoh langsung di: http://ideone.com/IC23Bc
sumber
Python 3,
4239 byte-3 byte terima kasih kepada Sp3000
Ini pada dasarnya adalah port dari solusi Python 2 xnor :
Sayangnya,
[] > {}
mengembalikanunorderable types
kesalahan, sehingga trik pintar xnor tertentu tidak dapat digunakan. Sebagai gantinya,-0123456789
lebih rendah dalam nilai ASCII daripadaA
, yang lebih rendah dari[]
, karenanya perbandingan string berfungsi.sumber
CJam (15 byte)
Demo online
Pembedahan
Untuk panjang yang sama tetapi lebih banyak di wilayah hack jelek,
sumber
s/ugly/beautiful/
'[,-
untuk melepas string ke[]
, yang bergantung pada konten yang terbatas. Pendekatan yang meratakan berfungsi terlepas dari isi array.Sed, 40 karakter
(39 karakter kode + 1 opsi baris perintah karakter.)
Input: string, output: nomor unary.
Contoh dijalankan:
Sed, 33 karakter
(32 karakter kode + 1 opsi opsi perintah karakter.)
Jika spasi tambahan diizinkan dalam output.
Input: string, output: nomor unary.
Contoh dijalankan:
sumber
Hexagony , 61 byte
Sunting : Terima kasih @Martin Ender ♦ karena telah menyelamatkan saya 1 byte dari trik -1 yang luar biasa!
Cobalah online untuk memverifikasi kasus uji!
Gambar di bawah ini tidak dimodifikasi tetapi alirannya pada dasarnya sama. Perhatikan juga bahwa ini akan kembali
-1
jika input bukan array (yaitu tanpa[]
).Saya punya banyak no-op di dalam Hexagon ... Saya kira itu pasti bisa golf lebih.
Penjelasan
Secara singkat, ia menambahkan
-1
ketika bertemu[
dan menambahkan1
ketika bertemu a]
. Akhirnya mencetak max yang didapatnya.Mari kita jalankan sepanjang Test Case 5 untuk melihat perilakunya ketika ia berjalan di sepanjang String
[1, [[3]], [5, 6], [[[[8]]]], 1]
:Itu dimulai dari awal dan mengambil inputnya di sudut W:
Karena masih ada input (bukan karakter nol
\0
atau EOL), ia membungkus ke atas dan memulai jalur merah.Inilah yang terjadi ketika dari sana sampai lucu
><
:,
membaca[
ke Buffer, dan{
danZ
menetapkan konstanta Z menjadi 90.'
pindah ke Diff dan-
menghitung perbedaannya. Untuk[
dan]
perbedaannya akan1
dan3
masing - masing. Untuk angka, spasi, dan koma, hasilnya negatif.Kemudian kita jalankan
(
dua kali (sekali di ujung jalur merah, satu di awal setelah membungkus di jalur hijau) untuk mendapatkan-1
dan1
menghormati[
dan]
. Di sini kita mengubah penamaanDiff
menjadiValue
. Tambahkan Nilai ini ke Kedalaman. (Saya duluZ&
memastikan bahwa itu menyalin tetangga yang tepat). Lalu kami menghitunglastMin - Depth
dan mendapat nomor di Memory edgeminLR
.Kemudian kami menerapkan
&
(di ujung jalur hijau) keminLR
: Jika angkanya <= 0, ia menyalin nilai kiri (yaitulastMin - Depth <= 0 => lastMin <= Depth
), jika tidak maka akan mengambil nilai yang benar.Kami membungkus ke jalur biru horisontal dan kami melihat
Z&
lagi yang menyalinminLR
. Lalu kami"&
dan membuat salinan dari min yang dihitung. Kurung diasumsikan seimbang, jadi min harus <= 0. Setelah membungkus, jalur biru ke kiri dan tekan(
, membuat salinan1
kurang dari min sebenarnya. Menggunakan kembali-
, kami membuat satu salinan 1-off lagi sebagai tetangga Buffer:Catatan:
copy
diganti namanya menjadi1-off
Ketika jalur biru hits
\
dan mendapat bagus"
dan<
menangkapnya kembali ke loop utama.Ketika loop menyentuh
1
,,
atauatau nomor lain sebagai input:
Diff akan menjadi negatif dan dipantulkan kembali ke loop utama untuk input selanjutnya.
Ketika semuanya telah melalui loop utama, kita mencapai EOL yang membuat Buffer
-1
dan akhirnya menuju ke tepi bawah:'
memindahkan MP ke1-off copy
dan)
menaikkannya, dan dengan~
negasi itu mendapat nilai Kedalaman Max yang benar yang dicetak dengan!
Dan ceritanya berakhir dengan a
@
.Saya kira saya pasti memiliki sedikit masalah rumit. Jika saya harus hanya "mundur" dan "mencetak" tanpa penambahan dan negasi, saya akan menghemat 2 byte tanpa menggunakan Hexagon penuh.
Terima kasih banyak kepada Timwi untuk IDE Esoterik dan Hexagony Colorer !
sumber
-1
dari,
dengan mengubah baris terakhir ke:@!-".
(walaupun saya setuju bahwa mungkin untuk mengurangi lebih banyak atau bahkan memasukkannya ke dalam panjang sisi 4 dengan beberapa restrukturisasi).Z
dari penggunaanZ&
. Dan harus ada cara yang lebih baik untuk memulai program dengan implisit jika.brainfuck, 48 byte
Diformat:
Mengambil input yang diformat seperti
(1, ((3)), (5, 6), ((((8)))), 1)
dan menghasilkan nilai byte .Cobalah online.
Ini menyimpan kedalaman berdasarkan lokasi memori, menggerakkan pointer ke kanan
(
dan ke kiri untuk)
dan mengabaikan karakter lain. Sel yang dikunjungi ditandai dengan1
bendera, sehingga pada akhir loop utama akan adadepth + 1
bendera di sebelah kanan sel saat ini. Ini kemudian ditambahkan untuk mencetak hasil akhir.Solusi 69 byte sebelumnya menggunakan pendekatan yang berbeda:
Dalam versi ini, kedalaman dan kedalaman maks disimpan secara eksplisit dalam sel.
sumber
Pyth,
1513 byte-2 byte oleh @Maltysen
Menghitung selisih antara jumlah kumulatif
[
dan]
, dan mengambil maksimum.Y
adalah array kosong, dan representasi stringnya (`
) dengan mudah[]
.Coba di sini .
sumber
CJam, 19
22 23byteIde serupa dengan jawaban MATL saya.
Terima kasih kepada Peter Taylor untuk menghapus 3 byte
Coba di sini
sumber
Perl 5, 34 byte
32, ditambah dua untuk
-p
Dicuri dari Digital Trauma 's Retina jawabannya ... yang merupakan 26% lebih pendek dari ini.
:-)
Atau, sama:
sumber
]
tidak perlu melarikan diri, kecuali dalam tanda kurung.s&...&...&g
adalah operator substitusi. Lihat perldoc.perl.org/perlop.htmlRuby, 51 karakter
(Dimulai sebagai perbaikan saran untuk Doorknob 's Ruby jawaban tapi berakhir berbeda. Jadi saya diposting sebagai jawaban yang terpisah. Upvotes untuk ide kedalaman penghitungan (
?\\<=>$&
, turun dari'] ['.index(c)
) harus pergi ke jawaban asli.)Input: string, output: angka.
Contoh dijalankan:
sumber
Perl 6, 53 byte
Penutupan:
Membutuhkan argumen, misalnya:
Penjelasan:
sumber
Minkolang 0,15 ,
312924 byteMerombak algoritma saya berdasarkan inspirasi oleh jawaban CJam Luis Mendo dan menyelamatkan 5 byte!
Coba di sini!
Penjelasan
Pada dasarnya, apa yang dilakukan kode ini adalah menjaga total berjalan dengan +1 untuk masing-masing
[
dan -1 untuk masing-masing]
, melacak nilai maksimum yang dicapai, menghasilkan maksimum pada akhir. Looping ditangani oleh sifat toroidal dari kotak kode Minkolang.sumber
Ruby, 41 karakter
Parameter: array, return: number.
Contoh dijalankan:
sumber
Oracle SQL 11.2, 133 byte
Tidak bermain golf
CONNECT BY membuat satu baris per karakter dalam string input.
SUBSTR mengisolasi karakter yang sesuai dengan nomor baris.
DECODE menerjemahkan setiap '[' ke 1, masing-masing ']' menjadi -1 dan setiap karakter lainnya menjadi 0.
SUM analitik menjumlahkan masing-masing 1, -1 dan 0 dari baris sebelumnya, termasuk baris saat ini;
Jumlah MAX adalah kedalaman.
sumber
Java 8, 95
Ini adalah ungkapan lambda untuk a
ToIntFunction<String>
. Input diambil sebagaiString
dalam format contoh OP.cukup jujur. Pisahkan string menggunakan
[
sebagai pembatas. Untuk masing-masing, tambahkan penghitunge
dan bandingkan dengan penghitungd
, pertahankan yang lebih besard
. Kemudian pisahkan string iterasi saat ini menggunakan]
sebagai pembatas saat ini dan kurangi jumlah pemisahan tambahan darie
.sumber