Preludium to ezoteryczny język programowania, który ma bardzo niewiele, ale nietypowe, ograniczeń dotyczących tego, co stanowi prawidłowy program. Każdy blok drukowalnego tekstu ASCII („blok” oznacza, że wiersze drukowalnego ASCII są oddzielone znakami nowej linii - 0x0A) jest prawidłowy, pod warunkiem że:
- Każda (pionowa) kolumna tekstu zawiera co najwyżej jedną z
(
i)
. - Ignorując ich położenie pionowe,
(
i)
są zrównoważone, to znaczy, że każdy(
jest sparowany z dokładnie jednym)
po prawej stronie i odwrotnie.
Napisz program lub funkcję, która, biorąc pod uwagę ciąg znaków zawierający drukowalne ASCII i znaki nowej linii, określa, czy stanowi on prawidłowy program Prelude. Możesz przyjmować dane wejściowe za pośrednictwem STDIN (lub najbliższej alternatywy), argumentu wiersza poleceń lub argumentu funkcji. Wynik może zostać zwrócony lub wydrukowany do STDOUT przy użyciu dowolnych dwóch ustalonych wartości true / falsy .
Nie można zakładać, że wejście jest prostokątne.
To jest kod golfowy, więc wygrywa najkrótsze przesłanie (w bajtach).
Przykłady
Oto prawidłowe programy Preludium (w rzeczywistości są to nawet prawdziwe programy Preludium):
?1-(v #1)-
1 0v ^(# 0)(1+0)#)!
(#) ^#1-(0 #
1(# 1) v # - 1+)
vv (##^v^+
? v-(0 # ^ #)
?
1+ 1-!
A oto kilka danych wejściowych, z których wszystkie są nieprawidłowe :
#(#(##)##)##(
)##(##(##)#)#
#(#)
)###
#(##
(##)
(##)
(#)#
(##)
(###
#(#)
(##)
#(#)
###)
#()#
()##
#(#)##
###
###(#)
źródło
)
i 2(
. Czy nie powinien to być tylko 1 na linię?Odpowiedzi:
CJam,
5756 bajtówZa długo można dużo grać w golfa. Wyjaśnienie, które należy dodać, gdy zacznę grać w golfa.
Krótkie wyjaśnienie
Kod składa się z dwóch kontroli:
Number of "(" - Number of ")"
) powinny się wzajemnie uzupełniać. Kiedy je dodasz, wynik powinien wynosić 0. Każda część, która nie spełnia tej właściwości, powoduje, że całe dane wejściowe mają niepasujące nawiasy kwadratowe.Number of "(" - Number of ")"
nie może być ujemna dla bloku po prawej stronie.Wypróbuj online tutaj
źródło
Python 2,
128119105 bajtówCzy wiesz, że możesz zmapować Brak w Pythonie 2?
Wyjaśnienie
Chcemy zacząć od transpozycji Preludium, aby kolumny stały się wierszami. Zwykle robilibyśmy to za pomocą
zip
, ale ponieważzip
skraca się do najkrótszej długości rzędu iitertools.zip_longest
jest zdecydowanie za długi dla gry w golfa, wydaje się, że nie ma krótkiego sposobu na zrobienie tego, co chcemy ...Z wyjątkiem mapowania
None
:Niestety (a raczej, na szczęście dla wszystkich celów innych niż golf), działa to tylko w Pythonie 2.
Co do
n
iv
:n
działa jak stos, licząc1 - <number of unmatched '(' remaining>
. Za każde,(
co widzimy, odejmujemy 1, a za każde,)
co widzimy, dodajemy 1. Stąd, jeślin >= 2
w którymś momencie, widzieliśmy zbyt wiele)
s, a program jest nieprawidłowy. Jeślin
nie zakończy się na 1, oznacza to, że pozostała nam co najmniej jedna niedopasowana(
.v
sprawdza ważność i rozpoczyna się od 1. Jeśli program jest kiedykolwiek nieprawidłowy (n >= 2
lubA+B >= 2
), wówczas przyjmuje wartośćv
0, oznaczając nieważność.Dlatego jeśli program jest ważny, to do końca musimy go mieć
n = 1, v = 1
. Jeśli program jest nieprawidłowy, to do końca musimy albov = 0
, albov = 1, n <= 0
. Dlatego ważność można zwięźle wyrazić jakon*v>0
.(Dzięki @feersum za wiele dobrych sugestii, które pobrały 14 bajtów!)
Poprzednie, bardziej czytelne przesłanie:
źródło
map
...def F(p): v=n=3 for r in map(None,*p.split("\n")):A,B=map(R.count,"()");n+=A-B;v*=n>2>A+B return n*v==9
or
do porównania łańcuchowych, ale nie myślę o zmianie|=
na*=
. AleJ, 64 bajty
Dane wejściowe to ciąg znaków z końcowym znakiem nowej linii. Wyjście wynosi 0 lub 1.
Przykładowe użycie
Metoda jest następująca
];.2
(
/)
/anything else
into1
/-1
/0
1 _1 0{~[:'()'&i.]
s=.+/@:
przysłówek, który dodany do czasownika sumuje dane wyjściowe tablicy czasownikówdodaj wartości w kolumnach
]s
()
saldo w każdym prefiksie[:(0>])s)[:+/\]
()
równowagę na całej liście (tj. w ostatnim prefiksie)|@{:@]
dodaj abs (wartości) w kolumnach i sprawdź każdy element pod kątem maksymalnej wartości 1
(1<|s)s
ponieważ wszystkie poprzednie kontrole dały wynik pozytywny w przypadku niepowodzenia, dodajemy je i porównujemy z 0, aby uzyskać poprawność danych wejściowych
0=]
źródło
J, 56 bajtów
Jest to anonimowa funkcja akceptująca ciąg z końcowym znakiem nowej linii i zwracająca 0 lub 1. Czytanie od prawej do lewej:
];.2 y
, podobnie jak w drugim przedłożeniu J, odcina ciąg znakówy
we wszystkich wystąpieniach jego ostatniego znaku (dlatego dane wejściowe wymagają nowej linii) i tworzy prostokątną macierz, której rzędy są kawałkami, w razie potrzeby wypełnionymi spacjami.'()'=/
porównuje najpierw każdy znak w tej macierzy z,(
a następnie)
zwracając listę dwóch macierzy 0-1.+.^:_1]0|:
zamienia listę dwóch macierzy w jedną macierz liczb zespolonych. Jak dotąd program zamienia każde(
wejście na 1, każde)
na i, a każdy inny znak na 0.b=.+/
przypisuje do sumy wierszy tej złożonej macierzyb
.-.|b
tworzy listę 1- | z | dla każdego zb
. Warunek, że każda kolumna zawiera co najwyżej jeden nawias, przekłada się na wszystkie te liczby 1- | z | być nieujemnym.+/\*:b
to wektor sum sumy kwadratów liczb wb
. Jeśli każda kolumna zawiera co najwyżej jeden nawias, wszystkie kwadraty liczbb
to 0, 1 lub -1. W,
Łączy tego wektora z wektorem 1- | Z | 's.Teraz wszystko, co musisz zrobić, to sprawdzić, czy wpisy naszego połączonego wektorem
v
są nieujemnymi numery liczb rzeczywistych, to jest prawie*/0<:v
, z wyjątkiem tego, który powoduje błąd, jeśli niektóre wpisyv
nie są prawdziwe, więc możemy zastąpić<:
z<: ::0:
których po prostu zwraca 0 w przypadku błędu .źródło
0={:+/\*:b
np.(
Nie jest poprawny.0=(-|)v
jest o 2 bajty krótszy do sprawdzania nieujemnych wartości rzeczywistych. (Pokonajmy CJam!: P)inv
zamiast^:_1
oszczędza kolejny bajt.3 :'*/0=({:,]-|)(-.@|,+/\@:*:)+/+.inv]0|:''()''=/];.2 y'
.