tło
Na podstawie gry, którą mój czterolatek dostał od swojego rabina.
„Celem” jest „znalezienie” liter w określonej kolejności, np aecdb
. Otrzymujesz stos kart listowych, np daceb
. Możesz przeszukiwać stos tylko w podanej kolejności, aczkolwiek cyklicznie. Kiedy napotkasz potrzebny list, wyjmiesz go ze stosu.
Cel
Biorąc pod uwagę kolejność i stos (wzajemne permutacje bez duplikatów), znajdź sekwencję liter najwyższego stosu (wszystkie to ASCII do wydrukowania), które widzisz podczas gry.
Przykład krok po kroku
Musimy znaleźć zamówienie aecdb
, biorąc pod uwagę stos daceb
:
Na górę stosu d
: Nie to, czego szukasz ( a
), więc możemy go dodać do sekwencji: d
i obracać, aby uzyskać stos: acebd
.
Szczyt stosu a
: Tak! więc dodać go do sekwencji: da
i usunąć go ze stosu: cebd
.
Na górę stosu c
: Nie to, czego szukasz ( e
), więc możemy go dodać do sekwencji: dac
i obracać, aby uzyskać stos: ebdc
.
Szczyt stosu e
: Tak! więc dodać go do sekwencji: dace
i usunąć go ze stosu: bdc
.
Na górę stosu b
: Nie to, czego szukasz ( c
), więc możemy go dodać do sekwencji: daceb
i obracać, aby uzyskać stos: dcb
.
Na górę stosu d
: Nie to, czego szukasz ( c
), więc możemy go dodać do sekwencji: dacebd
i obracać, aby uzyskać stos: cbd
.
Szczyt stosu c
: Tak! więc dodać go do sekwencji: dacebdc
i usunąć go ze stosu: bd
.
Na górę stosu b
: Nie to, czego szukasz ( d
), więc możemy go dodać do sekwencji: dacebdcb
i obracać, aby uzyskać stos: db
.
Szczyt stosu d
: Tak! więc dodać go do sekwencji: dacebdcbd
i usunąć go ze stosu: b
.
Szczyt stosu b
: Tak! więc dodać go do sekwencji: dacebdcbdb
i usunąć go ze stosu: .
I skończone. Rezultat jest dacebdcbdb
.
Realizacja referencyjna
def letters(target, stack):
string = ''
while stack:
string += stack[0]
if stack[0] == target[0]:
stack.pop(0)
target = target[1:]
else:
stack.append(stack.pop(0))
return string
print letters('aecdb', list('daceb'))
Przypadki testowe
try
, yrt
→yrtyry
1234
, 4321
→4321432434
ABCDEFGHIJKLMNOPQRSTUVWXYZ
, RUAHYKCLQZXEMPBWGDIOTVJNSF
→RUAHYKCLQZXEMPBWGDIOTVJNSFRUHYKCLQZXEMPWGDIOTVJNSFRUHYKLQZXEMPWGIOTVJNSFRUHYKLQZXMPWGIOTVJNSRUHYKLQZXMPWIOTVJNSRUYKLQZXMPWOTVNSRUYQZXPWOTVSRUYQZXPWTVSRUYQZXWTVSRUYZXWTVSUYZXWTVUYZXWVYZXWYZXYZ
?
, ?
→?
a
, a
→a a
abcd
, abcd
→abcd
99
konkretnie?APL (Dyalog Classic) , 21 bajtów
Wypróbuj online!
Jest to pociąg równoważny
{∊⍵,(⊂⍵)~¨(,\⍺⊂⍨1,2>/⍺⍋⍵)}
⍋
daje permutację prawego argumentu⍵
w lewym argumencie⍺
1,2>/
porównaj kolejne pary>
i przygotuj 1⍺⊂⍨
użyj powyższej maski logicznej, aby podzielić⍺
na grupy; 1s w masce oznaczają początek nowej grupy,\
skumulowane konkatenacje grup(⊂⍵)~¨
uzupełnienie każdego w odniesieniu do⍵
⍵,
prepend⍵
∊
spłaszczyć jako pojedynczy ciągźródło
Partia, 155 bajtów
Bierze cel i stos jako dane wejściowe w STDIN.
źródło
JavaScript (ES6), 54 bajty
Bierze cel jako ciąg, a stos jako tablicę znaków. Zwraca ciąg.
Przypadki testowe
Pokaż fragment kodu
W jaki sposób?
Przy każdej iteracji wyodrębniamy postać
c
na wierzchu stosu i dołączamy do końcowego wyniku. Następnie wykonujemy wywołanie rekurencyjne, którego parametry zależą od wynikuc == t[0]
, gdziet[0]
jest następny oczekiwany znak.Jeśli
c
pasujet[0]
:c
z ciągu docelowego, przekazująct.slice(1)
c
ze stosu, przekazującs
bez zmianJeśli
c
nie pasujet[0]
:t.slice(0)
c
na końcu stosuźródło
Python 2 , 73 bajty
Wypróbuj online!
Podejrzewam, że to bardzo gra w golfa.
źródło
Python 2 , 65 bajtów
Wypróbuj online!
źródło
Haskell ,
4946 bajtówWypróbuj online!
Dość proste. Lewy argument to „cel”, a prawy stos. Jeśli główka bramki pasuje do górnej części stosu, przygotowujemy ją i powtarzamy z resztą bramki i stosu (bez ponownego dodawania przedmiotu na górze). W przeciwnym razie dodamy najwyższy element i powtórzymy z tym samym celem, czytając najwyższy element na końcu stosu. Gdy cel jest pusty, dopasowanie wzorca wybiera drugą linię i pusta lista jest zwracana.
EDYCJA: -3 bajty dzięki @GolfWolf i @Laikoni!
źródło
Czysty , 85 bajtów
Wypróbuj online!
Definiuje
f
przyjmowanie funkcji częściowej,[Char]
a[Char]
gdzie pierwszy argument jest celem, a drugi stosem.źródło
Java 8, 88 bajtów
Dane wejściowe jako
char[]
ijava.util.LinkedList<Character>
(java.util.Queue
wdrożenie)Wyjaśnienie:
Wypróbuj online.
źródło
> <> ,
3832 bajtówEdycja: Pelikan turkusowy ma tutaj znacznie lepsze
><>
podejście , które zamienia metody wprowadzaniaWypróbuj online!
Bierze porządek liter przez
-s
flagę, a stos przez wejście.Jak to działa:
źródło
Perl 5 , 42 + 2 (
-pl
) = 44 bajtówWypróbuj online!
źródło
> <> ,
2116 bajtówWypróbuj online!
Zmieniono przepływ, aby wykorzystać puste miejsca i usunąć dodatkowe przekierowywanie kodu. (-5 bajtów) - Dzięki @JoKing
> <> , 21 bajtów
Wypróbuj online!
Inną odpowiedź> <> można znaleźć tutaj.
Wyjaśnienie
Stos zaczyna się od początkowego zestawu znaków przy użyciu flagi -s. Dane wejściowe to kolejność znaków podana przez użytkownika. To wyjaśnienie będzie zgodne z przepływem kodu.
źródło
Perl, 62 bajty
Pobiera swój pierwszy argument, kolejność, jako listę znaków, a drugi stos, jako ciąg.
Nie golfowany:
Czy zastanawiałeś się kiedyś, po co były te wszystkie niejasne zmienne regularne? Najwyraźniej zostały zaprojektowane do tego właśnie wyzwania. Dopasowujemy obecną postać
$x
(którą niestety trzeba uciec, jeśli jest to znak specjalny wyrażenia regularnego). To wygodnie dzieli ciąg na „przed dopasowaniem”$`
, „dopasowaniem”$&
i „po dopasowaniu”$'
. Podczas cyklicznego wyszukiwania wyraźnie widzieliśmy każdą postać przed meczem i odkładaliśmy ją z powrotem na stos. Widzieliśmy również obecną postać, ale jej nie przywróciliśmy. Tak więc dodajemy „przed dopasowaniem” do listy „widziane”$z
i konstruujemy stos z „po dopasowaniu”, a następnie „przed dopasowaniem”.źródło
SNOBOL4 (CSNOBOL4) , 98 bajtów
Wypróbuj online!
Drukuje każdą literę na nowej linii. Użyj tej wersji, aby uzyskać wszystko do drukowania w tej samej linii. Pobiera dane wejściowe jako stos, a następnie cel, oddzielone znakiem nowej linii.
źródło
Perl, 44 bajty
Obejmuje
+4
dla-lF
Podaj dane wejściowe jak na STDIN jako cel, a następnie stos (w odwrotnej kolejności z przykładów):
Jeśli nie przeszkadza ci końcowy znak nowej linii,
40
działa to :źródło