Temukan "Ukuran Rekursif" dari Daftar


20

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 , jadi jawaban tersingkat dalam byte menang; tidak ada bisnis lucu, seperti biasa.

Input non-daftar dapat menghasilkan output apa pun.
I / O sefleksibel biasanya .



Apakah elemen-elemennya berupa string, angka, dan daftar rekursif?
xnor

Catatan: Membatasi konten daftar setelah beberapa diskusi. Saya telah mengedit pertanyaan untuk mencerminkan hal ini. Terima kasih kepada @xnor untuk masukannya!
Jonathan Allan

2
Saya merasa ini akan menjadi tantangan yang lebih baik tanpa harus mempertanggungjawabkan string. Itu hanya menambahkan byte ke beberapa bahasa IMO
Conor O'Brien

@ ConorO'Brien atau mungkin saya harus menjawabnya jika mereka ingin memperlakukan string sebagai daftar atau tidak. Sayangnya saya secara khusus bertanya kepada komunitas, "Apakah ada kasus tepi yang harus saya tambahkan?", Dan "Apakah ada klarifikasi definisi yang diperlukan?" dan tidak mendapat tanggapan di bak pasir selama sembilan hari ... dan sekarang saya kira pertanyaan seperti itu akan menjadi duplikat?
Jonathan Allan

Jawaban:


5

Jelly , 8 byte

߀-ŒḊ?‘S

Cobalah online!

Bagaimana itu bekerja

߀-ŒḊ?‘S  Main link. Argument: x

   ŒḊ?    If x has non-zero depth:
߀          Recursively map the main link over its elements.
  -         Else, yield -1.
      ‘   Increment all integers in the result.
       S  Compute the sum of the result.
          If x is an array, incrementing before adding is equivalent to computing
          the sum of the elements and the length.
          If x is an integer/character, incrementing -1 yields 0, as desired.

13

Python, 42 byte

f=lambda x:x*0==[]and len(x)+sum(map(f,x))

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 memeriksa x*0==[], sedangkan hasil 0untuk angka atau ''string.


6

JavaScript (ES6), 39 37 byte

Disimpan 2 byte berkat @ edc65

f=a=>a.map&&a.map(x=>a-=~f(x),a=0)&&a

38 byte:f=a=>a.map?a.reduce((s,x)=>s+f(x),0):0
Sethi

@ Seti Bukankah itu mengembalikan 0 untuk setiap input? Anda harus meletakkannya 1di suatu tempat di sana.
ETHproduksi

1
37: 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 kembali auntuk menghindari variabel globalt
edc65

@ edc65 Terima kasih, itu hebat!
ETHproduksi

5

Mathematica, 20 byte

Length@Level[#,∞]&

Fungsi anonim. Mengambil ekspresi sebagai input dan mengembalikan angka sebagai output. Karakter Unicode adalah U + 221E INFINITY untuk \[Infinity]. Level[#,∞]memberikan daftar subekspresi input, dan Length@menghitungnya.


Ledakan! Slam mencubit jawaban saya. Tapi saya belajar sesuatu yang baru :)
Greg Martin

5

Mathematica, 14 byte

LeafCount@#-1&

Modifikasi kecil dari jawaban saya sebelumnya . Seperti yang saya jelaskan di sana, LeafCountsudah menangani nilai-nilai atom bersarang, tetapi juga menghitung daftar terluar, yang perlu kita kurangi dari hasilnya.


4

Perl, 34 byte

Fungsi rekursif! Yap, Perl tidak hanya memiliki regex tetapi juga memiliki fungsi!

sub f{@_+f(map ref?@$_:(),@_)if@_}

Jika Anda ingin mengujinya, Anda dapat menjalankan sesuatu seperti:

perl -pE 'sub f{@_+f(map ref?@$_:(),@_)if@_}$_=f@{+eval}' <<< '[["four"], ["five"], ["six"]]'

3

Mathematica, 32 byte

Length@#+Tr[#0/@#~Select~ListQ]&

Fungsi rekursif tanpa nama. Kutipan #0/@#~Select~ListQmemanggil fungsi lagi pada setiap elemen input yang merupakan daftar, dan Trmerangkum 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.


2

Haskell, 52 byte

data L a=E a|N[L a]
r(N n)=1+sum(r<$>n)
r _=1
pred.r

Contoh penggunaan:

*Main> pred.r $ N[E 0,N[E(-1)],N[E 2.3,E(-4.3)],N[E 5,N[E 6]],N[E 7,N[E 8,E 9,N[E 10,E 11,N[E 12,E 13,E 14]]]]] 
22

Haskell tidak mendukung daftar campuran (mis. Int dan daftar Int), jadi saya menggunakan tipe daftar kustom Lyang merupakan elemen dari beberapa tipe a (-> E a) atau daftar Ls lainnya (-> N[L a]). Menghitung RS adalah rekursi sederhana di mana yang Ediperhitungkan 1dan Nsatu ditambah jumlah ukuran rekursif elemen-elemennya. Seluruh jumlah dimatikan oleh 1, jadi saya kurangi via pred.

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].


