Listenin "Yinelemeli Boyutu" nu bulun


20

Esinlenen Listenin "paketlenmemiş boyutu" .

RSUzunluğu (içerilen öğe sayısı) olarak liste içermeyen bir listenin Özyinelemeli Boyutu ve uzunluğunun toplamı ve bu listelerin Özyinelemeli Boyutu olarak herhangi bir listeyi içeren listenin Özyinelemeli Boyutu'nu tanımlayın .

Meydan okuma

Herhangi bir listenin Özyinelemeli Boyutunu olabildiğince az bayt olarak çıkaran bir program veya işlev yazın.

Giriş bir listedir ve sayılar, dizeler (dilinizde varsa) ve benzer listeler içerebilir.


Örneğin:

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

Dilinizde dize yoksa, ancak karakter listeleri varsa, "strings"yukarıdaki örneklerin aslında karakter listeleri olabileceğini ve daha büyük sonuçlara sahip olabileceğini unutmayın. Örnek olarak:

RS([['f','o','u','r'], ['f','i','v','e'], ['s','i','x']]) = 14

Bu , bu nedenle bayttaki en kısa cevap kazanır; her zamanki gibi komik iş yok.

Liste dışı bir girdi herhangi bir çıktı üretebilir.
G / Ç her zamanki gibi esnektir .



Öğeler dize, sayı ve özyinelemeli listeler olacak mı?
xnor

Not: Bazı tartışmalardan sonra listelerin içeriği kısıtlandı. Soruyu, bunu yansıtacak şekilde düzenledim. Giriş için @xnor'a teşekkürler!
Jonathan Allan

2
Dizeleri hesaba katmak zorunda kalmadan daha iyi bir meydan okuma olacağını hissediyorum. Sadece bazı dillere bayt eklemek IMO
Conor O'Brien

@ ConorO'Brien ya da belki bir dize bir liste olarak ele almak ya da değil tedavi etmek isteseydim cevap vermiş olmalıydı. Ne yazık ki topluluğa özellikle "Eklemem gereken herhangi bir son durum var mı?" Ve "Tanımın açıklanması gerekiyor mu?" Diye sordum. ve kum havuzunda dokuz gün boyunca yanıt alamadım ... ve şimdi böyle bir sorunun yineleneceğini tahmin ediyorum?
Jonathan Allan

Yanıtlar:


5

Jöle , 8 bayt

߀-ŒḊ?‘S

Çevrimiçi deneyin!

Nasıl çalışır

߀-ŒḊ?‘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 bayt

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

Liste dışı için 0 çıktısı. Bir liste için, uzunluğunu artı öğeleri için özyinelemeli çıktıların toplamını çıktılar.

Listeler, gerekli olan Python 2 sıralamasında sayıların üstünde ve dizelerin altında kalır []<=x<''. Bunun yerine, bir sayının veya bir dizenin x*0==[]sonucunu kontrol ederiz .0''


6

JavaScript (ES6), 39 37 bayt

@ Edc65 sayesinde 2 bayt kaydedildi

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

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

@Sethi Bu herhangi bir girdi için 0 döndürmez mi? 1Oraya bir yere koymalısın .
ETHproductions

1
37: f=a=>a.map&&a.map(x=>a-=~f(x),a=0)&&a. -=~1 karakterden küçüktür +=1+ve bir boole değerini tamsayıya dönüştürerek başka bir karakteri keser. aKüresel değişkeni önlemek için yeniden kullanmat
edc65

@ edc65 Teşekkürler, bu harika!
ETHproductions

5

Mathematica, 20 bayt

Length@Level[#,∞]&

Anonim işlev. Bir ifadeyi girdi olarak alır ve bir sayıyı çıktı olarak döndürür. Unicode karakteri U + 221E INFINITY'dir \[Infinity]. Level[#,∞]girdinin alt ifadelerinin bir listesini verir ve Length@bunları sayar.


Boom! Slam cevabım üzerine yalan söyledi. Ama yeni bir şey öğrendim :)
Greg Martin

5

Mathematica, 14 bayt

LeafCount@#-1&

