Nie mogę uwierzyć, że jeszcze tego nie mamy. Jest to jedna z najważniejszych struktur danych w programowaniu, ale wciąż wystarczająco prosta, aby zaimplementować ją w golfie kodowym :
Wyzwanie
Twoim zadaniem jest zaimplementowanie stosu, który umożliwia wypychanie i usuwanie liczb, testowanie implementacji i uproszczenie operacji we / wy, wykorzystamy następującą konfigurację:
- Dane wejściowe będą listą liczb całkowitych nieujemnych
Każda dodatnia liczba całkowita oznacza a każde oznacza - odrzucając górny element.push ( n ) 0 pop ()
- Wyjściowym wynikiem będzie stos
Przykład
Na przykład, jeśli otrzymamy :
Dane wyjściowe będą wynosić:
Zasady
- Dane wejściowe będą listą nieujemnych liczb całkowitych w dowolnym domyślnym formacie We / Wy
- możesz użyć ujemnej liczby całkowitej, aby oznaczyć koniec strumienia liczb całkowitych
- Wyjście będzie listą / macierzą / .. stosu wynikowego
- Twój wybór, gdzie będzie górny element (na początku lub na końcu), wynik musi być spójny
- wyjście jest elastyczne (np. liczby całkowite oddzielone nowymi wierszami byłyby w porządku), jedyna rzecz, która ma znaczenie, to kolejność
- możesz użyć ujemnej liczby całkowitej, aby oznaczyć spód stosu
- Masz gwarancję, że nigdy nie będzie gdy stos będzie pusty
Przykłady
[] -> []
[1] -> [1]
[1,0,2] -> [2]
[4,0,1,12] -> [12,1]
[8,3,1,2,3] -> [3,2,1,3,8]
[1,3,7,0,0,0] -> []
[13,0,13,10,1,0,1005,5,0,0,0] -> [13]
[12,3,0,101,11,1,0,0,14,0,28] -> [28,101,12]
Odpowiedzi:
MATL , 6 bajtów
Dane wejściowe to wektor wiersza liczb.
Ostatni stos jest pokazany do góry nogami, a najnowszy element poniżej.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Java (JDK 10) , 42 bajty
Ponieważ „[wyjście] jest elastyczne [...], jedyną rzeczą, która ma znaczenie, jest kolejność”, zmienia to tablicę wejściową w tablicę
0
-terminated. Przykład:[1,0,2]
zwróci,[2,0,2]
co należy interpretować jako = .[2
,0,2
]
[2]
Wypróbuj online!
Poprzednie wersje:
Java (JDK 10) , 60 bajtów
Wypróbuj online!
Kredyty:
Jeśli mogę zakończyć program z błędami: 55 bajtów
(chociaż wszystko jest odpowiednio zmodyfikowane)
Wypróbuj online!
źródło
>0
ponieważ nigdy nie będzie zera na początku listy (co sugerowałoby, że wierzchołek stosu był na-1
).Sed, 17 bajtów
:;s/[0-9]\+,0//;t
-3 bajty dzięki @ OMᗺ, -1 dzięki @eggyal
Ponieważ masz gwarancję, że nigdy nie otworzysz pustej listy, nie potrzebujesz niczego więcej niż iterowanej skończonej maszyny stanów. Wyrażenia regularne są narzędziem do budowania skończonych maszyn stanów i
sed
mogą iterować. To mecz stworzony w niebie.Pobiera dane wejściowe ze standardowego wejścia, takie jak:
echo '[12,3,0,101,11,1,0,0,14,0,28]' | sed ':;s/[0-9]\+,0,//;t'
Wysyła stos w odwrotnej kolejności:
[12,101,28]
Mógłby być mniejszy o dwa bajty, jeśli moje lokalne
sed
zrozumiałe klasy znaków lubią\d
, ale z jakiegoś powodu tak nie jest.źródło
g
jest zbędny - oszczędzasz 4 bajty: Wypróbuj online!PowerShell ,
464140 bajtówWypróbuj online!
Pobiera dane wejściowe poprzez rozpryskiwanie, np.
$z=@(12,3,0,101,11,1,0,0,14,0,28); .\implement-stack.ps1 @z
, Które w TIO przejawia się jako osobne argumenty.-5 bajtów dzięki mazzy.
-1 bajt zamiana
$_
na1
źródło
$agrs
? :)$args|%{$x,$a=&({$_,$_+$a},{$a})[!$_]};$a
?.\implement-stack.ps1 @z
(nie$z
), w przeciwnym razie po prostu podajesz tablicę jako pierwszy / jedyny argumentC (gcc) ,
62605655 bajtów-2-6 bajtów dzięki l4m2-1 bajt dzięki pułapkowi cat .
Używa dozwolonego pojęcia -1 tablic zakończonych.
f()
wywołuje się rekurencyjnie, aż do pełnego uzwojenia, a następnie cofa się po liście.r
śledzi, ile liczb należy odrzucić przed wydrukowaniem czegoś. Zwiększa, jeśli bieżącym przedmiotem jest 0, w przeciwnym razie maleje. Jeśli 0, nie musimy odrzucać i możemy wydrukować numer.Wypróbuj online!
źródło
f(l)int*l;
=>f(int*l)
?r=0
wydaje się bezużyteczneHaskell, 28 bajtów
Wypróbuj online!
źródło
R , 45 bajtów
Wypróbuj online!
źródło
F
spowoduje również przeniesienie do 48 bajtów, ale to jest czystsze imhoR+pryr
iReduce
rozwiązanie ma 44 bajtyPython 2 ,
595751 bajtówWypróbuj online!
źródło
Galaretka , 6 bajtów
Wypróbuj online!
Jak to działa
źródło
[1,3,7,0,0,0]
, np. zostaje podzielony na[[1,3,7],[],[],[]]
i każdy krok lewej redukcji pojawia się na elemencie lewej tablicy.Brain-Flak ,
4036 bajtówWypróbuj online!
Dzięki @Nitrodon za -4 bajty.
Ponieważ Brain-Flak już używa stosów, jest to dobra łamigłówka dla Brain-Flak.
źródło
{{}<>{}<>}
można go skrócić{{}<>}
.Wolfram Language (Mathematica) , 28 bajtów
Wypróbuj online!
źródło
b
jest niezerowe.)a___
najpierw stara się dopasować możliwie najkrótsze . Można to zobaczyć, próbującReplaceList[#, {a___, b_, 0, c___} :> {a, c}] &
. Z pokrewną notatkąStringReplace
jest tak naprawdę chciwy, więc to przesłanie nie zadziałaStringReplace
(z wzorem podobnyma___~~b_~~"0"~~c___
)Python 2 , 48 bajtów
Wypróbuj online!
źródło
2*0**x
zawsze tak będzie0
. Oczywiście czegoś mi brakuje.x=0
- w takim przypadku jest to 2.Biała spacja , 89 bajtów
Litery
S
(spacja),T
(tab) iN
(nowa linia) dodane tylko jako wyróżnienia.[..._some_action]
dodano tylko jako wyjaśnienie.Oddziela nowy wiersz listy wejściowej,
-1
aby wskazać, że skończyliśmy z danymi wejściowymi.Wypróbuj online .
Objaśnienie w pseudo-kodzie:
źródło
Python 2 ,
60595756 bajtówWypróbuj online!
Zapisano:
źródło
0
iin
JavaScript, 40 bajtów
Wyjścia w odwrotnej kolejności.
Wypróbuj online
1 bajt zapisany dzięki Herman L .
źródło
a=>a.map(x=>x?o.push(x):o.pop(),o=[])&&o
jest o jeden bajt krótszy(un)shift
zanim zauważyłem, że dane wyjściowe można było odwrócić.o
to, ponieważ jest wywoływane w wywołaniu zwrotnym po zdefiniowaniu go w drugim argumencie.05AB1E , 9 bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
9 bajtów alternatywnych:
Wypróbuj online, aby zweryfikować wszystkie przypadki testowe .
Wyjaśnienie:
PS: Jeśli wynik powinien zostać odwrócony, aby pasował do przypadków testowych w opisie wyzwania, możemy dodać znak końcowy
R
do drugiej wersji (czyli 10 bajtów ), która odwraca listę. Wypróbuj online lub sprawdź wszystkie przypadki testowe .źródło
Retina 0.8.2 , 18 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Przedrostek dodatkowy
,
.Przetwórz wszystkie operacje pop.
Usuń,
,
jeśli nadal tam jest.Odwrócenie liczb kosztowałoby dodatkowe 8 bajtów:
źródło
<number>, 0
podlistę niczym.Rubinowy , 36 bajtów
Wypróbuj online!
Anonimowa lambda. Wyjścia w odwrotnej kolejności.
źródło
Brain-Flak , 36 bajtów
Wypróbuj online!
źródło
Brain-Flak , 32 bajty
Wypróbuj online!
Używa
-1
do oznaczenia końca tablicy (ale dowolna liczba tak naprawdę zrobi).źródło
V , 10 bajtów
Wypróbuj online!
Wyjaśnienie
Odpowiednik w Vim , 16 bajtów
Wypróbuj online!
Wyjaśnienie
Prawie tak samo, z wyjątkiem nagrywania makra
q
i rekurencyjnego wywoływania go:źródło
Java 10,
7572 bajtówWyjścia oddzielone przecinkiem. Górna część stosu jest ostatnia. Wypróbuj online tutaj .
Dzięki Olivier Grégoire za grę w golfa 2 bajty.
Sprawdź także odpowiedzi Javy Kevina Cruijssena i Oliviera Grégoire'a . Zamiast tego przyjmują podejście oparte na liście, przy czym ten ostatni bije kopalnię czystym marginesem.
Nie golfowany:
źródło
Stack
przedmiotem. +1 ode mnien->{var s="";for(int i:n)s=(s+","+i).replaceAll(",\\d+,0$","");return s;}
(73 bajty), ale wstawia,
liczby przed, a nie po.n->{var s=""+n;for(int x:n)s=s.replaceFirst("\\d+, 0,? ?","");return s;}
(72 bajty), używa raczej listy niż tablicy i miesza się z danymi wyjściowymi, ponieważ może zwracać rzeczy takie jak „[, 2]”$
aby zapisać dodatkowy bajt, ponieważ każdy0
dodawany jest usuwany od razu.GolfScript ,
1412 bajtówWypróbuj online!
źródło
Perl 5
-p
, 17 bajtówDzięki @sundar i @DomHastings
Wypróbuj online!
źródło
> <> , 25 bajtów
Wypróbuj online! (dane wejściowe muszą być zapisane w ascii. w przeciwnym razie użyj tego )
Jak to działa
i:?\~~
sprawdza 0, kontynuuje~~
usuwanie poprzedniego wpisu. w przeciwnym razie zejdź do:(0:/:^?
który sprawdza -1 (nie ma już danych wejściowych), a następnie zawija się, aby usunąć -1 i zapętlić:!?l:!<oan;
który wypisuje każdą liczbę z nową linią, a następnie kończy się, gdy stos jest opróżnianyźródło
Łuska , 6 bajtów
Ponieważ nie ma już odpowiedzi Husk i jest to mój ulubiony język golfa:
Wypróbuj online!
Wyjaśnienie
Alternatywne rozwiązanie, 6 bajtów
Zamiast przewracać, możemy również odwrócić listę, a następnie użyć opcji fold-right:
Ḟ?:tø↔
źródło
pieprzenie mózgu ,
214150 bajtówCzyta wprowadzone dane jako liczby oddzielone znakami nowej linii. Musi to obejmować pojedynczy znak nowej linii. Nie oczekuje również zer wiodących na każdej liczbie. Dane wyjściowe jako podobna lista oddzielona nowym wierszem
Wypróbuj online!
Wyjaśnienie,
które tak naprawdę nie jest wyjaśnieniem, ale w rzeczywistości jest tylko wersją, nad którą pracowałem z komentarzami i rzeczami, które mogą, ale nie muszą być przydatne dla każdegoźródło
Brachylog , 21 bajtów
Wypróbuj online!
-1 bajt, a co ważniejsze, wydaje się to znacznie mniej niezręcznym sposobem na zrobienie tego.
Alternate 21 byter:
∋0∧ℕ₁;0;P↺c;Qc?∧P,Q↰|
Wypróbuj online!Starszy kod:
22 bajty
Wypróbuj online!
źródło
Ostrzeżenie: powstaje wiele linii. Zostałeś ostrzeżony.
CJam , 17 bajtów
Najbardziej niebezpieczny kod
(Zakłada się, że elementy stosu można oddzielić tylko spacjami na wyjściu i że tablica wejściowa może mieć dowolną formę)
Wypróbuj online!
Wyjaśnienie
Kod alternatywny nr 1, 27 bajtów
(Zakłada, że elementy stosu muszą być wyprowadzane w formacie pokazanym w pytaniu i że tablica wejściowa może mieć dowolną formę)
Wypróbuj online!
Wyjaśnienie
Kod alternatywny nr 2, 24 bajty
(Zakłada się, że elementy stosu mogą być zestawiane w danych wyjściowych i że tablica wejściowa musi mieć dokładny format pokazany w pytaniu)
Wypróbuj online!
Wyjaśnienie
Najbezpieczniejszy kod do tego, 34 bajty
(Zakłada się, że elementy stosu muszą być wyprowadzane w formacie pokazanym w pytaniu i że tablica wejściowa musi być w formacie pokazanym w pytaniu)
Wypróbuj online!
Wyjaśnienie
Dzięki @Jo King za zwrócenie uwagi, że te z posortowanym wyjściem są nieprawidłowe, ponieważ rzeczy takie jak
[12]
i[1,2]
byłyby nierozróżnialne.Dzięki również @Jo King zapewnia bardzo odpowiednią alternatywę dla zestawionych danych wyjściowych i odcina 9 bajtów!
źródło
[12]
a[1,2]
. Jednak wersja 27-bajtowa wydaje się w porządku, choć możesz pozbyć się białych znaków i nawiasów na 18 bajtów]S*
(3), podczas gdy przecinki używają]',*
(4)Czerwony , 64 bajty
Wypróbuj online!
źródło