Wprowadzenie
Kolejka jest abstrakcyjne typy danych, gdzie elementy są dodawane do przodu (Kolejkuj) i usuwa się z tyłu (rozkolejkowania). Jest to również znane jako zasada FIFO (First In First Out) .
Najlepiej pokazano to na przykładzie:
Wyzwanie
Biorąc pod uwagę niepusty tablicę zawierającą dodatnie liczby całkowite i elementy, które wskazują na rozkolejkowania (usunięcie elementu), wyjście końcowe lista kolejki.
Powiedzmy, że X
w tym przykładzie oznacza to dequeue. Rzućmy okiem na następującą listę:
[45, X, X, 37, 20, X, 97, X, 85]
Można to przetłumaczyć na następujący pseudo-kod kolejki:
Queue
Enqueue 45 -> 45
Dequeue ->
Dequeue -> (dequeue on an empty queue is a no-op)
Enqueue 37 -> 37
Enqueue 20 -> 20 37
Dequeue -> 20
Enqueue 97 -> 97 20
Dequeue -> 97
Enqueue 85 -> 85 97
Widać na końcu, że wynikiem jest wynik [85, 97]
tej sekwencji.
Przypadki testowe
Pamiętaj, że możesz wybrać dowolny inny symbol lub znak X
, o ile nie jest to dodatnia liczba całkowita.
[1, X, 2, X, 3, X] -> []
[1, 2, X] -> [2]
[1, 2, 3] -> [3, 2, 1]
[1, 2, X, X, X, 3] -> [3]
[1, 2, X, 3, X, 4] -> [4, 3]
To jest golf golfowy , więc wygrywanie z najmniejszą ilością bajtów wygrywa!
Odpowiedzi:
Galaretka , 8 bajtów
Używa dowolnej wartości fałszowania ( 0 lub pusta iterowalna) do usuwania z kolejki.
Wypróbuj online!
Jak to działa
źródło
Python 2,
565350 bajtówWypróbuj online!
Dequeue jest
-1
. Ta sztuczka pozwala na łatwe Pythonowe krojenie kolejki.źródło
Mathematica, 102 bajty
Zdecydowanie nie jest to najkrótsze rozwiązanie, ale nie mogłem się oprzeć, ponieważ to rodzaj przewrotności.
Po niektórych funkcjach pomocniczych definiuje to czystą funkcję, która przyjmuje ciąg znaków jako dane wejściowe: w ciągu liczby są oddzielane przecinkami (białe znaki są opcjonalne); postacią znaków jest
"]"
; a lista nie ma ograniczników z przodu ani z tyłu. Na przykład pierwszy przykład w OP byłby wprowadzony jako ciąg"45,],],37,20,],97,],85"
. Wynikiem funkcji jest lista liczb.Funkcja zlicza liczbę dequeues
"]"
w ciągu wejściowym, dołącza tyle kopii z"f["
przodu ciągu, a następnie otacza całość"r[...]"
. W powyższym przykładzie powoduje to"r[f[f[f[f[45,],],37,20,],97,],85]"
; zauważ, że wsporniki są wyważone.Następnie
ToExpression
interpretuje powstały ciąg jako fragment kodu Mathematica i wykonuje go. Funkcjaf
jest dogodnie zdefiniowana, aby zachować wszystkie argumenty oprócz pierwszego (a także ignoruje końcowe przecinki; jest to i tak konieczne do obsługi usuwania kolejek z pustych kolejek) ir
konwertuje wynikową sekwencję liczb na listę liczb we właściwej kolejności.źródło
b___,
ma być tam? To działa , ale zwoje przecinek czerwony powodu. (także, jaka jest różnica między wierszami 2 i 3?)f[a_,b___]:=b
(bez przecinkiem), podczas gdy linia 3 jest równoważnaf[a_,b___,Null]:=b
. W obu przypadkachb___
odnosi się do dowolnej liczby argumentów (w tym żadnej). Wiersz 3 jest bardziej szczegółowy, dlatego w razie potrzeby jest zawsze używany przed wierszem 2. Zatem funkcjaf
ignoruje swój pierwszy argument, a także ignoruje swój ostatni argument, jeśli jest to argumentNull
. Było to konieczne do obsługi usuwania z kolejki pustej kolejki. Zauważ, że typowe dane wejściowe dają wyrażenie typur[f[f[f[5,3,],2,],],11]
, gdzie każdy przecinek przedtem]
oznacza aNull
.Siatkówka , 30 bajtów
Wypróbuj online!
Wielokrotnie usuwa pierwszą liczbę, która (niekoniecznie natychmiast), po której następuje
X
razem z niąX
lubX
na początku łańcucha. Następnie cofa pozostałe liczby.źródło
JavaScript,
7063535043 bajtyDzięki @Neil za grę w golfa z 10 bajtów za pomocą x.map zamiast za wyrażenie pętlowe i trójskładnikowe
Dzięki @Arnauld za grę w golfa z 3 bajtów
Dzięki @ETHproductions za grę w golfa poza 7 bajtami
Wypróbuj online!
Dequeue może być dowolną wartością nienumeryczną inną niż true.
źródło
if
instrukcji, i jeszcze krótsze, jeśli użyjeszmap
zamiast pętli, a jeszcze krótsze, jeśli użyjesz wyrażenia zamiast bloku. Zobacz wskazówki .x=>(t=[],x.map(a=>a>0?t.unshift(a):t.pop()),t)
aby zaoszczędzić sporo bajtów nareturn
x=>x.map(a=>a>0?t.unshift(a):t.pop(),t=[])&&t
jest jeszcze krótszy.a?
wystarczy?)Mathematica,
4645 bajtówDzięki ngenisis za oszczędność 1 bajtu.
Zasadniczo to samo, co moja odpowiedź Retina, przy użyciu dopasowania wzorca. Wielokrotnie dopasowujemy pierwszy
X
i usuwamy go wraz z pierwszym numerem (jeśli taki istnieje). Po zakończeniu cofamy listę.źródło
Pure Bash, 72
Dane wejściowe podane jako parametry wiersza polecenia.
Wypróbuj online .
źródło
Haskell, 41 bajtów
źródło
x&(y:z)
MATL ,
1312 bajtówDane wejściowe to tablica liczb z
0
„dequeue”.Dane wyjściowe to liczby oddzielone spacjami. Pusty wynik jest wyświetlany jako nic.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Haskell,
4140 bajtówFunkcja jest
foldl(#)[]
(uwzględniona również w bajtach z bajtem separacji pomiędzy)Wypróbuj online!
X jest dowolną liczbą całkowitą nie dodatnią
EDYCJA: -1 bajtów dzięki nim
źródło
|l>[]=init l|1>0=l
Julia,
78767357 bajtówPodziękowania dla Harrison Grodin za wspaniałe sugestie Julii dotyczące gry w golfa. Zastąpiony if / else trójskładnikiem i for / end ze zrozumieniem listy dla oszczędności 16 bajtów.
Usunięto niepotrzebne spacje dla oszczędności 3 bajtów.
Zanim dozwolone były liczby ujemne lub zero:
Nie golfowany:
Jestem całkiem nowy dla Julii; może być lepszy sposób. Używa
:X
X, który jest symbolem w Julii. Zaktualizowano: Teraz, gdy 0 jest dozwolone, używa 0 (lub dowolnej liczby ujemnej) dla X, zapisując dwa znaki. Zaktualizowałem ponownie, aby usunąć spacje, o których nie wiedziałem, że nie są potrzebne.źródło
05AB1E ,
1211 bajtówOszczędność bajtu dzięki Riley
Wypróbuj online!
Wyjaśnienie
Dequeues są oznaczone dowolną literą .
źródło
GNU Sed, 43
Wynik obejmuje +2 za użycie flag
-r
i-n
.Wypróbuj online .
Wyjaśnienie
źródło
PHP, 85 bajtów
-8 Bajtów
$v
zamiast,is_int($v)
jeśli każda wartość usuwana z kolejki należy do fałszuźródło
Python 3 ,
9594 bajtówWypróbuj online!
Również 94 bajty:
źródło
Perl 5 , 28 + 1 = 29 bajtów
28 bajtów kodu +
-p
flaga.Wypróbuj online!
Używa łańcucha (
$\
) jako kolejki: gdy wejście zawiera liczbę całkowitą (/\d/?
, dodajemy go na początku$\
($\=$_.$\
), a w przeciwnym razie usuwamy ostatnią za pomocąs/.*\n$//
. Na końcu$\
jest domyślnie drukowany dzięki-p
flagie (i te niezrównane}{
).Inne podejścia:
33 bajty , używając tablicy jako kolejki (myślę, że jest to najbardziej naturalny sposób w Perlu, ale nie najkrótszy):
Wypróbuj online!
52 bajty , używając wyrażenia regularnego i
reverse
(zdarza się, że jest to dokładnie to samo, co odpowiedź Retiny Martina Endera - dzięki czemu zapisałem na nim 2 bajty). Odwrócenie listy wymaga jednak wielu znaków, ponieważ aby zachować liczby całkowite, muszę przekonwertować ciąg na tablicę, aby go odwrócić, a następnie z powrotem na ciąg, aby go wydrukować. (say for
zamiast$_=join$",
może zaoszczędzić 2 bajty, ale wymaga-E
lub-M5.010
nie jest aż tak interesujące).Wypróbuj online!
źródło
Python 3, 107 bajtów
Dequeuer może być dowolną wartością nienumeryczną.
Wypróbuj online
źródło
Partia, 160 bajtów
To było trudniejsze niż trzeba.
Oznacza to, że a) muszę mieć znacznik końca kolejki, którego nie można usunąć, oraz b) manipulować kolejką od przodu do przodu, aby nowe elementy wstawiane były tuż przed znacznikiem końca, aby stare elementy mogły zostać usunięte z przodu, co oznacza, że I c) muszę odwrócić kolejkę przed wydrukowaniem.
źródło
PHP, 70 bajtów
źródło
C #, 115 bajtów + 33 bajtów do użycia
Anonimowa metoda, która zwraca listę liczb całkowitych po wykonaniu operacji kolejkowania i usuwania z kolejki. Do usuwania elementów z kolejki używane są ujemne liczby całkowite.
Pełny program z nieprzylepioną metodą i przypadkami testowymi:
źródło
Scala, 97 bajtów
Jako dane wejściowe
f
pobiera listę z0
elementem „dequeue”. Wykorzystuje rekurencję ogona z drugim parametrem (b
), działając jak akumulator. Początkowob
jest pustySeq
(Nil
).Objaśnienia:
Uwaga:
b dropRight 1
jest stosowany zamiastb.tail
do wyjątku unikać:tail of empty list
.Przypadki testowe :
f
może także współpracować z innymi typami (String
,char
, ..., nawet niejednorodny wykaz tych typów!):źródło
REXX, 115 bajtów
Pobiera ciąg rozdzielony spacjami, drukuje ciąg rozdzielony spacjami
źródło
C ++,
122119 bajtów0 oznacza dequeue.
Wypróbuj online!
źródło
Swift 3, 70 bajtów
Zakładając, że mamy szereg Ints jak
let x = [1, 2,-1,3,-1,4]
Zauważ, że
[].prefix(0)
jest to podstępny sposób na uzyskanie pustej ArraySliceźródło