Zainspirowany przez Znajdź „rozpakowany rozmiar” listy .
Zdefiniuj rozmiar rekurencyjny RS
dla listy nie zawierającej list jako jego długości (liczby zawartych elementów) i rozmiar rekurencyjny dla listy zawierającej dowolne listy jako sumę jego długości i rozmiar rekurencyjny tych list.
Wyzwanie
Napisz program lub funkcję, która wyświetla rekurencyjny rozmiar dowolnej listy w jak najmniejszej liczbie bajtów.
Dane wejściowe to lista, która może zawierać liczby, ciągi znaków (jeśli je posiada Twój język) i podobne listy.
Na przykład:
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
Zauważ, że jeśli twój język nie ma ciągów znaków, ale ma listy znaków, przykłady zawierające "strings"
powyższe mogą faktycznie być listami znaków i mieć większe wyniki. Jako przykład:
RS([['f','o','u','r'], ['f','i','v','e'], ['s','i','x']]) = 14
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach; jak zwykle nie ma śmiesznego interesu.
Dane wejściowe inne niż lista mogą dawać dowolne dane wyjściowe.
I / O jest tak elastyczny jak zwykle .
źródło
Odpowiedzi:
Galaretka , 8 bajtów
Wypróbuj online!
Jak to działa
źródło
Python, 42 bajty
W przypadku listy innej niż wartość wyjściowa 0. W przypadku listy wypisz jej długość plus sumę wyników rekurencyjnych dla jej elementów.
Listy spadają powyżej liczb i poniżej ciągów w kolejności w Pythonie 2, co jest wymagane
[]<=x<''
. Zamiast tego sprawdzamyx*0==[]
, podczas gdy wynik0
dla liczby lub''
ciągu.źródło
JavaScript (ES6),
3937 bajtówZaoszczędzono 2 bajty dzięki @ edc65
źródło
f=a=>a.map?a.reduce((s,x)=>s+f(x),0):0
1
gdzieś tam umieścić .f=a=>a.map&&a.map(x=>a-=~f(x),a=0)&&a
.-=~
jest o 1 char mniej niż+=1+
i, konwertując wartość logiczną na liczbę całkowitą, odcina inną postać. Ponowne użycie wa
celu uniknięcia globalnej zmiennejt
Mathematica, 20 bajtów
Funkcja anonimowa. Pobiera wyrażenie jako dane wejściowe i zwraca liczbę jako dane wyjściowe. Znak Unicode to U + 221E INFINITY dla
\[Infinity]
.Level[#,∞]
podaje listę podwyrażeń danych wejściowych iLength@
zlicza je.źródło
Mathematica, 14 bajtów
Drobna modyfikacja mojej poprzedniej odpowiedzi . Jak już wyjaśniłem,
LeafCount
zajmuje się już zagnieżdżonymi wartościami atomowymi, ale zlicza także najbardziej zewnętrzną listę, którą musimy odjąć od wyniku.źródło
Perl, 34 bajty
Funkcja rekurencyjna! Tak, Perl ma nie tylko wyrażenie regularne, ale także funkcje!
Jeśli chcesz to przetestować, możesz uruchomić coś takiego:
źródło
Mathematica, 32 bajty
Nienazwana funkcja rekurencyjna. Fragment
#0/@#~Select~ListQ
wywołuje funkcję ponownie na każdym elemencie wejściowym, który jest listą, iTr
sumuje te wartości. Na szczęście Mathematica dobrze sobie radzi, biorąc długość pustej listy i szukając kwalifikujących się elementów z pustej listy, więc nie jest potrzebny żaden przypadek podstawowy.źródło
Haskell, 52 bajty
Przykład użycia:
Haskell nie obsługuje list mieszanych (np. Int i list Int), więc wybieram niestandardowy typ listy,
L
który jest albo elementem jakiegoś typu a (->E a
), albo listą innych Ls (->N[L a]
). Obliczanie RS jest prostą rekurencją, w którejE
liczy1
sięN
jeden i jeden plus suma rekurencyjnych rozmiarów jego elementów. Cała suma jest wyłączona o 1, więc odejmuję ją przezpred
.Uwaga dodatkowa: dokładne typy i wartości elementów nie są ważne dla algorytmu, więc moglibyśmy usunąć polimorfizm i zająć się wyłącznie elementami abstrakcyjnymi i iść dalej
data L=E|N[L]
.źródło
Współczynnik, 105 bajtów
Funkcja rekurencyjna g.
Ungolfed (kinda):
Przekonasz się, że nie ma żadnych wywołań,
length
ponieważ zamiast używać wbudowanej długości, jest ona zaimplementowanadrop 1
na ciągach i niesekwencjach.źródło
Mathematica, 18 bajtów
Jeszcze inne podejście Mathematica. Nie tak krótki, jak korzystanie z wbudowanego,
LeafCount
ale wciąż dość zwięzły. Korzysta zMapAll
operatora,//@
który wywołuje funkcję na każdym węźle wyrażenia, i używamy tej funkcji do zwiększania licznikac
. Tak jak wLeafCount
przypadku, daje to o jeden więcej niż potrzebujemy, ponieważ liczy się również nagłówek listy zewnętrznej, więc zaczynamy od licznika-1
.źródło
C # (interaktywny kompilator Visual C #) , 50 bajtów
Wypróbuj online!
Używa tej samej techniki, co poprzednio przesłana odpowiedź Java , ale wykorzystuje LINQ, aby skrócić długość odpowiedzi.
Wyjaśnienie:
źródło
05AB1E ( starsza wersja ),
2217 bajtówWypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
To wyzwanie stwarza wiele wyzwań do pokonania w 05AB1E:
λ
), jest on użyteczny tylko dla sekwencji całkowitych. Oto moja odpowiedź jako przykład funkcji rekurencyjnej 05AB1E. Z tego powodu musiałem znaleźć alternatywę do wykonywania wywołań rekurencyjnych, co zrobiłem, umieszczając część kodu w ciągu i wykonując go jako kod 05AB1E rekurencyjnie.isList
05AB1E nie ma również polecenia, więc musiałem zastosować pewne obejścia, aby to sprawdzić, wykorzystując zawijanie do listy, głębokie spłaszczenie i sprawdzenie równości.˜
jest głębokim spłaszczeniem, które usuwa wszystkie warstwy i czyni wielowymiarową listę pojedynczą listą ze wszystkimi wewnętrznymi wartościami. (tj.[[1,2],[[[3]],4]]
staje się[1,2,3,4]
).Skończyłem z kodem u góry, aby rozwiązać wszystkie trzy powyższe problemy. Jest podzielony na trzy główne części. Najpierw mamy następujące:
Ciąg zawiera następujący kod:
Zamiast pętli foreach używana jest mapa, ponieważ ma ona charakter niejawny
y
, a pętla foreach wymaga jawnejy
. Dbamy tylko o tocounter_variable
.I wreszcie, po wykonaniu wszystkich map i map wewnętrznych:
źródło
R , 65 bajtów
Wypróbuj online!
Oczywista rekurencyjna implementacja specyfikacji.
źródło
C
174167152 bajtówFunkcja rekurencyjna
f
, która przecieka pamięć ( 152 ):Rekurencyjny,
f
który nie przecieka, przy użyciu referencji, w 167 :Nie golfowany:
„Ale jak,„ pytasz ”, można na to odpowiedzieć w C? Z pewnością nie ma zarządzanych tablic w C i tak naprawdę nie możesz mieć heterogenicznych tablic ...?”
„Aha”, „odpowiadam”, ponieważ pracowałem nad prostym systemem „obiektów” dla (GNU-ish) C11 i ISO C ++ 11 ”.
Pełny program demonstracyjny dla tej funkcji to:
Obecnie mieszka tutaj i będziesz potrzebować tego repozytorium, aby z niego skorzystać.
Będziesz także potrzebować biblioteki skrótów Fowler-Noll-Vo
libfnv
, skompilowanej dla Twojej platformy. Jest w tym repozytorium i możesz go również pobrać tutaj .To możesz zrobić
cc -DNODEBUG size.c path/to/libfnv.a -o size
.Implementacja niekoniecznie jest wydajna:
Ale to działa! Ostatnie zatwierdzenie do masterowania (na którym skompilowano ten program) miało miejsce 2 dni temu, co oznacza, że przesłanie jest prawidłowe.
źródło
Axiom 118 bajtów
bez golfa
wyniki
źródło
APL (NARS), 24 znaki, 48 bajtów
To byłoby dosłowne tłumaczenie „mojej” odpowiedzi Axiom tutaj… W APL lista pustek brzmiałaby „Zilde, którą wskazujesz za pomocą ´ [] ´, ´⊂⍬´ jest ´ [[]] ´, ´ 1 2 3´ jest ´ [1,2,3] ´ ecc Niektóre testy:
do wydrukowania innego rodzaju wyników, proponowane ćwiczenie wymaga jeszcze jednej funkcji (obie funkcje RS i Rs powinny być odpowiednie dla ćwiczenia)
aby zobaczyć, jak pojawiają się niektóre dane wejściowe, używamy funkcji o:
ten druk Zilde i jedna lista 8 Zilde:
źródło
Java, 96 bajtów
Wypróbuj online.
Wyjaśnienie:
źródło
Attache , 21 bajtów
Wypróbuj online!
Okazuje się, że podejście C # jest dość krótkie w Attache.
Alternatywy
25 bajtów
f[x]:=#x+Sum!f=>IsArray\x
26 bajtów
f[x]:=#x+Sum[f=>IsArray\x]
35 bajtów
f:=Sum##{If[IsArray@_,1+f@_,1]}=>Id
35 bajtów
f:=Sum@Map[{If[IsArray@_,1+f@_,1]}]
37 bajtów
f[x]:=Sum[{If[IsArray@_,1+f@_,1]}=>x]
źródło
Clojure,
797751 bajtówWejście musi być listą, a nie wektorem. Oba byłyby obsługiwane przy użyciu
sequential?
.Poprzedni:
źródło
Python, 72 bajty
źródło
0
iif
,0
ielse
, i)
ifor
.