2

Faktor, 105 byte

Fungsi rekursif g.

: g ( o -- l ) [ dup [ sequence? ] [ string? not ] bi and [ [ g ] map sum 1 + ] [ drop 1 ] if ] map sum ;

Tidak disatukan (agak):

: g ( o -- l ) 
[ dup 
  [ sequence? ] 
  [ string? not ] 
  bi and 
  [ [ g ] map sum 1 + ] 
  [ drop 1 ] 
  if 
] map sum ;

Anda akan menemukan tidak ada panggilan untuk lengthkarena alih-alih menggunakan panjang builtin, itu diterapkan melalui drop 1string dan non-urutan.


2

Mathematica, 18 byte

(c=-1;++c&//@#;c)&

Namun pendekatan Mathematica lainnya. Tidak sesingkat menggunakan built-in LeafCounttetapi masih cukup ringkas. Ini menggunakan MapAlloperator //@yang memanggil fungsi pada setiap node ekspresi, dan kami menggunakan fungsi itu untuk menambah penghitung c. Seperti dalam LeafCountkasus ini, ini memberikan satu lebih dari yang kita butuhkan, karena itu menghitung kepala daftar luar juga, jadi kita mulai penghitung dari -1.


2

C # (Visual C # Interactive Compiler) , 50 byte

int f(Array a)=>a.Length+a.OfType<Array>().Sum(f);

Cobalah online!

Menggunakan teknik yang sama dengan jawaban Java yang dikirimkan sebelumnya , tetapi memanfaatkan LINQ untuk mengurangi panjang jawaban.

Penjelasan:

// f is a method that a accepts
// an array of any underlying type
int f(Array a)=>
  // include the length of the
  // current array in the total
  a.Length+
  // filter the current list to elements
  // that are also arrays
  a.OfType<Array>()
    // recursively call f on each child
    // array and add to cumulative total
    .Sum(f);

2

05AB1E (warisan), 22 17 byte

"ε¼D¸D˜Êi®.V"©.V¾

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Tantangan ini menimbulkan banyak tantangan untuk diatasi di 05AB1E:

  1. Meskipun 05AB1E memang memiliki fungsi rekursif sejak Elixir menulis ulang ( λ), 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.
  2. Juga tidak ada isListperintah di 05AB1E, jadi saya harus menggunakan beberapa solusi untuk memeriksa ini dengan memanfaatkan pembungkus ke dalam daftar, perataan yang dalam, dan periksa untuk kesetaraan.
  3. Dan ketiga, tidak ada rata untuk hanya satu level dari daftar multi-dimensi. Fungsi ratakan ˜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:

"..."        # Create a string with 05AB1E code
     ©       # Save this string in the register (without popping)
      .V     # Execute the string as 05AB1E code

String berisi kode berikut:

ε            # Map each value in the given list by:
             # (this uses the input-list implicitly with the initial call)
 ¼           #  Increase the counter_variable by 1
 D           #  Duplicate the map-value
             #   i.e. STACK "A" becomes "A","A"
             #   i.e. STACK [["B","C"]] becomes [["B","C"]],[["B","C"]]
  ¸          #  Wrap it into a list
             #   i.e. "A" → ["A"]
             #   i.e. [["B","C"]] → [[["B","C"]]]
   D         #  Duplicate that again
             #   i.e. STACK "A",["A"] becomes "A",["A"],["A"]
             #   i.e. STACK [["B","C"]],[[["B","C"]]]
             #    becomes [["B","C"]],[[["B","C"]]],[[["B","C"]]]
    ˜        #  Flatten it
             #   i.e. ["A"] → ["A"]
             #   i.e. [[["B","C"]]] → ["B","C"]
     Ê       #  Check if the wrapped and wrapped+flattened lists are NOT equal
             #   i.e. ["A"] and ["A"] → 0 (falsey)
             #   i.e. [[["B","C"]]] and ["B","C"] → 1 (truthy)
      i      #  If they are:
       ®     #   Push the string from the register
        .V   #   Execute it as 05AB1E code
             #   (this is basically our recursive call, mapping the current value
             #    we duplicated initially again)

Peta digunakan sebagai ganti foreach-loop, karena peta memiliki implisit y, dan foreach-loop membutuhkan eksplisit y. Kami hanya peduli tentang itu counter_variable.

Dan akhirnya, setelah semua peta dan peta dalam selesai, kami akan:

¾           # Push the counter_variable (which is output implicitly as result)

2

R , 65 byte

R=function(L,`*`=sapply)"if"(any(L*is.list),sum(1+L*R),length(L))

Cobalah online!

Implementasi rekursif yang jelas dari spec.


1

C, 174 167 152 byte

Fungsi rekursif f, yang bocor memori ( 152 ):

#include"object.h"
size_t f(array_t*a){size_t t=0,i=0;for(;i<array_length(a);i++){object_t*o=array_get_copy(a,i,0);t+=o->type==6?f(o->ary):1;}return t;}

Rekursif fyang tidak bocor, menggunakan referensi, di 167 :

#include"object.h"
size_t f(array_t*a){size_t t=0,i=0;for(;i<array_length(a);i++){object_t**o=array_get_ref(a,i,0);t+=*o->type==t_array?f(*o->ary):1;}return t;}

Tidak Terkumpul:

size_t get_recursize (const array_t* const a) {
  pfn();

  object_failnull(a);

  size_t out = 0;

  for (size_t i = 0; i < array_length(a); i++) {

    object_t** o = array_get_ref(a, i, NULL);

    if ( (*o)->type == t_array ) {

      out += get_recursize((*o)->ary);

    } else {
      ++out;
    }
  }
  return out;
}

"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:

#include "../calc/object/object.h"

size_t get_recursize (const array_t* const a);

define_array_new_fromctype(ssize_t);

int main (void) {

  size_t len = 6;

  static const ssize_t h[6] = { -1, 3, -5, 7, -9, 11 };

  array_t* a = array_new_from_ssize_t_lit(h, len, t_realint);

  size_t rsize = get_recursize(a);

  printf("Recursive size of a: %zu\n", rsize);

  object_t* asobj = object_new(t_array, a);
  array_destruct(a);

  array_t* b = array_new(NULL, -1);

  for (size_t j = 0; j < 10; j++) {
    array_append(b, asobj);
  }

  object_destruct(asobj);

  rsize = get_recursize(b);

  printf("Recursive size of b: %zu\n", rsize);

  asobj = object_new(t_array, b);
  array_destruct(b);

  array_t* c = array_new(NULL, -1);

  for (size_t i = 0; i < 100; i++) {
    array_append(c, asobj);
  }

  object_destruct(asobj);

  rsize = get_recursize(c);

  printf("Recursive size of c: %zu\n", rsize);

  array_destruct(c);

  return EXIT_SUCCESS;
}

size_t get_recursize (const array_t* const a) {
  pfn();

  object_failnull(a);

  size_t out = 0;

  for (size_t i = 0; i < array_length(a); i++) {

    object_t** o = array_get_ref(a, i, NULL);

    if ( (*o)->type == t_array ) {

      out += get_recursize((*o)->ary);

    } else {
      ++out;
    }
  }
  return out;
}

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:

$ valgrind --leak-check=full --track-origins=yes --show-leak-kinds=all ./size
==24127== Memcheck, a memory error detector
==24127== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==24127== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
==24127== Command: ./size
==24127== 
Recursive size of a: 6
Recursive size of b: 60
Recursive size of c: 6000
==24127== 
==24127== HEAP SUMMARY:
==24127==     in use at exit: 0 bytes in 0 blocks
==24127==   total heap usage: 22,900 allocs, 22,900 frees, 615,584 bytes allocated
==24127== 
==24127== All heap blocks were freed -- no leaks are possible
==24127== 
==24127== For counts of detected and suppressed errors, rerun with: -v
==24127== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Tapi itu berhasil! Komit terakhir untuk dikuasai (yang dikompilasi oleh program ini) adalah 2 hari yang lalu, yang berarti pengajuan ini valid.


1

Aksioma 118 byte

RS(a:Union(List(Any),Any)):INT==(a case List(Any)=>(g:List(Any):=a;leaf? g=>0;r:=#g;for i in g repeat r:=r+RS(i);r);0)

ungolfed

RS(a:Union(List(Any),Any)):INT==
  a case List(Any)=>
          g:List(Any):=a
          leaf? g=>0
          r:=#g
          for i in g repeat r:=r+RS(i)
          r
  0

hasil

(25) -> RS([])=0
   (25)  0= 0
                                        Type: Equation NonNegativeInteger
(26) -> RS([[]]) = 1
   (26)  1= 1
                                           Type: Equation PositiveInteger
(27) -> RS([4, 5, 6]) = 3
   (27)  3= 3
                                           Type: Equation PositiveInteger
(28) -> RS(["four", "five", "six"]) = 3
   (28)  3= 3
                                           Type: Equation PositiveInteger
(29) -> RS(["[[[[]]]]", "[][][][][]", "][][[[]]][]["]) = 3
   (29)  3= 3
                                           Type: Equation PositiveInteger
(30) -> RS([[4, 5, 6]]) = 4
   (30)  4= 4
                                           Type: Equation PositiveInteger
(31) -> RS([["four", "five", "six"]]) = 4
   (31)  4= 4
                                           Type: Equation PositiveInteger
(32) -> RS([["[[[[]]]]", "[][][][][]", "][][[[]]][]["]]) = 4
   (32)  4= 4
                                           Type: Equation PositiveInteger
(33) -> RS([[4], [5], [6]]) = 6
   (33)  6= 6
                                           Type: Equation PositiveInteger
(34) -> RS([["four"], ["five"], ["six"]]) = 6
   (34)  6= 6
                                           Type: Equation PositiveInteger
(35) -> RS([["[[[[]]]]"], ["[][][][][]"], ["][][[[]]][]["]]) = 6
   (35)  6= 6
                                           Type: Equation PositiveInteger
(36) -> RS([[[[[[[[[]]]]]]]]]) = 8
   (36)  8= 8
                                           Type: Equation PositiveInteger
(37) -> RS([[],[],[],[],[],[],[],[]]) = 8
   (37)  8= 8
                                           Type: Equation PositiveInteger
(38) -> RS([[],[],[[]],[[[[]]]]]) = 8
   (38)  8= 8
                                           Type: Equation PositiveInteger
(39) -> RS([0,[-1],[2.3,-4.3],[5,[6]],[7,[8,9,[10,11,[12,13,14]]]]]) = 22
   (39)  22= 22
                                           Type: Equation PositiveInteger
(40) -> RS([['f','o','u','r'], ['f','i','v','e'], ['s','i','x']]) = 14
   (40)  14= 14
                                           Type: Equation PositiveInteger

1

APL (NARS), 24 karakter, 48 byte

{⍬≡⍵:0⋄×≡⍵:(≢⍵)++/∇¨⍵⋄0}

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:

  RS←{⍬≡⍵:0⋄×≡⍵:(≢⍵)++/∇¨⍵⋄0}
  RS ⍬
0
  RS ⊂⍬
1
  RS  4 5 6
3
  RS ("four")("five")("six")
14
  RS ('f' 'o' 'u' 'r') ('f' 'i' 'v' 'e') ('s' 'i' 'x')
14
  RS ("(((())))")("()()()()()")(")()((()))()(")
33
  RS (⊂4 5 6)
4
  RS (⊂("four")("five")("six")) 
15
  RS (⊂("(((())))")("()()()()()")(")()((()))()(") )
34
  RS (,4) (,5) (,6)
6
  RS ⊂¨("four")("five")("six")
17
  RS ⊂¨("(((())))")("()()()()()")(")()((()))()(") 
36
  RS ⊂⊂⊂⊂⊂⊂⊂⊂⍬
8
  RS ⍬⍬⍬⍬⍬⍬⍬⍬
8
  RS ⍬⍬(⊂⍬)(⊂(⊂(⊂⍬)))
8
  RS 0(,¯1)(2.3 ¯4.3)(5 (,6))(7 (8 9 (10 11 (12 13 14))))  
22     

untuk mencetak jenis hasil latihan yang kami ajukan, kami membutuhkan satu fungsi lainnya (kedua fungsi RS dan Rs boleh digunakan untuk latihan)

  Rs←{⍬≡⍵:0⋄(''≡0↑⍵)∨0=≡⍵:0⋄(≢⍵)++/∇¨⍵}
  Rs ("four")("five")("six")
3
  Rs ("(((())))")("()()()()()")(")()((()))()(")
3
  Rs (⊂("four")("five")("six"))
4
  Rs (⊂("(((())))")("()()()()()")(")()((()))()(") )
4
  Rs ⊂¨("four")("five")("six")
6
  Rs ⊂¨("(((())))")("()()()()()")(")()((()))()(")
6
  Rs 0(,¯1)(2.3 ¯4.3)(5 (,6))(7 (8 9 (10 11 (12 13 14))))
22
  Rs ('f' 'o' 'u' 'r') ('f' 'i' 'v' 'e') ('s' 'i' 'x')
3

untuk melihat bagaimana muncul beberapa input kita menggunakan fungsi o:

  o←⎕fmt
  o 0(,¯1)(2.3 ¯4.3)(5 (,6))(7 (8 9 (10 11 (12 13 14))))
┌5─────────────────────────────────────────────────────────┐
│  ┌1──┐ ┌2────────┐ ┌2─────┐ ┌2──────────────────────────┐│
│0 │ ¯1│ │ 2.3 ¯4.3│ │  ┌1─┐│ │  ┌3──────────────────────┐││
│~ └~──┘ └~────────┘ │5 │ 6││ │7 │    ┌3────────────────┐│││
│                    │~ └~─┘2 │~ │8 9 │      ┌3────────┐││││
│                    └∊─────┘ │  │~ ~ │10 11 │ 12 13 14│││││
│                             │  │    │~~ ~~ └~────────┘2│││
│                             │  │    └∊────────────────┘3││
│                             │  └∊──────────────────────┘4│
│                             └∊──────────────────────────┘5
└∊─────────────────────────────────────────────────────────┘

cetak Zilde ini, dan satu daftar 8 Zilde:

  o ⍬
┌0─┐
│ 0│
└~─┘
  o ⍬⍬⍬⍬⍬⍬⍬⍬
┌8──────────────────────────────────────┐
│┌0─┐ ┌0─┐ ┌0─┐ ┌0─┐ ┌0─┐ ┌0─┐ ┌0─┐ ┌0─┐│
││ 0│ │ 0│ │ 0│ │ 0│ │ 0│ │ 0│ │ 0│ │ 0││
│└~─┘ └~─┘ └~─┘ └~─┘ └~─┘ └~─┘ └~─┘ └~─┘2
└∊──────────────────────────────────────┘

1

Java, 96 byte

int c(Object[]a){int r=a.length;for(var i:a)r+=i instanceof Object[]?c((Object[])i):0;return r;}

Cobalah online.

Penjelasan:

int c(Object[]a){  // Recursive method with Object-array parameter and integer return-type
  int r=a.length;  //  Result-sum, starting at the size of the input-array
  for(var i:a)     //  Loop over the input-array:
    r+=            //   Increase the result-sum by:
       i instanceof Object[]?
                   //    If the current item is an array:
        c((Object[])i) 
                   //     A recursive call with this item
       :           //    Else:
        0;         //     0 (so leave the result-sum the same)
  return r;}       //  Return the result-sum

1

Attache , 21 byte

{#_+Sum!$=>IsArray\_}

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]


1

Clojure, 79 77 51 byte

Input harus berupa daftar, bukan vektor. Keduanya akan didukung dengan menggunakan sequential?.

(defn f[i](if(seq? i)(apply +(count i)(map f i))0))

Sebelumnya:

(defn f[i](if(seq? i)(if(some seq? i)(apply +(count i)(map f i))(count i))0))

-1

Python, 72 byte

l=lambda a:0if len(a)==0else len(a)+sum(l(i)for i in a if type(i)==list)

Anda dapat menghapus beberapa spasi di sana
Biru

Secara khusus, antara 0 dan if, 0dan else, dan )dan for.
Zacharý

2
Jika Anda perlu perwakilan untuk akun bot obrolan Anda, pertimbangkan untuk memberikan kontribusi yang berarti ke situs. Ini sama sekali tidak menambahkan jawaban Python 42 byte yang sudah ada sebelumnya.
Dennis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.