Terinspirasi oleh Temukan "ukuran membuka" daftar .
Tentukan Ukuran Rekursif RS
, dari daftar yang tidak berisi daftar sebagai panjangnya (jumlah item yang terkandung) dan Ukuran Rekursif dari daftar yang berisi daftar apa pun sebagai jumlah dari panjangnya dan Ukuran Rekursif dari daftar tersebut.
Tantangan
Tulis program atau fungsi yang menampilkan Ukuran Rekursif dari daftar yang diberikan dalam sesedikit mungkin byte.
Input adalah daftar dan dapat berisi angka, string (jika bahasa Anda memilikinya), dan daftar serupa.
Sebagai contoh:
RS([]) = 0
RS([[]]) = 1
RS([4, 5, 6]) = 3
RS(["four", "five", "six"]) = 3
RS(["[[[[]]]]", "[][][][][]", "][][[[]]][]["]) = 3
RS([[4, 5, 6]]) = 4
RS([["four", "five", "six"]]) = 4
RS([["[[[[]]]]", "[][][][][]", "][][[[]]][]["]]) = 4
RS([[4], [5], [6]]) = 6
RS([["four"], ["five"], ["six"]]) = 6
RS([["[[[[]]]]"], ["[][][][][]"], ["][][[[]]][]["]]) = 6
RS([[[[[[[[[]]]]]]]]]) = 8
RS([[],[],[],[],[],[],[],[]]) = 8
RS([[],[],[[]],[[[[]]]]]) = 8
RS([0,[-1],[2.3,-4.3],[5,[6]],[7,[8,9,[10,11,[12,13,14]]]]]) = 22
Perhatikan bahwa jika bahasa Anda tidak memiliki string tetapi memiliki daftar karakter, contoh yang mengandung di "strings"
atas sebenarnya bisa berupa daftar karakter dan memiliki hasil yang lebih besar. Sebagai contoh:
RS([['f','o','u','r'], ['f','i','v','e'], ['s','i','x']]) = 14
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang; tidak ada bisnis lucu, seperti biasa.
Input non-daftar dapat menghasilkan output apa pun.
I / O sefleksibel biasanya .
sumber
Jawaban:
Jelly , 8 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Python, 42 byte
Untuk non-list, output 0. Untuk daftar, output panjangnya ditambah jumlah output rekursif untuk elemen-elemennya.
Daftar jatuh di atas angka dan di bawah string dalam pemesanan Python 2, membutuhkan
[]<=x<''
. Sebagai gantinya, kami memeriksax*0==[]
, sedangkan hasil0
untuk angka atau''
string.sumber
JavaScript (ES6),
3937 byteDisimpan 2 byte berkat @ edc65
sumber
f=a=>a.map?a.reduce((s,x)=>s+f(x),0):0
1
di suatu tempat di sana.f=a=>a.map&&a.map(x=>a-=~f(x),a=0)&&a
.-=~
adalah 1 char kurang dari+=1+
dan, mengkonversi boolean ke integer, itu memotong karakter lain. Menggunakan kembalia
untuk menghindari variabel globalt
Mathematica, 20 byte
Fungsi anonim. Mengambil ekspresi sebagai input dan mengembalikan angka sebagai output. Karakter Unicode adalah U + 221E INFINITY untuk
\[Infinity]
.Level[#,∞]
memberikan daftar subekspresi input, danLength@
menghitungnya.sumber
Mathematica, 14 byte
Modifikasi kecil dari jawaban saya sebelumnya . Seperti yang saya jelaskan di sana,
LeafCount
sudah menangani nilai-nilai atom bersarang, tetapi juga menghitung daftar terluar, yang perlu kita kurangi dari hasilnya.sumber
Perl, 34 byte
Fungsi rekursif! Yap, Perl tidak hanya memiliki regex tetapi juga memiliki fungsi!
Jika Anda ingin mengujinya, Anda dapat menjalankan sesuatu seperti:
sumber
Mathematica, 32 byte
Fungsi rekursif tanpa nama. Kutipan
#0/@#~Select~ListQ
memanggil fungsi lagi pada setiap elemen input yang merupakan daftar, danTr
merangkum nilai-nilai itu. Untungnya Mathematica baik-baik saja mengambil panjang daftar kosong dan mencari elemen-elemen yang memenuhi syarat dari daftar kosong, jadi tidak diperlukan kasing dasar.sumber
Haskell, 52 byte
Contoh penggunaan:
Haskell tidak mendukung daftar campuran (mis. Int dan daftar Int), jadi saya menggunakan tipe daftar kustom
L
yang merupakan elemen dari beberapa tipe a (->E a
) atau daftar Ls lainnya (->N[L a]
). Menghitung RS adalah rekursi sederhana di mana yangE
diperhitungkan1
danN
satu ditambah jumlah ukuran rekursif elemen-elemennya. Seluruh jumlah dimatikan oleh 1, jadi saya kurangi viapred
.Catatan: jenis dan nilai elemen yang tepat tidak penting untuk algoritme, sehingga kami dapat menghapus polimorfisme dan hanya menangani elemen abstrak saja
data L=E|N[L]
.sumber
Faktor, 105 byte
Fungsi rekursif g.
Tidak disatukan (agak):
Anda akan menemukan tidak ada panggilan untuk
length
karena alih-alih menggunakan panjang builtin, itu diterapkan melaluidrop 1
string dan non-urutan.sumber
Mathematica, 18 byte
Namun pendekatan Mathematica lainnya. Tidak sesingkat menggunakan built-in
LeafCount
tetapi masih cukup ringkas. Ini menggunakanMapAll
operator//@
yang memanggil fungsi pada setiap node ekspresi, dan kami menggunakan fungsi itu untuk menambah penghitungc
. Seperti dalamLeafCount
kasus ini, ini memberikan satu lebih dari yang kita butuhkan, karena itu menghitung kepala daftar luar juga, jadi kita mulai penghitung dari-1
.sumber
C # (Visual C # Interactive Compiler) , 50 byte
Cobalah online!
Menggunakan teknik yang sama dengan jawaban Java yang dikirimkan sebelumnya , tetapi memanfaatkan LINQ untuk mengurangi panjang jawaban.
Penjelasan:
sumber
05AB1E (warisan),
2217 byteCobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Tantangan ini menimbulkan banyak tantangan untuk diatasi di 05AB1E:
λ
), itu hanya berguna untuk urutan bilangan bulat. Ini jawaban saya sebagai contoh fungsi rekursif 05AB1E. Karena itu, saya harus mencari alternatif untuk melakukan panggilan rekursif, yang saya lakukan dengan meletakkan bagian dari kode dalam sebuah string, dan mengeksekusi string itu sebagai kode 05AB1E secara rekursif.isList
perintah di 05AB1E, jadi saya harus menggunakan beberapa solusi untuk memeriksa ini dengan memanfaatkan pembungkus ke dalam daftar, perataan yang dalam, dan periksa untuk kesetaraan.˜
adalah ratakan dalam yang menghilangkan semua lapisan dan membuat daftar multi-dimensi menjadi daftar tunggal dengan semua nilai paling dalam. (yaitu[[1,2],[[[3]],4]]
menjadi[1,2,3,4]
).Saya berakhir dengan kode di atas untuk mengatasi ketiga masalah di atas. Ini dibagi menjadi tiga bagian utama. Pertama, kami memiliki yang berikut ini:
String berisi kode berikut:
Peta digunakan sebagai ganti foreach-loop, karena peta memiliki implisit
y
, dan foreach-loop membutuhkan eksplisity
. Kami hanya peduli tentang itucounter_variable
.Dan akhirnya, setelah semua peta dan peta dalam selesai, kami akan:
sumber
R , 65 byte
Cobalah online!
Implementasi rekursif yang jelas dari spec.
sumber
C,
174167152 byteFungsi rekursif
f
, yang bocor memori ( 152 ):Rekursif
f
yang tidak bocor, menggunakan referensi, di 167 :Tidak Terkumpul:
"Tapi bagaimana," Anda bertanya, "dapatkah ini dijawab dalam C? Tentunya, tidak ada array yang dikelola dalam C, dan Anda tidak dapat benar-benar memiliki array heterogen ...?"
"Aha," jawab saya, "karena saya telah mengerjakan sistem" objek "sederhana untuk (GNU-ish) C11 dan ISO C ++ 11".
Program demo lengkap untuk fungsi ini adalah:
Saat ini, ia tinggal di sini dan Anda membutuhkan repo untuk menggunakannya.
Anda juga akan memerlukan pustaka hash Fowler-Noll-Vo,
libfnv
, yang dikompilasi untuk platform Anda. Ada dalam repositori itu dan Anda juga bisa mengambilnya di sini .Maka Anda bisa melakukannya
cc -DNODEBUG size.c path/to/libfnv.a -o size
.Implementasinya belum tentu efisien:
Tapi itu berhasil! Komit terakhir untuk dikuasai (yang dikompilasi oleh program ini) adalah 2 hari yang lalu, yang berarti pengajuan ini valid.
sumber
Aksioma 118 byte
ungolfed
hasil
sumber
APL (NARS), 24 karakter, 48 byte
Ini akan menjadi traslation litteral dari jawaban Aksioma 'saya' di sini ... Dalam APL daftar kosong akan menjadi ´⍬´ Zilde, yang Anda tunjukkan dengan ´ [] ´, ´⊂⍬´ adalah ´ [[]] ´, ´ 1 2 3´ adalah ´ [1,2,3] ´ ecc Beberapa tes:
untuk mencetak jenis hasil latihan yang kami ajukan, kami membutuhkan satu fungsi lainnya (kedua fungsi RS dan Rs boleh digunakan untuk latihan)
untuk melihat bagaimana muncul beberapa input kita menggunakan fungsi o:
cetak Zilde ini, dan satu daftar 8 Zilde:
sumber
Java, 96 byte
Cobalah online.
Penjelasan:
sumber
Attache , 21 byte
Cobalah online!
Ternyata pendekatan C # cukup singkat di Attache.
Alternatif
25 byte
f[x]:=#x+Sum!f=>IsArray\x
26 byte
f[x]:=#x+Sum[f=>IsArray\x]
35 byte
f:=Sum##{If[IsArray@_,1+f@_,1]}=>Id
35 byte
f:=Sum@Map[{If[IsArray@_,1+f@_,1]}]
37 byte
f[x]:=Sum[{If[IsArray@_,1+f@_,1]}=>x]
sumber
Clojure,
797751 byteInput harus berupa daftar, bukan vektor. Keduanya akan didukung dengan menggunakan
sequential?
.Sebelumnya:
sumber
Python, 72 byte
sumber
0
danif
,0
danelse
, dan)
danfor
.