Eine 'gerade Zeichenfolge' ist eine beliebige Zeichenfolge, bei der sich die Parität der ASCII-Werte der Zeichen immer abwechselt. Die Zeichenfolge EvenSt-ring$!
ist beispielsweise eine gerade Zeichenfolge, da die ASCII-Werte der Zeichen wie folgt lauten:
69 118 101 110 83 116 45 114 105 110 103 36 33
Und die Paritäten dieser Zahlen sind:
Odd Even Odd Even Odd Even Odd Even Odd Even Odd Even Odd
Welches wechselt den ganzen Weg. Ein String wie Hello world!
ist jedoch kein gerader String, da die ASCII-Werte wie folgt lauten:
72 101 108 108 111 32 87 111 114 108 100 33
Und die Paritäten sind:
Even Odd Even Even Odd Even Odd Odd Even Even Even Odd
Was sich natürlich nicht immer abwechselt.
Die Herausforderung
Sie müssen entweder ein vollständiges Programm oder eine Funktion schreiben, die eine Zeichenfolge zur Eingabe akzeptiert und einen Wahrheitswert ausgibt , wenn die Zeichenfolge gerade ist, und ansonsten einen falschen Wert. Sie können Ihre Eingaben und Ausgaben in jedem vernünftigen Format vornehmen und davon ausgehen, dass die Eingabe nur druckbares ASCII (Bereich 32-127) enthält. Sie müssen keine leeren Eingaben verarbeiten.
Beispiele
Hier sind einige Beispiele für gerade Zeichenfolgen:
#define
EvenSt-ring$!
long
abcdABCD
3.141
~
0123456789
C ode - g ol!f
HatchingLobstersVexinglyPopulateJuvenileFoxglove
Und all diese Beispiele sind nicht einmal Strings:
Hello World
PPCG
3.1415
babbage
Code-golf
Standard loopholes apply
Shortest answer in bytes wins
Happy golfing!
Sie können diese Lösung auch zum Testen von Zeichenfolgen verwenden, wenn Sie auf einen bestimmten Testfall neugierig sind.
lno
.Antworten:
MATL ,
43 BytesVielen Dank an Emigna für das Speichern eines Bytes und an Luis Mendo für das Beheben einiger Fehler. Code:
Erläuterung:
Probieren Sie es online!
quelle
A
.A
Stimmenzahl würde es ermöglichen , dank der Arbeitsweise von MATL das Auslassen zuzulassenif
.2\
durcho
. Und der Code wird sehr ... unbedingt aussehen :-)4
Ausgestriche sind nach wie vor regelmäßig4
...05AB1E ,
54 BytesDank Adnan 1 Byte gespeichert .
Probieren Sie es online!
Erläuterung
quelle
Ç¥ÉP
:)Jelly ,
754 Bytes2 Bytes mit der Delta-Idee von @ Steven H. gespeichert
1 Byte dank @ Lynn gespeichert .
Probieren Sie es online! oder Überprüfen Sie alle Testfälle.
Erläuterung
quelle
%2
→Ḃ
mod
.Python 2, 54 Bytes
quelle
Mathematica,
5044 BytesDie aktuelle Version ist im Grunde genommen die ganze Virtuosität von Martin Ender.
Rückgabe
True
oderFalse
. Nichts allzu Schlaues: Nimmt die Mod-2-Summe jedes Paares aufeinanderfolgender ASCII-Codes und prüft, ob niemals eine 0 erhalten wird.Alte Version:
quelle
JavaScript (ES6),
605046 BytesIch habe es mit Rekursion versucht, aber bei 51 Bytes scheint es sich nicht wirklich zu lohnen:
Testschnipsel
Code-Snippet anzeigen
quelle
s=>[...Buffer(s)].every(c=>p-(p=c&1),p=2)
Brain-Flak ,
138,114,112,84 + 3 = 87 BytesVielen Dank an @Riley für die Hilfe beim Golfen.
Dieses Programm behandelt leere Eingaben als ungeraden String.
Probieren Sie es online!
Erklärung (veraltet)
Verschiebt die Eingabe vom linken Stapel nach rechts, während Sie um 2 modifizieren. Ermittelt den Unterschied zwischen den benachbarten Zeichen, bis alle überprüft wurden oder einer der Unterschiede gleich Null ist (was nur in einer ungeraden Zeichenfolge auftreten würde). Wenn die Schleife aufgrund einer ungeraden Zeichenfolge beendet wurde, wechseln Sie zurück zum linken Stapel, und geben Sie den verbleibenden Wert ein. Andernfalls bleiben Sie auf dem rechten Stapel und platzieren die Null über der 1 auf dem Stapel.
quelle
([]){{}
->{
und entfernen Sie ihn([])
kurz vor dem Schließen der ersten Schleife.{({}(())){({}[()]<(()[{}])>)}{}({}<>)<>}<>
(42 Bytes) umgewandelt werden kann. Dies wurde von Ihrem ursprünglichen Modul abgeleitet. Damit es mit Ihrem Programm funktioniert, muss eine zusätzliche Null hinzugefügt werden:{({}(())){({}[()]<(()[{}])>)}{}({}()<>)<>}<>
R
4135 BytesBEARBEITEN: Sparte dank @JDL ein paar Bytes mit
diff
anstelle vonrle
.Erläuterung
readline()
Eingabe lesen.utf8ToInt()%%2
In ASCII-Werte und Mod 2 konvertieren (als R-Vektor speichern)all(rle()==1)
Lauflängencodierung von zu findenden Läufen. Alle Läufe sollten gleich oder kleiner als 2 sein, da keine Läufe negativ oder 0 sein können (spart ein Byte statt==
).quelle
prod(...)
anstatt zuall(... == 1)
sparen.>1
?all
um Nullen und Einsen handelte.rle
diff
all(diff(utf8ToInt(readline())%%2))
all(numeric(0))
läuft es darauf hinaus, auf welcheTRUE
die gewünschte Antwort für eine Länge von einer Zeichenfolge lautet . (Ich habe getestet, ob es wichtig ist, gegen R-3.3.1)Pyth ( Gabel ), 9 Bytes
Kein Try It Online-Link, da die Gabel keine eigene Version in den Online-Dolmetschern hat.
Erläuterung:
quelle
Brachylog , 17 Bytes
Probieren Sie es online!
Erläuterung
quelle
Java 8,
77767257 Bytes-4 Bytes dank @Geobits .
Erläuterung:
Probieren Sie es online aus.
quelle
boolean
hier zurückgeben sollten (ich weiß, es ist scheiße). Das Beste, was ich auf diese Weise erreichen konnte (72), ist die Verwendung eines Flag-Int wie: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 141121Beinhaltet +3 für -a
30 Bytes gespart dank 1000000000
Ausgabe:
wahr : 1
falsch : 0 oben auf dem Stapel
Probieren Sie es online! (ehrlich)
Probieren Sie es online! (falsch)
Bessere Erklärung kommt später (wenn ich mich erinnern kann, wie es nach ein paar Stunden funktioniert ...)
quelle
Sternenklar , 85 Bytes
Probieren Sie es online!
Da ein Starry-Programm nicht erkennen kann, wann eine Eingabe beliebiger Länge endet, markiert dieses Programm das Ende der Zeichenfolge mit einem nachgestellten Zeilenumbruch in der Eingabe. Wenn Sie eine kryptische Fehlermeldung und nicht definierte Methode erhalten
ord
fürnil:NilClass
dann wird die Eingabe eines Newline fehlt.Erläuterung
Die grundlegende Strategie, die das Programm anwendet, besteht darin, die Zeichen einzeln von der Eingabe zu lesen. Wenn es sich nicht um eine neue Zeile handelt (Zeichen 10), ändert es den ASCII-Wert des Zeichens um 2 und findet den Unterschied zwischen diesem und dem zuvor gelesenen Zeichen. Wenn die Differenz Null ist, wird das Programm beendet und gedruckt
0
(falsey). Andernfalls springt das Programm zurück und führt den Vorgang erneut durch. Wenn das Programm eine neue Zeile liest, bricht es ab und druckt10
(wahrheitsgemäß).Kommentiertes Programm
quelle
Perl, 24 + 1 (
-p
) = 25 Bytes-4 Bytes dank @Ton Hospel !
Benötigt
-p
Flagge. Outputs 1 ist der String ist gerade, sonst nichts. Zum Beispiel :Erklärungen : Ersetzt jedes Zeichen durch seinen Wert mod 2 (der String enthält danach nur noch 0s und 1s). Dann suchen Sie nach zwei folgenden 1 oder 0: Wenn es einige findet, dann ist die Zeichenfolge nicht gerade, sonst ist es.
quelle
s/./$&&v1/eg;$_=!/(.)\1/
. PS(ord$&)%2
hätte geschrieben werden können als1&ord$&
v1
?\x01
ist nichtJ, 15 Bytes
Verwendung
Erläuterung
quelle
Vim, 38 Bytes
qqs<C-R>=char2nr(@")%2<CR><Esc>l@qq@q:g/00\|11/d<CR>
Nimmt an, dass die Eingabezeichenfolge im Puffer und leer ist
"q
. Gibt binären Unsinn aus, wenn wahr, nichts, wenn falsch.s<C-R>=char2nr(@")%2<CR>
: Ersetzt ein Zeichen durch 1, wenn ungerade, 0, wenn gerade. Das Makro, in dem dies ist, bewirkt dies für jedes Zeichen in der Zeile (egal wie lang es ist).:g/00\|11/d<CR>
: Löscht die Zeile, wenn 2 aufeinanderfolgende "Bits" den gleichen Wert haben. Schneller als ein Rückverweis.Wenn Sie in Vimgolf eine Ausdrucksfunktion innerhalb eines Makros verwenden, sollten Sie das Makro normalerweise selbst im Ausdrucksregister ausführen und einige Tricks verwenden, um die Tabulatoren zu vervollständigen. Diesmal ist es schwieriger. Vielleicht finde ich später einen Weg, das zu verkürzen.
quelle
Retina , 39 Bytes
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Ausgänge
1
für wahr und0
für falsch.Probieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)
Erläuterung
Inspiriert von einer Antwort von mbomb007 habe ich kürzlich eine relativ kurze
ord()
Implementierung in Retina entwickelt. Dies basiert größtenteils darauf, obwohl ich einige Vereinfachungen vornehmen konnte, da ich kein Dezimalergebnis benötige, da ich nur druckbares ASCII unterstützen muss (und mich nur um die Parität des Ergebnisses kümmere, was letztendlich dazu führt, dass ein beliebiger Versatz ist auch in Ordnung).Stufe 1: Split
Dies teilt die Eingabe einfach in ihre einzelnen Zeichen auf, indem es um die leere Übereinstimmung herum aufgeteilt wird und die leeren Ergebnisse am Anfang und Ende mit gelöscht werden
_
.Stufe 2: Ersetzen
Das
%{
teilt Retina a) mit, dass diese und die nächste Stufe in einer Schleife ausgeführt werden sollen, bis sich die Zeichenfolge durch eine vollständige Iteration nicht mehr ändert, und dass diese beiden Stufen für jede Zeile (dh für jedes Zeichen) der Eingabe separat angewendet werden sollen.Die Bühne selbst ist die Standardtechnik zum Duplizieren des ersten Zeichens der Eingabe. Wir passen die leere Zeichenfolge an (sehen uns aber nur die ersten beiden Übereinstimmungen an) und fügen das Präfix dieser Übereinstimmung ein. Das Präfix der ersten Übereinstimmung (am Anfang der Zeichenfolge) ist leer, dies macht also nichts, und das Präfix der zweiten Übereinstimmung ist das erste Zeichen, das daher dupliziert wird.
Stufe 3: Transliterieren
}
zeigt das Ende der Schleife an. Die Bühne selbst ist eine Transliteration.01
Gibt an, dass es nur auf das erste Zeichen der Zeichenfolge angewendet werden soll.p
ist eine Abkürzung für alle druckbaren ASCII-Zeichen und_
bedeutet "Löschen". Wenn wir dies erweitern, führt die Transliteration die folgende Transformation durch:Leerzeichen werden gelöscht und alle anderen Zeichen werden dekrementiert. Das bedeutet, dass diese beiden Stufen zusammen einen Zeichenbereich vom Leerzeichen bis zum angegebenen Zeichen erzeugen (da sie das erste Zeichen wiederholt duplizieren und dekrementieren, bis es ein Leerzeichen wird, an dem das Duplizieren und Löschen abgebrochen wird).
Die Länge dieses Bereichs kann verwendet werden, um die Parität des Zeichens zu bestimmen.
Stufe 4: Ersetzen
Wir lassen einfach alle Zeichenpaare fallen. Dies löscht Zeilen mit gerader Länge und reduziert Zeilen mit ungerader Länge auf ein einzelnes Zeichen (das Eingabezeichen, aber das ist eigentlich egal).
Stufe 5: Match
Es ist einfacher, Eingaben zu finden, die ungerade sind , daher zählen wir die Anzahl der Übereinstimmungen von entweder zwei aufeinanderfolgenden leeren Zeilen oder zwei aufeinanderfolgenden nicht leeren Zeilen. Wir sollten
0
für gerade Eingaben und sonst etwas ungleich Null bekommen.Stufe 6: Match
Jetzt müssen wir nur noch das Ergebnis invertieren, indem wir die Anzahl der Übereinstimmungen dieses regulären Ausdrucks zählen, wodurch überprüft wird, ob die Eingabe mit a beginnt
0
. Dies ist nur möglich, wenn das Ergebnis der ersten Stufe war0
.quelle
Clojure, 59 Bytes
Erzeugt alle sequentiellen Paare aus einem String
n
und prüft, ob jede Paarsumme ungerade ist. Wenn eine Folge von Ints als vernünftiges Format angesehen wird, sind es 50 Bytes.Sehen Sie es online: https://ideone.com/USeSnk
quelle
Julia,
5553 BytesErklärt
Ordnen Sie Zeichen 0 | 1 zu und prüfen Sie, ob die resultierende Zeichenfolge "00" oder "11" enthält, wodurch die Zeichenfolge nicht abwechselt.
quelle
Python, 52 Bytes
Eine rekursive Funktion. Erzeugt 1 (oder True) für gerade Zeichenfolgen, 0 für ungerade Zeichenfolgen. Multipliziert die Parität der Differenz der ersten beiden Zeichen mit dem rekursiven Wert im Rest. Eine Zeichenfolge mit nur einem Zeichen gibt True an, wenn dies mit dem ersten Zeichen gleichgesetzt wird. Dies setzt voraus, dass die Eingabe nicht leer ist. Andernfalls wird ein weiteres Byte für
s==s[:1]
oder benötigtlen(s)<2
.Python 2, 52 Bytes
Alternativ eine iterative Lösung. Iteriert über die eingegebenen Zeichen und speichert die aktuellen und vorherigen Zeichenwerte Mod. 2. Multipliziert das laufende Produkt mit der Differenz, die wegen 0 (Falsch) nur dann besteht, wenn zwei aufeinanderfolgende Paritäten gleich sind.
Der "vorherige" Wert wird mit 2 (oder einem beliebigen Wert ungleich 0 oder 1) initialisiert, so dass das erste Zeichen niemals mit der Parität des fiktiven vorherigen Zeichens übereinstimmt.
Python, 42 Byte, wird über den Exit-Code ausgegeben
Ausgänge über Exit-Code. Wird mit einem ZeroDivisionError beendet, wenn zwei aufeinanderfolgende Zeichen die gleichen Paritäten aufweisen, andernfalls wird der Befehl ordnungsgemäß beendet.
quelle
Haskell,
4240 BytesAnwendungsbeispiel:
all odd.(zipWith(-)=<<tail).map fromEnum $ "long"
->True
.Wie es funktioniert:
Edit: @xnor speicherte zwei Bytes. Vielen Dank!
quelle
all odd.(zipWith(-)=<<tail).map fromEnum
.Mathematica,
41-40Bytes-1 Charakter, danke an Martin Ender
quelle
C, 52 Bytes
Vergleicht die Parität der ersten zwei Zeichen und durchläuft die Zeichenfolge rekursiv, bis 2 Zeichen mit der gleichen Parität oder die Zeichenfolge mit der Länge 1 (
s[1] == 0
) gefunden werden.Code mit einigen Testfällen
quelle
f(char*s){s=s[1]?(*s-s[1])%2?f(s+1):0:1;}
Sie nicht die Int, Return oder [0]*++s
anstelle der zweitens[1]
Sie ändern können ,f(s+1)
zuf(s)
. das plus mein vorheriger Kommentar bringen die Summe auf 39; Ich sollte auch hinzufügen, dass das Entfernenreturn
es nicht auf ideone funktioniert, aber es funktioniert immer noch mit gcc unter Windowsf(char*s){s=s[1]?(*s-*++s)%2&&f(s):1;}
Ich würde weitermachen, aber es ist 5 Uhr morgens und ich bin in 3 Stunden aufgewacht lmaoPyke, 8 Bytes
Probieren Sie es hier aus!
quelle
C #, 69 Bytes
Volles Programm mit Testfällen:
quelle
PHP, 69 Bytes
Lösung mit Regex 81 Bytes
quelle
PowerShell v2 +, 47 Byte
(Kann die üblichen Konkurrenten von PowerShell nicht ganz einfangen ...)
Nimmt Eingaben
$args[0]
als Zeichenfolge,char
wandelt sie als -array um und durchläuft sie|%{...}
. Bei jeder Iteration wird das Modulo in der Pipeline platziert (implizit[char]
für die[int]
Konvertierung). Diese werden in Parens eingekapselt und-join
zu einem String zusammengefasst, der in die linke Hand des-notmatch
Operators eingespeist wird und gegen00
oder prüft11
(dh,True
wenn0
s und1
s alternieren). Dieses boolesche Ergebnis verbleibt in der Pipeline und die Ausgabe ist implizit.Testfälle
quelle
> <> ,
2927 BytesGibt 1 aus, wenn das Wort gerade ist, 0, wenn das Wort ungerade ist.
Sie können es online ausprobieren .
Edit: Zwei Bytes dank Martin Ender gespeichert
quelle
Perl 6 ,
4726 BytesErweitert:
quelle
Scala, 54 Bytes
Ich bin sicher, dass dies verbessert werden kann.
quelle