tło
Stack Cats to odwracalny ezoteryczny język stworzony przez Martina Endera. Każde polecenie w stosie kotów jest albo odwrotnością samego siebie (reprezentowaną jako znak symetryczny, np. -_:T|
), Albo ma swoje polecenie odwrotne (reprezentowane jako odbicie lustrzane, takie jak ()
{}
[]
<>
). Stack Cats ma silne wymagania składniowe, aby cały program był lustrzanym odbiciem samego siebie. Zauważ, że oznacza to, że każdy poprawny program Stack Cats jest naturalnym ambigramem obrazu lustrzanego .
Oto cały zestaw poleceń Stack Cats:
- Samosymetryczny:
!*+-:=ITX^_|
- Pary symetryczne:
()
{}
[]
<>
\/
Wszelkie inne znaki są nieprawidłowe; każde wejście zawierające znak spoza powyższego zestawu znaków powinno dawać wartość false.
Język ma dodatkowe ograniczenie ()
i {}
pary muszą być zawsze zrównoważone, ale dla uproszczenia nie musisz sprawdzać tego warunku.
Oto kilka przykładów prawidłowego programu Stack Cats (ponownie, pamiętaj, że nie sprawdzasz zrównoważonych elementów):
{[+]==[+]}
[)>^<(]
({T)}|{(T})
<(*]{[:!-_:>}<[<)*(>]>{<:_-!:]}[*)>
Te nie są:
b<+>d
())(
({[<++<]})
Wyzwanie
Napisz program lub funkcję, która określa, czy podany ciąg jest poprawnym programem Stack Cats. Twój kod powinien być także naturalnym ambigramem obrazu lustrzanego , co oznacza:
- Twój kod powinien być lustrzanym odbiciem samego siebie.
- Twój kod może mieć jedną lub więcej nowych linii, o ile cały kod, wyświetlany w sposób naturalny, jest lustrzanym odbiciem samego siebie.
- Możesz pominąć lub dodać końcowe białe spacje w każdej linii, ponieważ nie zmienia to wyświetlania.
- Znaki tabulacji są niedozwolone, ponieważ wyświetlają się niejasności.
Uwaga: Twój kod nie musi być prawidłowym programem Stack Cats; może zawierać pewne dodatkowe znaki, które nie są dozwolone w Stack Cats. (Pełna lista znajduje się poniżej).
Na przykład następujące dwa programy są symetryczne (a zatem prawidłowe przesłanie ), podczas gdy trzeci nie jest:
({bTd})
[<q|p>]
({bTd})
IXI
({bTd})
IXI
- Jeśli chodzi o „symetrię lustrzaną”, brana jest pod uwagę tylko symetria w stylu Stack Cats (np.
({IH})
Nie jest poprawnym przesłaniem, mimo że ma symetrię lustrzaną). - Twój kod może zawierać tylko te zestawy znaków oraz znak nowej linii:
- Samosymetryczny: spacja (
0x20
) +!"'*+-.8:=AHIMOTUVWXY^_ovwx|
- Pary symetryczne:
()
/\
<>
[]
bd
pq
{}
- Samosymetryczny: spacja (
Zestaw znaków jest wybierany tak, aby był ściśle symetryczny lub samosymetryczny, gdy jest wyświetlany jako kod w SE.
Wejście i wyjście
Zakres wejściowy jest dowolnym ciągiem jednej linii drukowalnych znaków ASCII .
Możesz wybrać wejście jako ciąg znaków, listę znaków lub listę wartości ASCII.
Możesz wybrać wyjście:
- Dowolna z wartości prawdy / fałszu określona przez wybrany język
- Rzeczywiste wartości wyników mogą się różnić między danymi wejściowymi (np. Wyjście 1 dla prawdziwego wejścia i 2 dla innego prawdziwego).
- Zamiana wartości prawdy i fałszu jest niedozwolona.
- Dowolne dwie stałe wartości odpowiednio dla wartości prawda / fałsz
- W takim przypadku wartości wynikowe powinny być dokładnie jedną z dwóch stałych wartości.
W formularzu należy podać metodę wprowadzania i wartości wyjściowe.
Warunki wygranej
To jest golf golfowy , więc wygrywa najmniej bajtów w każdym języku.
Notatki
- Standardowe luki są jak zwykle zabronione.
- Oczywiście możesz to rozwiązać w Stack Cats, ale jest szansa, że nie możesz użyć flagi, która pozwala zmniejszyć rozmiar kodu o połowę. I jest to bardzo trudny do opanowania język: P
źródło
#
zabronione?Odpowiedzi:
JavaScript (ES6),
487467378298292280266264 bajtówZaoszczędź 14 bajtów dzięki @Bubbler
Definiuje anonimową funkcję, która pobiera tablicę znaków i zwraca żądane dane wyjściowe. Dane wyjściowe są zgodne z prawdą / fałszem; zwykle
1
/0
, ale pusty ciąg dajetrue
.W jaki sposób?
Najbardziej oczywistą sztuczką jest użycie
//\\
jako punktu centralnego do skomentowania lustrzanej wersji kodu. Następnie staje się grą polegającą na znalezieniu najkrótszego sposobu rozwiązania problemu za pomocą tylko podanego zestawu znaków.Pierwszym problemem, na jaki napotykamy, jest brak słów kluczowych i wbudowanych funkcji. Cud wciąż mamy
.pop()
, ale wszystko inne trzeba będzie zrobić za pomocą dozwolonych operatorów (w tyma[b]
if(c)
) z rekurencją w celu emulacji pętli.Druga kwestia to brak operatorów logicznych. Ani
&
i nie?
są dozwolone, co oznacza jedynym operatorem, z którego możemy skorzystać, jest||
. Dlatego musimy dokładnie ustrukturyzować naszą logikę, aby to uwzględnić.Pierwszą rzeczą, którą zrobiłem, było zdefiniowanie funkcji
T
która odzwierciedla indywidualny charakter. Podstawową ideą jest zapętlanie każdej postaci w szeregu znaków, które można wykonać w lustrze, testując każdą z nich pod kątem równości z danym char. Jeśli jest on równy, wracamy swoje lustrzane char coindex^1
za(){}[]<>\/
lub char sama do końca.Pierwszym problemem, na który natknąłem się tutaj, było uzyskanie albo lustrzanego char albo wartości falsy przy każdej iteracji. Rozwiązaniem, które ostatecznie wymyśliłem, było
(x!=A[o]||A)[o^o<88/8]
, gdziex
jest znak wejściowy,A
jest lustrzanym alfabetem io
jest bieżącym indeksem. Jeślix
nie jest taki sam jakA[o]
, daje totrue
, a wyrażenie indeksu ocenia naundefined
; w przeciwnym razie||A
zostanie aktywowany, a my skończymyA[o^(o<11)]
.Drugim problemem jest zakończenie rekursji. Odkryłem, że najlepszym sposobem na to jest po prostu konkatenacja wyników każdej iteracji, zwracanie pustego ciągu po osiągnięciu końca
A
. Stwarza to nam dwa kolejne problemy: konwersjęundefined
s na puste łańcuchy i zwrócenie||
czegoś pustego łańcucha . Można je rozwiązać za pomocą nadużywania tablic:[a]+""
daje ciąg znakówa
lub ciąg pusty, jeśli niea
jest zdefiniowany. Jako bonus,[]
jest zgodny z prawdą, ale łączy się z pustym ciągiem, dzięki czemu możemy wygodnie użyć go jako „prawdziwego pustego ciągu”.Teraz możemy użyć
T
funkcji do odzwierciedlenia dowolnego pojedynczego znaku. Robimy to rekurencyjnie, porównując lustroI[v++]
do,I.pop()
aż do osiągnięcia końca tablicy znaków. Nie możemy użyć&&
lub&
sprawdzić, czy wszystkie porównania są zgodne z prawdą, ale skorzystaj*
zamiast tego. Pomnożenie wszystkich tych wyników razem daje1
jeśli każda postać jest zwierciadłem przeciwnej lub0
jeśli jakiekolwiek porównanie się nie powiedzie.I tak w zasadzie działa ta odpowiedź. Prawdopodobnie nie wyjaśniłem tego bardzo jasno, więc zadawaj pytania i wskaż błędy, które popełniłem.
źródło
U=([A,...H])=>!(V=H.pop())||!(W=([x,...X]=(T="!*+-:=ITX^_|")+"(){}[]<>\\/",[o,...O]=T+")(}{][></\\")=>!x||((o!=A)+(x!=V))*(W(X,O)))()*U(H)//...
280 bajtówStax ,
7670 bajtówUruchom i debuguj
Stax jest przyjacielem Stack Cats i ma elementy wewnętrzne do generowania późniejszej połowy programu Stack Cats z pierwszej połowy. Jeśli nie obchodzi nas ograniczenie źródła i nie musimy sprawdzać zestawu znaków, oto 4-bajtowe rozwiązanie:
4 bajty
Uruchom i debuguj
Wyjaśnienie
źródło
R
iW
jest naprawdę interesujące.pq
Imponujące jest również zakończenie programu przez połączenie.:R
i:W
. Wydaje mi się, że nie mogę nic poradzić, by powiedzieć wszystkim, że w Stax są takie elementy wewnętrzne.