Zdefiniujmy funkcję „nieopakowanego rozmiaru” u
listy zagnieżdżonej l
(zawierającej tylko listy) według następujących reguł:
- Jeśli
l
jest pusty, tou(l)
jest 1. - Jeśli
l
jest niepuste,u(l)
jest równe sumie nieopakowanych rozmiarów każdego elementul
plus jeden.
Twoim zadaniem jest napisanie programu (lub funkcji), który pobiera listę jako dane wejściowe i wyprowadza (lub zwraca) nieopakowany rozmiar listy.
Przypadki testowe:
[] -> 1
[[[]],[]] -> 4
[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]] -> 19
[[[[]]]] -> 4
To jest golf golfowy , więc wygrywa najkrótszy program (w bajtach).
code-golf
string
array-manipulation
counting
Esolanging Fruit
źródło
źródło
()
zamiast[]
?[[[]][]]
zamiast tego[[[]],[]]
w twoim drugim przykładzie?["This is some text [with square brackets in] ...[& maybe more than one pair]"]
?]
wydaje się być najkrótszym rozwiązaniem w wielu językach, istnieje również wiele odpowiedzi, które faktycznie rozwiązują to wyzwanie za pomocą manipulacji listami, a przynajmniej w esolangach liczenie wystąpień ustalonego znaku również różni się od liczenia wystąpienia znaku wejściowego.Odpowiedzi:
Siatkówka , 1 bajt
Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).
Domyślnie Retina zlicza liczbę dopasowań podanego wyrażenia regularnego na wejściu. Rozpakowany rozmiar jest po prostu równy liczbie
[]
par na wejściu, a zatem liczbie]
.źródło
Mathematica, 9 bajtów
Okazuje się, że jest do tego wbudowana ...
Zauważ, że to nie zadziałałoby, gdyby listy faktycznie zawierały elementy spoza listy. Tak
LeafCount
naprawdę liczy się liczba podwyrażeń atomowych. W przypadku danych wejściowych{{}, {{}}}
wyrażenie faktycznie brzmi:Tutaj podwyrażenia atomowe są w rzeczywistości głowami
List
.źródło
Brainfuck,
716159 bajtówPobiera dane wejściowe ze STDIN w formacie podanym w pytaniu i wysyła znak, którego kod ASCII jest „nieopakowanym rozmiarem”.
Nadal jestem kompletnym amatorem w Brainfuck, więc najprawdopodobniej istnieje wiele optymalizacji, które można jeszcze wprowadzić.
Wypróbuj online!
Nie golfowany:
źródło
JavaScript (ES6),
2927 bajtówuwielbiam, gdy rekurencja okazuje się tak czysto. Zasadniczo jest to pierwsze wyszukiwanie głębokości wejścia, dodawanie 1 za każdym razem, gdy osiągnięty zostanie koniec tablicy.
Jeśli pusta tablica była fałszywa w JS, może to być 24 bajty:
Ale niestety tak nie jest. Inne próby:
źródło
f=a=>a[0]?f(a.pop())+f(a):1
zadziała? (Liczba samych bajtów.)f=a=>a.reduce((n,a)=>n+f(a),1)
. Terazf=(n,a)=>n+a.reduce(f,1)
ma tylko 24 bajty, ale niestety parametry są w niewłaściwej kolejności.)f=a=>a.map(a=>n+=f(a),n=1)&&n
Perl,
987 + 1 = 8 bajtówWymaga
-p
flagiDzięki @Dada za dwa bajty zapisów (uwielbiam to wykorzystanie średnika btw)
źródło
-p
by zaoszczędzić 1 bajt;)y;[;
aby zapisać jeszcze jeden bajtCJam ,
75 bajtówDzięki Peter Taylor za usunięcie 2 bajtów! (
e=
zamiastf=:+
)Wypróbuj online!
źródło
05AB1E , 4 bajty
Wypróbuj online!
Myślę, że można grać bardziej w golfa, ale to „I” jest obowiązkowe, w przeciwnym razie dane wejściowe są traktowane jako rzeczywista tablica zamiast łańcucha
źródło
"[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]]"
w danych wejściowych usuwa toI
wymaganie, chociaż nie wiem, czy jest to dozwolone.Labirynt , 8 bajtów
Wypróbuj online!
Wyjaśnienie
Liczy się nawiasy otwierające dzięki odrobinie bitowej magii. Jeśli weźmiemy pod uwagę wyniki kodów charakter bitowego i
[
,,
i]
z2
, otrzymujemy:Jeśli więc zsumujemy wynik tej operacji dla każdej postaci, otrzymamy dwukrotność pożądanej wartości.
Jeśli chodzi o sam kod, blok 2x2 na początku jest małą pętlą. Przy pierwszej iteracji
&-
nie rób nic, poza tym, że umieszczają jawne zero na domniemanym zera u dołu stosu. Będzie to bieżąca suma (a później zapisanie bajtu będzie ujemne). Następnie pętla wygląda następująco:Po opuszczeniu pętli wykonywany jest następujący bit liniowy:
Później trafia w martwe i odwraca się. Podczas próby
/
ponownego uruchomienia program kończy się z powodu próby podziału przez zero.źródło
Python
32,3623 bajtówZauważyłem, że
u(l)
jest to liczba[
reprezentująca ciąg znakówl
, więc ten program próbuje to zrobić. Prawdopodobnie można by dalej grać w golfa, znajdując inny sposób na zrobienie tego, chociaż ...źródło
lambda x:`x`.count("[")
Python, 26 bajtów
Prosta formuła rekurencyjna.
źródło
C #,
4641 bajtówl to ciąg zagnieżdżonej listy. Sprawdź to tutaj .
źródło
return
używając funkcji wyrażania treści. Równieżchar
pośrednio rzuca sięint
więc można użyć91
zamiast'['
:int u(string l)=>l.Count(c=>c==91);
Dalej, można upuścić podpisu funkcji i stosować metodę lambda:l=>l.Count(c=>c==91);
.Galaretka , 4 bajty
Nie używa manipulacji ciągiem. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Rubinowy, 13 (+1) bajtów
Wywoływany z
-n
argumentem:EDYCJA: Zmieniono, aby faktycznie wydrukować odpowiedź
źródło
->s{s.count ?[}
Byłby to prawidłowy wniosek.Regex, 1 bajt
Wypróbuj online!
źródło
Brain-Flak ,
63, 61 bajtówWypróbuj online! 58 bajtów kodu i +3 dla
-a
flagi umożliwiającej wprowadzanie ASCII.Czytelna wersja / objaśnienie:
źródło
Befunge ,
221816 bajtówTryItOnline!
Edycja: Podziękowania dla Martina Endera za odcięcie 4 bajtów!
Edycja2: Podziękowania dla Davida Holderness za optymalizację dwóch kolejnych
źródło
///, 13 bajtów
Wyjście jednostkowe.
Wypróbuj online!
Wyjaśnienie:
źródło
///
?PHP, 35 bajtów
preg_match_all
znajduje wszystkie pasujące wystąpienia wyrażenia regularnego i zwraca liczbę, dlatego potrzebne są krótkie znaczniki echa.Podobnie jak większość odpowiedzi, zlicza liczbę
[
wejść i wyjść w liczbieźródło
]
zamiast[
, nie będziesz musiał uciekać.count_chars()[91];
robi to samo, ale jest krótszy.Rakieta 82 bajtów
Nie golfowany:
Testowanie:
Wynik:
źródło
V , 10 bajtów
Wypróbuj online!
Zawiera niektóre niedrukowalne znaki, oto wersja do odczytu:
<C-a>
reprezentuje „ctrl-a” (ASCII0x01
) i<esc>
reprezentuje klawisz Escape (ASCII0x1b
).Więcej zabawy, mniej golfowa wersja:
Wypróbuj online!
źródło
Scala, 15 bajtów
Nie golfowany:
count
Liczy się, jak wiele elementów spełniają predykat, w tym przypadku92<
, co jest metodą<
z92
.źródło
O , 15 bajtów
Wypróbuj tutaj!
Na wejściu wszelkie przecinki należy usunąć lub zastąpić spacjami.
Wyjaśnienie
Jeśli wolno nam podjąć pracę nad łańcuchem: 10 bajtów
źródło
> <> ,
212018 bajtówEdycja: ocena 1 dla wyciągów goto!
Edycja 2: Najwyraźniej> <> różni się od Befunge tym, że pozwala na niezerowe przesunięcie IP po zawinięciu (innymi słowy, używając instrukcji trampoliny, mogę owinąć do (1, 0) zamiast (0, 0)). Ciekawy.
TryItOnline!
źródło
Brainfuck, 28 bajtów
Wypróbuj online.
Zlicza liczbę znaków wejściowych podzielnych przez 3, tj. Liczbę
]
znaków.Alternatywne rozwiązanie 34-bajtowe zliczające
[
znaki bezpośrednio i oparte na 8-bitowych komórkach:źródło
C,
4846 bajtówZaoszczędzono dwa bajty dzięki kirbyfan64sos
Kod testowy
Przypadki testowe
źródło
*v++^91?0:i++
abyi+=*v==91
zapisać 3 bajty.i+=*v++==91
do zapisania dwóch bajtów.tinylisp repl, 39 bajtów
Definiuje funkcję,
u
którą można wywołać jak(u (q ((())()) ))
(dla drugiego przypadku testowego). Wykonanie tego w replice pozwala zaoszczędzić 4 bajty z powodu automatycznie zamykanych nawiasów.Wyjaśnienie
x-(0-y)
Konstrukt jest konieczne, ponieważ tinylisp nie posiada wbudowanej funkcji Ponadto jedynie odejmowanie.źródło
Befunge-98 ,
1211109 bajtówTryItOnline!
Edycja: Podziękowania dla Martina Endera za odcięcie bajtu
źródło
Haskell,
20 1917 bajtówWypróbuj online!
Pobiera listę jako ciąg znaków i umieszcza na
1
liście dla każdego z nich]
, a następnie podsumowuje wszystkie1
s.Wersja Pointfree: (19 bajtów)
Zakłada
, [ ]
się, że są jedynymi znakami w ciągu. Filtruje listę, aby uzyskać wszystkie znaki większe niż[
, które są wszystkie,]
i zwraca długość.Stosowanie:
źródło
Bash + coreutils, 29 bajtów
źródło
tr -d -c [|wc -c
, co domyślnie przeczyta listę ze standardowego wejścia.DASH , 14 bajtów
Po prostu się liczy
]
. Stosowanie:Rozwiązanie premiowe, 15 bajtów
Ten rekurencyjnie liczy się z prawdziwej listy. Stosowanie:
źródło