Program szachownicy to program, w którym wartość porządkowa każdego pojedynczego znaku zmienia się z parzystej na nieparzystą, z wyłączeniem terminatora linii (którym mogą być dowolne standardowe zakończenia linii).
Program trójkątny to program, w którym każda linia ma jeden dodatkowy znak niż poprzedni, przy czym pierwsza linia ma jeden znak. Nie musisz obsługiwać pustych danych wejściowych.
Twoim zadaniem jest zbudowanie programu, który potwierdzi, że dane dane wejściowe są zgodne z tymi kryteriami, a wyniki / zwraca coś prawdziwego, jeśli program spełnia kryteria, lub coś innego fałszywego.
Twój program musi również spełniać te kryteria.
Przykłady prawidłowych programów
G
`e
@u^
5r{B
^
cB
+$C
VA01
Zasady
- Twój program może zaczynać się od nieparzystego lub parzystego bajtu, o ile zmienia się parzystość znaków.
- Twój program musi sprawdzać poprawność programów rozpoczynających się od znaku nieparzystego lub parzystego.
- W przypadku znaków Unicode podstawowe wartości bajtów muszą mieć naprzemienną parzystość.
- Możesz założyć, że dane wejściowe zawierają tylko znaki do wydrukowania. Jeśli twój program zawiera niedrukowalne, nadal powinien być w stanie sam się zweryfikować.
- Twój program może zawierać jeden końcowy znak nowej linii, nie musi to być dozwolone przez twoją walidację, ponieważ możesz założyć, że została ona usunięta przed walidacją.
- Standardowe luki są zabronione.
- Wygrywa najkrótszy kod w bajtach w każdym języku.
code-golf
restricted-source
source-layout
Dom Hastings
źródło
źródło
E\nOE\nOEO
. Mam nadzieję, że to pomaga!Odpowiedzi:
Stax , 26 bajtów
Uruchom przypadki testowe online
Musiałem przedstawić 3 śmieciowe postacie.
i
jest opcją, gdy znajduje się poza wszystkimi konstrukcjami pętli.to zawsze brak możliwości.
O
wsuwa 1 pod górę stosu, ale wartość nie jest używana w programie.Uruchom ten
źródło
C (gcc), 189 bajtów
Wypróbuj online!
␉
reprezentuje znak tabulacji (przepraszam). Zauważ, że istnieje kilka końcowych spacji / tabulatorów (przepraszam bardziej). Oryginał z nienaruszonymi zakładkami najlepiej oglądać w vim z:set tabstop=1
(słowa nie wyrażają, jak mi przykro).Jest to funkcja (wywoływana
f
, co nie jest od razu widoczne po spojrzeniu na nią), która przyjmuje ciąg znaków jako argument i zwraca albo0
albo1
.Mógłbym to zmniejszyć o co najmniej jedną i prawdopodobnie dwie lub więcej linii, ale zauważ, że pod koniec robi się coraz bardziej niechlujny i wymaga mniej wysiłku, głównie dlatego, że pisanie tak okropnego kodu (nawet według standardów PPCG) sprawiało, że czułam się jak zła osoba i chciałem się zatrzymać jak najszybciej.
Podstawowym założeniem jest, aby uniknąć konstrukcje, które muszą złamać format (
++
,+=
,return
, itd.). Cudem ważne słowa kluczowe, takie jakfor
,char
iwhile
(których nie skończyłem) pasują do naprzemiennej reguły parzystości. Następnie użyłem spacji (parzystości) i tabulatorów (parzystości nieparzystej) jako wypełnienia, aby reszta pasowała do reguł.źródło
Haskell ,
10801033 bajtówWypróbuj online!
Wyjaśnienie
To było dość interesujące zadanie dla Haskell.
Parytet
Na początek potrzebujemy jakiegoś sposobu ustalenia, czy znak ma parzysty czy nieparzysty punkt kodowy. Normalnym sposobem, aby to zrobić, jest uzyskanie punktu kodowego i zmodyfikowanie go o 2. Jednak, jak wiadomo, uzyskanie punktu kodowego znaku wymaga importu, co z powodu ograniczenia źródła oznacza, że nie można używany. Bardziej doświadczony Haskeller pomyślałby o użyciu rekurencji.
Char
są częścią tejEnum
klasy, dzięki czemu możemy zdobyć ich poprzedników i następców. Jednakpred
isucc
to też zarówno bezużyteczny, ponieważ nie alternatywny bajtów parzystości.Więc to nas mocno utknęło, że prawie nie możemy manipulować znakami. Rozwiązaniem tego jest zaszyfrowanie wszystkiego. Możemy reprezentować (większość) parzystych znaków jako literały, szanse, z którymi mamy problem, ponieważ
'
są nieparzyste, więc nie może znajdować się obok samego znaku, co uniemożliwia dosłowne wyrażenie większości nieparzystych znaków. Więc na stałe kodujemy wszystkie parzyste bajty, a następnie dodajemy catch dla wszystkich nieparzystych bajtów na końcu.Problem Bajty
Możesz zauważyć, że istnieją pewne nawet bajty, dla których literałów nie można utworzyć, zawijając je w cudzysłowy. Są to niedrukowalne, nowe linie i
\
. Nie musimy się martwić o materiały niedrukowalne, ponieważ dopóki nie użyjemy żadnego z nich, nie musimy weryfikować. W rzeczywistości nadal możemy używać dziwnych, niedrukowalnych elementów, takich jak tab, po prostu nie muszę tego robić. Newline można zignorować, ponieważ i tak zostanie on przycięty z programu. (Moglibyśmy dodać znak nowej linii, ponieważ jego kod jest raczej wygodny, ale nie musimy). To pozostawia\
, teraz\
ma kododpunkt 92, który dogodnie jest liczbą nieparzystą, po której następuje parzysta liczba, więc na\92
przemian wyrównuje i wyrównuje, a zatem dosłownie'\92'
jest całkowicie poprawny. Później, kiedy będziemy musieli reprezentować znak nowej linii, zauważymy, że na szczęście ma tę samą właściwość'\10'
.Problemy z odstępami
Teraz, aby rozpocząć pisanie rzeczywistego kodu, musimy umieć znaczną liczbę znaków w jednym wierszu. Aby to zrobić, napisałem cap:
Czapka nie robi nic oprócz ważnego Haskella. Początkowo miałem nadzieję stworzyć definicje, które pomogą nam w kodzie później, ale tak się nie stało. Są też łatwiejsze sposoby na dodanie znaku, na przykład białe znaki i średniki, ale nie oszczędzają w ten sposób bajtów, więc nie zadałem sobie trudu, aby go zmienić.
Hardcoder
Teraz, gdy mam już wystarczająco dużo miejsca w linii, zaczynam wartości na stałe. Jest to w większości dość nudne, ale jest kilka interesujących rzeczy. Po raz pierwszy linie stają się jeszcze dłuższe, możemy użyć
;
do umieszczenia wielu deklaracji w linii, co oszczędza nam mnóstwo bajtów.Po drugie, ponieważ nie zawsze możemy zaczynać linię od
g
tak często, musimy nieco wciąć linie. Teraz Haskell naprawdę dba o wcięcia, więc będzie na to narzekać. Jeśli jednak ostatnia linia przed linią wcięcia kończy się średnikiem, pozwoli na to. Dlaczego? Nie mam najsłabszego, ale działa. Musimy więc pamiętać o umieszczeniu średników na końcu linii.Bloki konstrukcyjne funkcji
Po wykonaniu hardcodera płynne przejście do końca programu. Musimy zbudować kilka prostych funkcji. Najpierw buduję wersję o
drop
nazwiei
.i
różni się oddrop
tego, że jeśli spróbujemy przejść poza koniec łańcucha, po prostu zwraca"y"
.i
różni się od upuszczania również tym, że jeśli spróbuje upuścić nową linię, zwróci"y"
, Przydadzą się, ponieważ później, gdy sprawdzimy, czy program jest trójkątem, pozwoli nam to powrócić,False
gdy ostatni wiersz nie jest kompletny, lub gdy linia kończy się wcześnie.k
k
True
k
False
Następnie zrobić alias
k
,m
.m
jest tylkok
z1
pierwszym argumentem, a nowy wiersz jest dodawany do drugiego argumentu.Następnie mamy
o
.o
bierze liczbę i ciąg znaków. Określa, czy bajty ciągu (ignorując znaki nowej linii) zmieniają się w parzystości (używając naszegog
), zaczynając od numeru wejściowego.Na koniec mamy,
s
który działao
z oboma1
i0
, jeśli któryś z nich się powiedzie, odracza sięm
. Jeśli zawiedzie oba, po prostu wracaFalse
. To jest funkcja, której chcemy. Określa, że wejście jest trójkątne i naprzemienne.źródło
05AB1E ,
3426 bajtówWypróbuj online!
Pobiera dane wejściowe jako ciąg wielowierszowy (dane między „” ” ). Objaśnienia, które przyjdą później.
źródło
Java 10, 209 bajtów
Pusta lambda przyjmująca iterowalną tablicę
byte
. Wskazuje wartość true, zwracając normalnie, wartość false, zgłaszając wyjątek czasu wykonywania. Program oczekuje, że ostatnia linia zostanie poprawnie zakończona, tzn. Zakończy się znakiem nowej linii. Ostatnia linia programu jest podobnie zakończona.Wszystko odbywa się w UTF-8, z interpretacją, że „znak” odnosi się do punktów kodu Unicode.
W tym widoku karty są zastępowane spacjami.
Wypróbuj online
Zrzut heksowy
Przywróć za pomocą
xxd -p -r
na Uniksie.Nie golfił
f
jest oczekiwaną liczbą znaków w bieżącym wierszu,h
jest liczbą znaków widoczną do tej pory w bieżącym wierszu,c
jest ostatnim widocznym bajtem i określa,b
czya
jest to nowy wiersz.Warunek
a > -65
sprawdza, czya
jest to pierwszy bajt w znaku. Działa to, ponieważ znaki jednobajtowe (ASCII) są nieujemne w 8-bitowym uzupełnieniu dwóch, pierwszy bajt dłuższych znaków ma postać binarną11xxxxxx
(co najmniej -64 w uzupełnieniu dwóch), a niepowiązane bajty w tych znakach są forma10xxxxxx
, najwyżej -65 w uzupełnieniu do dwóch. ( Źródło )Gdy znak narusza wzór trójkąta lub szachownicy (tj. Nowa linia pojawia się wcześnie lub późno lub pojawia się bajt złej parzystości), lewa gałąź odpowiedniej trójki (w przypisaniu do
f
lubc
) aktywuje się, a metoda zgłasza wyjątek arytmetyczny.źródło
Python 3 (3,4?), 350 bajtów
Trudne wyzwanie dla języka tak specyficznego dla białych znaków jak Python 3. Przesłanie jest drukowane
0
lub1
standardowe i ulega awarii dla niektórych danych wejściowych. Program oczekuje, że ostatnia linia zostanie poprawnie zakończona, tzn. Zakończy się znakiem nowej linii. Ostatnia linia programu jest podobnie zakończona. UTF-8 służy do sprawdzania parzystości bajtów.W tym widoku karty są zastępowane spacjami.
Działa dla mnie z Python 3.4.2; nie działa na żadnym Pythonie 3 na TIO. Wydaje mi się, że to błąd w tłumaczach TIO.
Hex Dump
Przywróć z
xxd -p -r
na Uniksie.źródło