„Łańcuch parzysty” to dowolny ciąg, w którym parzystość wartości ASCII znaków jest zawsze naprzemienna. Na przykład ciąg EvenSt-ring$!
jest ciągiem parzystym, ponieważ wartości ASCII znaków to:
69 118 101 110 83 116 45 114 105 110 103 36 33
A parytety tych liczb to:
Odd Even Odd Even Odd Even Odd Even Odd Even Odd Even Odd
Co zmienia się na przemian przez całą drogę. Jednak łańcuch jak Hello world!
to nie jeszcze ciąg ponieważ wartości ASCII są:
72 101 108 108 111 32 87 111 114 108 100 33
A parytety to:
Even Odd Even Even Odd Even Odd Odd Even Even Even Odd
Co oczywiście nie zawsze jest na przemian.
Wyzwanie
Musisz napisać pełny program lub funkcję, która akceptuje ciąg wejściowy i wyświetla prawdziwą wartość, jeśli ciąg jest parzysty, a w przeciwnym razie wartość fałsz. Możesz przyjmować dane wejściowe i wyjściowe w dowolnym rozsądnym formacie i możesz założyć, że dane wejściowe będą miały tylko drukowalny ASCII (zakres 32-127). Zdajesz nie muszą obsługiwać pusty wkład.
Przykłady
Oto kilka przykładów parzystych ciągów:
#define
EvenSt-ring$!
long
abcdABCD
3.141
~
0123456789
C ode - g ol!f
HatchingLobstersVexinglyPopulateJuvenileFoxglove
Wszystkie te przykłady nie są nawet łańcuchami:
Hello World
PPCG
3.1415
babbage
Code-golf
Standard loopholes apply
Shortest answer in bytes wins
Happy golfing!
Możesz także użyć tego niestosowanego rozwiązania do testowania dowolnych ciągów, jeśli jesteś ciekawy konkretnego przypadku testowego.
lno
.Odpowiedzi:
MATL ,
43 bajtyPodziękowania dla Emigny za uratowanie bajtu i podziękowania dla Luisa Mendo za naprawienie niektórych błędów. Kod:
Wyjaśnienie:
Wypróbuj online!
źródło
A
.A
ze względu na sposób działania MATL-aif
.2\
przezo
. A kod będzie wyglądał bardzo ... koniecznie :-)4
jest nadal regularny4
...05AB1E ,
54 bajtówZaoszczędzono 1 bajt dzięki Adnanowi .
Wypróbuj online!
Wyjaśnienie
źródło
Ç¥ÉP
:)Galaretka ,
754 bajtówZaoszczędzono 2 bajty, używając pomysłu delta z @ Steven H.
Zapisano 1 bajt dzięki @ Lynn .
Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe.
Wyjaśnienie
źródło
%2
→Ḃ
mod
.Python 2, 54 bajtów
źródło
Mathematica,
5044 bajtówObecna wersja jest w zasadzie wirtuozerią Martina Endera.
Zwraca
True
lubFalse
. Nic zbyt sprytnego: pobiera sumę mod-2 każdej pary kolejnych kodów ASCII i sprawdza, czy 0 nigdy nie jest uzyskiwane.Stara wersja:
źródło
JavaScript (ES6),
605046 bajtówPróbowałem rekurencji, ale przy 51 bajtach nie wydaje się to warte:
Testowy fragment kodu
Pokaż fragment kodu
źródło
s=>[...Buffer(s)].every(c=>p-(p=c&1),p=2)
Brain-Flak ,
13811411284 + 3 = 87 bajtówDzięki @Riley za pomoc w grze w golfa.
Ten program traktuje puste dane wejściowe jako ciąg nici.
Wypróbuj online!
Wyjaśnienie (nieaktualne)
Przesuwa dane wejściowe z lewego stosu w prawo podczas modowania o 2. Znajduje różnicę między każdym sąsiednim znakiem, aż wszystkie zostaną sprawdzone lub jedna z różnic będzie równa zero (co wystąpiłoby tylko w żadnym nieistniejącym ciągu). Jeśli pętla zakończy się z powodu nierównomiernego ciągu, przełącz się z powrotem na lewy stos i usuń pozostałą na nim wartość. W przeciwnym razie pozostań na właściwym stosie i wyzeruj zero powyżej 1 pozostającego na stosie.
źródło
([]){{}
->{
i usuń([])
z tuż przed zamknięciem pierwszej pętli.{({}(())){({}[()]<(()[{}])>)}{}({}<>)<>}<>
(42 bajty). Wynikało to z twojego oryginalnego modułu. Aby działało z twoim programem, należy dodać dodatkowy +1 nilad:{({}(())){({}[()]<(()[{}])>)}{}({}()<>)<>}<>
R,
4135 bajtówEDYCJA: Zaoszczędź kilka bajtów dzięki @JDL, używając
diff
zamiastrle
.Wyjaśnienie
readline()
odczytać wejście.utf8ToInt()%%2
konwertuj na wartości ascii i mod 2 (zapisz jako wektor R)all(rle()==1)
kodowanie długości przebiegu w celu znalezienia przebiegów. Wszystkie przebiegi powinny być równe 1 lub mniejsze niż 2, ponieważ żadne przebiegi nie mogą być ujemne lub 0 (zapisuje jeden bajt zamiast==
).źródło
prod(...)
zamiastall(... == 1)
oszczędzania kilku znaków.>1
?all
są zera i jedynki.rle
i używającdiff
:all(diff(utf8ToInt(readline())%%2))
(otrzymujemy ostrzeżenie, ale nie sądzę, że jest to niedozwolone)all(numeric(0))
co jestTRUE
pożądaną odpowiedzią dla długości jednego sznurka. (Testowałem, jeśli ma to znaczenie, przeciwko R-3.3.1)Pyth ( widelec ), 9 bajtów
Brak linku Wypróbuj online, ponieważ rozwidlenie nie ma własnej wersji w tłumaczach internetowych.
Wyjaśnienie:
źródło
Brachylog , 17 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Java 8,
77767257 bajtów-4 bajty dzięki @Geobits .
Wyjaśnienie:
Wypróbuj online.
źródło
boolean
tutaj (wiem, to jest do bani). Najlepsze, co udało mi się uzyskać w ten sposób (72), to użycie flag-int, takich jak:boolean c(char[]a){int i=3,b=1;for(int c:a)b=i==(i=c%2)?0:b;return b>0;}
Brain-Flak
155 151 141121Zawiera +3 dla -a
Zaoszczędzono 30 bajtów dzięki 1000000000
Wyjście:
prawda : 1
fałsz : 0 na górze stosu
Wypróbuj online! (prawda)
Wypróbuj online! (falsy)
Lepsze wyjaśnienie nastąpi później (jeśli pamiętam, jak to działa po kilku godzinach ...)
źródło
Gwiaździsta , 85 bajtów
Wypróbuj online!
Zauważ, że ponieważ program Starry nie ma sposobu na określenie, kiedy kończy się wejście o dowolnej długości, program ten używa końcowego znaku nowej linii na wejściu, aby oznaczyć koniec łańcucha. Jeśli pojawi się komunikat o błędzie o tajemniczą i metody niezdefiniowanej
ord
przeznil:NilClass
to wejście brakuje końcowego znaku nowej linii.Wyjaśnienie
Podstawową strategią stosowaną przez program jest czytanie znaków jeden po drugim z wejścia, a jeśli nie są one znakiem nowej linii (znak 10), modyfikuje wartość ASCII znaku o 2 i znajduje różnicę między nim a poprzednio odczytanym znakiem. Jeśli różnica wynosi zero, program kończy działanie i drukuje
0
(falsey). W przeciwnym razie program zapętla się i wykonuje ten proces od nowa. Jeśli program odczytuje nowy wiersz, kończy się i drukuje10
(prawda).Program z adnotacjami
źródło
Perl, 24 + 1 (
-p
) = 25 bajtów-4 bajty dzięki @Ton Hospel !
Potrzebuje
-p
flagi. Wyjścia 1 to ciąg parzysty, nic poza tym. Na przykład :Objaśnienia : zastępuje każdy znak wartością mod 2 (więc ciąg zawiera tylko 0 i 1). Następnie wyszukaj dwa następujące 1 lub 0: jeśli znajdzie jakiś, to łańcuch nie jest parzysty, w przeciwnym razie jest.
źródło
s/./$&&v1/eg;$_=!/(.)\1/
. PS(ord$&)%2
można by zapisać jako1&ord$&
v1
?\x01
J, 15 bajtów
Stosowanie
Wyjaśnienie
źródło
Vim, 38 bajtów
qqs<C-R>=char2nr(@")%2<CR><Esc>l@qq@q:g/00\|11/d<CR>
Zakłada ciąg wejściowy w buforze i pusty
"q
. Wysyła binarne bzdury, jeśli jest to prawda, nic, jeśli jest to fałsz.s<C-R>=char2nr(@")%2<CR>
: Zamienia znak na 1, jeśli nieparzysty, 0, jeśli parzysty. Makro to właśnie robi to dla każdego znaku w linii (bez względu na to, jak długo to trwa).:g/00\|11/d<CR>
: Usuwa linię, jeśli 2 kolejne „bity” mają tę samą wartość. Szybciej niż referencje.Zwykle w vimgolf, kiedy używasz funkcji wyrażenia wewnątrz makra, powinieneś zrobić to samo w rejestrze wyrażeń i użyć pewnych sztuczek, aby uzupełnić tabulatorami. Tym razem trudniej. Później znajdę sposób, aby to skrócić.
źródło
Siatkówka , 39 bajtów
Liczba bajtów zakłada kodowanie ISO 8859-1.
Wyjścia
1
dla prawdy i0
fałszu.Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).
Wyjaśnienie
Zainspirowany odpowiedzią mbomb007 opracowałem ostatnio dość krótką
ord()
implementację w Retinie. Jest to w dużej mierze oparte na tym, chociaż udało mi się wprowadzić kilka uproszczeń, ponieważ nie potrzebuję wyniku dziesiętnego, ponieważ muszę tylko obsługiwać ASCII do wydruku (i zależy mi tylko na parzystości wyniku, więc kończę na dowolne przesunięcie również jest w porządku).Etap 1: Podział
To po prostu dzieli dane wejściowe na poszczególne znaki, dzieląc je wokół pustego dopasowania i upuszczając puste wyniki na początku i na końcu
_
.Etap 2: Wymień
%{
Mówi Retina a) że etap ten i następny powinien być prowadzony w pętli aż łańcuch zatrzyma się zmienia przez pełną iteracji, i że te dwa etapy powinny być stosowane do każdej linii (każdy znak) na wejściu oddzielnie.Sam etap jest standardową techniką powielania pierwszego znaku danych wejściowych. Dopasowujemy pusty ciąg (ale patrzymy tylko na pierwsze dwa dopasowania) i wstawiamy prefiks tego dopasowania. Prefiks pierwszego dopasowania (na początku łańcucha) jest pusty, więc nic to nie robi, a prefiks drugiego dopasowania jest pierwszym znakiem, który jest zatem duplikowany.
Etap 3: Transliteracja
}
wskazuje koniec pętli. Sama scena jest transliteracją.01
wskazuje, że należy go zastosować tylko do pierwszego znaku ciągu.p
jest skrótem dla wszystkich drukowalnych znaków ASCII i_
oznacza „usuń”. Jeśli więc to rozwiniemy, transliteracja wykona następującą transformację:Spacje są usuwane, a wszystkie inne znaki są zmniejszane. Oznacza to, że te dwa etapy razem utworzą zakres postaci od spacji do danej postaci (ponieważ będą wielokrotnie duplikować i zmniejszać pierwszy znak, aż stanie się spacją, w której to miejsce anuluje się powielanie i usuwanie).
Długość tego zakresu można wykorzystać do ustalenia parzystości znaku.
Etap 4: Zamień
Po prostu upuszczamy wszystkie pary znaków. Czyści to linie o parzystej długości i redukuje linie o nieparzystej długości do jednego znaku (tak naprawdę znak wejściowy, ale to nie ma znaczenia).
Etap 5: mecz
Łatwiej jest znaleźć dane wejściowe, które nie są nawet równe, dlatego liczymy liczbę dopasowań dwóch kolejnych pustych linii lub dwóch kolejnych niepustych linii. Powinniśmy dostać
0
za parzyste dane wejściowe, a w przeciwnym razie coś niezerowego.Etap 6: Mecz
Pozostało tylko odwrócić wynik, co robimy, licząc liczbę dopasowań tego wyrażenia regularnego, co sprawdza, czy dane wejściowe zaczynają się od
0
. Jest to możliwe tylko wtedy, gdy wynik pierwszego etapu był0
.źródło
Clojure, 59 bajtów
Generuje wszystkie sekwencyjne pary z łańcucha
n
i sprawdza, czy suma każdej pary jest nieparzysta. Jeśli sekwencja ints jest uważana za rozsądny format, to ma 50 bajtów.Zobacz online: https://ideone.com/USeSnk
źródło
Julia,
5553 bajtówWyjaśnił
Odwzoruj znaki na 0 | 1 i sprawdź, czy wynikowy ciąg zawiera „00” lub „11”, co powoduje, że ciąg nie jest na przemian.
źródło
Python, 52 bajty
Funkcja rekurencyjna. Daje 1 (lub True) dla parzystych ciągów, 0 dla nieparzystych. Mnoży parzystość różnicy pierwszych dwóch znaków przez wartość rekurencyjną reszty. Ciąg znaków składający się z jednego znaku daje wartość True, co jest sprawdzane przez to, że równa się jej pierwszy znak. Zakłada się, że dane wejściowe nie są puste; w przeciwnym razie potrzebny jest jeszcze jeden bajt dla
s==s[:1]
lublen(s)<2
.Python 2, 52 bajty
Alternatywnie, iteracyjne rozwiązanie. Iteruje nad znakami wejściowymi, przechowując bieżące i poprzednie wartości znaków mod 2. Mnoży działający produkt przez różnicę, która ponieważ 0 (Falsey) tylko wtedy, gdy dwa kolejne parzystości są równe.
Wartość „poprzednia” jest inicjowana na 2 (lub dowolną wartość inną niż 0 lub 1), dzięki czemu pierwszy znak nigdy nie pasuje do parzystości z fikcyjnym poprzednim znakiem.
Python, 42 bajty, generowany przez kod wyjścia
Dane wyjściowe za pośrednictwem kodu wyjścia. Kończy się z ZeroDivisionError, gdy dwa kolejne znaki mają te same parzystości, w przeciwnym razie kończy się czysto.
źródło
Haskell,
4240 bajtówPrzykład użycia:
all odd.(zipWith(-)=<<tail).map fromEnum $ "long"
->True
.Jak to działa:
Edycja: @xnor zapisał dwa bajty. Dzięki!
źródło
all odd.(zipWith(-)=<<tail).map fromEnum
.Mathematica,
4140 bajtów-1 postać, dzięki Martinowi Enderowi
źródło
C, 52 bajty
Porównuje parzystość pierwszych 2 znaków, rekurencyjnie poruszając się po łańcuchu, aż znajdzie 2 znaki o tej samej parzystości lub łańcuch o długości 1 (
s[1] == 0
).Kod z niektórymi przypadkami testowymi
źródło
f(char*s){s=s[1]?(*s-s[1])%2?f(s+1):0:1;}
, że nie potrzebujesz int, return ani [0]*++s
zamiast drugiejs[1]
możesz zmienićf(s+1)
naf(s)
. plus mój poprzedni komentarz zmniejszają całkowitą liczbę do 39; Powinienem również dodać, że usunięciereturn
powoduje, że nie działa on na ideone, ale nadal działa z gcc naf(char*s){s=s[1]?(*s-*++s)%2&&f(s):1;}
Chciałbym kontynuować, ale jest piąta rano i obudziłem się za 3 godziny lmaoPyke, 8 bajtów
Wypróbuj tutaj!
źródło
C #, 69 bajtów
Pełny program z przypadkami testowymi:
źródło
PHP, 69 bajtów
rozwiązanie z Regex 81 Bytes
źródło
PowerShell v2 +, 47 bajtów
(Nie można dość złapać zwykle konkurentów PowerShell za ...)
Zajmuje wejście
$args[0]
jako ciąg, rzuca go jakochar
-array, pętle przez niego|%{...}
, każda iteracja umieszczenie modulo na rurociągu (z niejawna[char]
do[int]
konwersji). Są one kapsułkowane w pareny i przetwarzane-join
w ciąg znaków, który jest podawany do lewej strony-notmatch
operatora, sprawdzając względem00
lub11
(tj. Zwraca wTrue
kierunku0
s i1
e alternatywna). Ten wynik logiczny jest pozostawiany w potoku, a dane wyjściowe są niejawne.Przypadki testowe
źródło
> <> ,
2927 bajtówZwraca 1, jeśli słowo jest parzyste, 0, jeśli słowo jest nieparzyste.
Możesz spróbować online .
Edycja: zapisane dwa bajty dzięki Martinowi Enderowi
źródło
Perl 6 ,
4726 bajtówRozszerzony:
źródło
Scala, 54 bajty
Jestem pewien, że można to poprawić.
źródło