Önceki cevabımda küçük değişiklikler yapıldı . Orada açıkladığım gibi, LeafCountzaten iç içe atomik değerlerle ilgileniyor, ancak sonuçtan çıkarmamız gereken en dış liste de sayılıyor.


4

Perl, 34 bayt

Özyinelemeli bir işlev! Evet, Perl'in sadece normal ifadesi değil, aynı zamanda işlevleri de var!

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

Test etmek istiyorsanız, aşağıdaki gibi bir şey çalıştırabilirsiniz:

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

3

Mathematica, 32 bayt

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

Adsız özyinelemeli işlev. Alıntı #0/@#~Select~ListQ, bir liste olan girişin her bir elemanında işlevi tekrar çağırır ve Trbu değerleri toplar. Neyse ki Mathematica, boş listenin uzunluğunu almak ve boş listeden niteleyici öğeleri aramak için iyidir, bu nedenle temel duruma gerek yoktur.


2

Haskell, 52 bayt

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

Kullanım örneği:

*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 karışık listeleri (örn. Int ve Int listesi) desteklemediğinden, Lbir tür a (-> E a) veya diğer L'lerin (-> N[L a]) bir listesi olan özel bir liste türü ile gidiyorum . RS'nin hesaplanması, bir Esayım 1ve bir Nartı öğelerinin özyinelemeli boyutlarının toplamının bulunduğu basit bir özyineleme . Tüm toplam 1 ile kapalı, bu yüzden üzerinden çıkarıyorum pred.

Yan not: elemanların kesin türleri ve değerleri algoritma için önemli değildir, bu nedenle polimorfizmi sadece soyut elemanlarla bir anlaşma kaldırabilir ve devam edebiliriz data L=E|N[L].


2

Faktör, 105 bayt

Özyinelemeli işlev g.

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

Kurtulmamış (tür):

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

Herhangi bir çağrı olmadığını göreceksiniz, lengthçünkü uzunluk yerleşikini kullanmak yerine drop 1, dizeler ve sekanslar üzerinde uygulanır .


2

Mathematica, 18 bayt

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

Yine başka bir Mathematica yaklaşımı. LeafCountYerleşik olanı kullanmak kadar kısa değil ama yine de oldukça özlü. Bu , bir ifadenin her düğümünde bir işlevi çağıran MapAllişleci //@kullanır ve bu işlevi bir sayacı artırmak için kullanırız c. Olduğu gibi LeafCountbiz gelen sayacı başlatmak yüzden, hem de dış liste başını sayar çünkü durumunda, bu, daha ihtiyacımız birden verir -1.


2

C # (Visual C # Etkileşimli Derleyici) , 50 bayt

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

Çevrimiçi deneyin!

Önceden gönderilen Java yanıtıyla aynı tekniği kullanır , ancak yanıt uzunluğunu azaltmak için LINQ'dan yararlanır.

Açıklama:

// 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 (eski), 22 17 bayt

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

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

Bu zorluk 05AB1E'de aşılması gereken birden fazla zorluk ortaya çıkarmaktadır:

  1. Her ne kadar 05AB1E, İksir rewrite ( λ) yönteminden beri yinelemeli bir işleve sahip olsa da , yalnızca tamsayı dizileri için yararlıdır. İşte 05AB1E özyinelemeli fonksiyonun bir örneği olarak benim cevabım. Bu nedenle, kodun bir kısmını bir dizgiye koyarak yinelemeli aramalar yapmak için bir alternatif bulmak zorundaydım ve bu dizeyi 05AB1E kodu olarak yinelemeli olarak yürüttüm.
  2. isList05AB1E'de bir komut da yok, bu yüzden bir listeye kaydırma, derin düzleştirme ve eşitliği kontrol ederek bunu kontrol etmek için bazı geçici çözümler kullanmak zorunda kaldım.
  3. Üçüncüsü, çok boyutlu bir listenin yalnızca bir seviyesi için düzleştirme yoktur. Düzleştir işlevi ˜, tüm katmanları kaldıran ve çok boyutlu bir listeyi en içteki tüm değerlere sahip tek bir liste haline getiren derin bir düzleştirmedir. (yani [[1,2],[[[3]],4]]olur [1,2,3,4]).

Yukarıdaki üç sorunun üstesinden gelmek için üst kod ile sona erdi. Üç ana bölüme ayrılmıştır. İlk önce aşağıdakiler var:

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

Dize şu kodu içerir:

ε            # 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)

Foreach-loop yerine bir harita kullanılır, çünkü haritanın üstü örtülü yolduğundan ve foreach-loop'un açık olması gerekir y. Biz sadece umurumda counter_variable.

Ve son olarak, tüm haritalar ve iç haritalar yapıldıktan sonra:

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


1

C, 174 167 152 bayt

fBelleğe sızan özyinelemeli işlev ( 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;}

167'def referansları kullanarak sızıntı yapmayan özyinelemeli :

#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;}

Ungolfed:

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;
}

“Ama nasıl,” diye sordunuz, “bu C'de cevaplanabilir mi? Şüphesiz, C'de yönetilen diziler yoktur ve gerçekten heterojen dizilere sahip olamazsınız…?”

"Aha" diye cevap veriyorum, çünkü (GNU-ish) C11 ve ISO C ++ 11 "için basit bir" nesneler "sistemi üzerinde çalışıyorum.

Bu işlev için tam demo programı:

#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;
}

Şu anda burada yaşıyor ve bunu kullanmak için o repoya ihtiyacınız olacak.

libfnvPlatformunuz için derlenen Fowler-Noll-Vo karma kütüphanesine de ihtiyacınız olacak . O depoda ve burada da alabilirsiniz .

Sonra yapabilirsin cc -DNODEBUG size.c path/to/libfnv.a -o size.

Uygulama mutlaka etkili değildir:

$ 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)

Ama işe yarıyor! (Bu programın derlendiği) master'a son taahhüt 2 gün önceydi, yani bu başvuru geçerli.


1

Axiom 118 bayt

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

Sonuçlar

(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 bayt

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

Bu benim aksiyom cevabımın litrik olarak okunması olacaktır ... APL'de boşluk listesi ´⍬´ [] ´ ile belirttiğiniz Zilde olacaktır, ´⊂⍬´ ´ [[]] ´, ´ 1 2 3´ ´ [1,2,3] ´ ecc Bazı testler:

  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     

diğer tür sonuçları yazdırmak için alıştırmada başka bir fonksiyona ihtiyacımız var (hem RS hem de R fonksiyonları alıştırma için uygun olmalıdır)

  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

bazı girdilerin nasıl göründüğünü görmek için o fonksiyonunu kullanıyoruz:

  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
└∊─────────────────────────────────────────────────────────┘

bu baskı Zilde ve bir 8 Zilde listesi:

  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 bayt

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

Çevrimiçi deneyin.

Açıklama:

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

Ataşe , 21 bayt

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

Çevrimiçi deneyin!

Attache'de C # yaklaşımının oldukça kısa olduğu ortaya çıkıyor.

Alternatifler

25 bayt f[x]:=#x+Sum!f=>IsArray\x

26 bayt f[x]:=#x+Sum[f=>IsArray\x]

35 bayt f:=Sum##{If[IsArray@_,1+f@_,1]}=>Id

35 bayt f:=Sum@Map[{If[IsArray@_,1+f@_,1]}]

37 bayt f[x]:=Sum[{If[IsArray@_,1+f@_,1]}=>x]


1

Clojure, 79 77 51 bayt

Girdi bir liste olmalı, vektör değil. Her ikisi de kullanılarak desteklenir sequential?.

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

Önceki:

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

-1

Python, 72 bayt

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

orada bazı boşlukları kaldırabilirsiniz
Blue

Özellikle, 0ve if, 0ve elseve )ve arasında for.
Zacharý

2
Sohbet bot hesabınız için temsilciye ihtiyacınız varsa, siteye anlamlı bir katkıda bulunmayı düşünün. Bu, önceden var olan 42 bayt Python cevabına kesinlikle hiçbir şey eklemez.
Dennis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.