(Hinweis: Dies ist ein Ableger meiner vorherigen Herausforderung " Find the Swirling Words"! )
Definition von Infinity Word :
- Wenn Sie alle Zeichen eines Unendlichkeitsworts auf dem Alphabet (AZ) mit Kurven verbinden , erhalten Sie das Unendlichkeitssymbol ∞ wie in den folgenden Diagrammen.
- Alle geraden Verbindungen müssen unterbrochen sein , alle ungeraden Verbindungen müssen aktiviert sein .
- Sie können Groß- / Kleinschreibung ignorieren oder alle in Groß- oder Kleinschreibung umwandeln.
- Die eingegebenen Wörter sind nur Zeichen im alphabetischen Bereich von AZ, keine Leerzeichen, keine Interpunktion oder Symbole.
- Jedes Wort muss genau 5 Zeichen enthalten. Wörter> 5 oder <5 sind ungültig.
- Wenn ein Wort aus zwei aufeinanderfolgenden Zeichen besteht, ist das Wort ungültig, z. B. "FLOOD" oder "QUEEN".
- Alle Unendlichkeitswörter beginnen und enden mit demselben Zeichen.
Hier einige Beispiele:
Aufgabe:
Schreiben Sie ein vollständiges Programm oder eine Funktion, die ein Wort von der Standardeingabe übernimmt und ausgibt, ob es sich um ein Unendlichkeitswort handelt oder nicht. Die Ausgabe kann wahr / falsch, 1/0, 1 / Null usw. sein.
Testfälle:
Infinity Words:
ALPHA, EAGLE, HARSH, NINON, PINUP, RULER, THEFT, WIDOW
NOT Infinity Words:
CUBIC, ERASE, FLUFF, LABEL, MODEM, RADAR, RIVER, SWISS, TRUST,
KNEES, QUEEN, GROOVE, ONLY, CHARACTER, OFF, IT, ORTHO
Regeln:
- Kürzester Code gewinnt.
Optionale Aufgabe:
Finden Sie als Liste so viele Unendlichkeitswörter wie möglich in einem englischen Wörterbuch. Sie können die vollständige Liste der englischen Wörter zum Beispiel als Referenz nehmen hier .
Antworten:
Jelly ,
43 41 40 25 24 23 22 21 1413 Bytes-7 Bytes dank fireflame241 (
0ị=1ị$
->=ṚḢ
undIIA⁼2,2
Test für die 4 Umdrehungen)-1 Dank Kevin Cruijssen (Nutzung von bisher nicht nilad
Ø2
welche Erträge[2,2]
)TryItOnline
oder alle Testfälle (plus "REGELN")
Wie?
Ein Unendlichkeitswort hat:
Alle außer (1) und (äquivalent) (4) können auf eine Bedingung heruntergekocht werden, dass die Alphabet-Delta-Zeichen eine Rotation von
[1,1,-1,-1]
(wobei das Zeichen von0
ist0
) sind.fireflame241 merkte an, dass dies dann äquivalent zu den Deltas der Deltas der alphabetischen Deltazeichen ist, in
[[2,2],[2,-2],[-2,2],[-2,-2]]
denen getestet werden kann, indem die absoluten Werte gleich sind[2,2]
!Wie?
quelle
II
prüft hier auf Gleichheit mit einer Drehung von 1,1, -1, -1.Java 8,
23119318512210378 BytesProbieren Sie es hier aus.
-38 bytes danke an @ dpa97 für die erinnerung , dass ich
char[]
anstelle von verwendeString
.-63 Bytes dank der von @KarlNapf abgeleiteten Formel.
-25 Byte durch Konvertieren von Java 7 in Java 8 (und Rückgabe eines Booleschen Werts anstelle einer Ganzzahl).
193 Bytes Antwort:
Erläuterung:
false
false
true
ob sie mit einem von ihnen übereinstimmen (undfalse
ansonsten):1<2<3>4>5
(ieALPHA
)1>2<3<4>5
(dhEAGLE
,HARSH
,NINON
,PINUP
)1<2>3>4<5
(ieRULER
)1>2>3<4<5
(dhTHEFT
,WIDOW
)Diese vier Regeln können vereinfacht werden
1*3<0 and 2*4<0
(dank der Antwort von @KarlNapf auf Python 2 ).quelle
char[]
anstelle von als Eingabe verwendestString
. -38 Bytes dank dir.z,x
undw,y
muss ein alternierendes Vorzeichen haben, so genügt es , zu überprüfenz*x<0
undw*y<0
JavaScript (ES6),
918987 Byte2 Bytes dank Ismael Miguel gespeichert
Wie es funktioniert
Wir erstellen eine 4-Bit-Bitmaske,
k
die die 4 Übergänge zwischen den 5 Zeichen der Zeichenfolge darstellt:NaN
, das Wort abzulehnen (um Regel 6 zu erfüllen).Die gültigen Bitmasken haben genau zwei aufeinanderfolgende
1
Übergänge (das erste und das letzte Bit werden ebenfalls als aufeinanderfolgend betrachtet ):Mit anderen Worten, dies sind die Kombinationen, die sind:
k?
: größer als 0!(k%3)
: kongruent zu 0 Modulo 3Die anderen Bedingungen sind:
!s[5]
: Es gibt nicht mehr als 5 Zeichens[0]==s[4]
: Das 1. und das 5. Zeichen sind identischNB : Wir prüfen dies nicht explizit,
k != 15
da jedes Wort, das einem solchen Muster folgt, von dieser letzten Bedingung abgelehnt wird.Testfälle
Code-Snippet anzeigen
Erste Version
Für den Datensatz war meine ursprüngliche Version 63 Bytes. Es besteht alle Testfälle erfolgreich, erkennt jedoch keine aufeinander folgenden identischen Zeichen.
Unten finden Sie eine 53-Byte-Version, die Neil in den Kommentaren vorgeschlagen hat und die genauso gut funktioniert (und auch fehlschlägt):
Bearbeiten: Siehe Neils Antwort für die feste / vervollständigte Version des obigen Codes.
quelle
0000
ist auch kongruent zu 0 Modulo 3, aber Sie können auch hier nicht den gleichen Anfangsbuchstaben und den gleichen letzten Buchstaben haben, so dass Sie, wie bei 15, nicht explizit darauf testen müssen.!((a>b)-(b>c)+(c>d)-(d>e))
?p<c?0:NaN
kann als geschrieben werden0/(p<c)
, was 2 Bytes spart.k?
Test wegen des MöglichenNaN
.) Bezüglich deiner Alternativversion: Das sollte in der Tat funktionieren.JavaScript (ES6), 78 Byte
Basierend auf @ Arnauld's falschem Code, aber golfen und korrigiert. Überprüfen Sie zunächst, ob das erste Zeichen mit dem fünften Zeichen identisch ist (wodurch 5 Zeichen garantiert werden) und ob die Länge der Zeichenfolge nicht mehr als 5 beträgt. die sollte eine Spitze und eine Talsohle zwei Buchstaben voneinander entfernt haben.
Bearbeiten: Alternative 78-Byte-Lösung basierend auf der Antwort von @ KarlNapf:
quelle
Python 2-Exit-Code, 56 Byte
Ausgabe über Exit-Code: Fehler bei False und erfolgreicher Lauf bei True.
Nimmt die Zeichenfolge
s
mitabcde
, dreht sie aufbcdea
, vergleicht die entsprechenden Zeichen elementweise und weist sie fünf Variablen zuv,w,x,y,z
. Die falsche Länge gibt einen Fehler.Die unendlichen Worte haben alle
die gemeinsam geprüft werden können als
v*x+w*y|z == -2
. Der verkettete Vergleichv*x+w*y|z>-2>_
schließt in diesem Fall kurz und wertet ansonsten aus,-2>_
was zu einem Namensfehler führt.quelle
Python 2,
1108760 Bytes1 Byte sparen dank Neil
Erfordert die Eingabe in Anführungszeichen, z
'KNEES'
True
Wenn es ein unendliches Wort ist,False
wenn nicht, hat es eine Länge von 5 und gibt eine Fehlermeldung aus, wenn die Länge falsch istInspiriert von xnors Antwort mit
map(cmp...
vorherige Lösung:
Verwendung der optimierten Logik von Kevin Cruijssen
quelle
a*c+b*d+2==0==e
?a*c+b*d|e
ist noch kürzer.<-1
könnte funktionieren, da beide-2|1
und-2|-1
gleich-1
.PHP, 102 Bytes
quelle
Python 2, 71 Bytes
Nimmt die Zeichenfolge
s
mitabcde
, dreht sie zubcdea
und führt einen elementweisen Vergleich der entsprechenden Zeichen durch.Das Ergebnis ist eine Liste von
-1, 0, 1
. Überprüft dann, ob das Ergebnis eine der gültigen Folgen von Auf und Ab ist:wie aus der Vorlage
[m,n,-m,-n,0]
mit erzeugtm,n=±1
. Das letzte Mal wird0
überprüft, ob der erste und der letzte Buchstabe gleich sind, und die Länge stellt sicher, dass die Eingabezeichenfolge die Länge 5 hat.Eine Alternative 71. Überprüft die Bedingungen für Vergleiche und stellt dabei die richtige Länge sicher.
quelle
R, 144 Bytes
Die Antwort basiert auf der Logik von Jonathan Allan. Es könnte aber wahrscheinlich Golf gespielt werden.
R-Geigen-Testfälle (vektorisiertes Beispiel, aber gleiche Logik)
quelle
length(s)==5
können Sie ersetzens[1]==tail(s,1)
mits[1]==s[5]
. Eine um ein Byte kürzere Methode zur Überprüfung der Länge istis.na(s[6])
. Zusammen ergeben diese beiden ÄnderungenTRUE
für dies
Länge 5 genau undFALSE
ansonsten, wie esTRUE&NA
ist,NA
aberFALSE&NA
istFALSE
. Sie können auch ein paar Bytes speichern durch Ersetzen!sum(sign(d))&any(rle(sign(d))$l>1)
mit!sum(a<-sign(d))&any(rle(a)$l>1)
.GNU Prolog, 47 Bytes
Definiert ein Prädikat,
i
das (tatsächlich unendlich oft) für ein Unendlichkeitswort erfolgreich ist und somit "yes" ausgibt, wenn es vom Interpreter ausgeführt wird (wie es für Prolog üblich ist). schlägt für ein Kandidatenwort fehl, dessen erster und letzter Buchstabe nicht übereinstimmen oder nicht 5 Buchstaben lang sind, und gibt daher "nein" aus, wenn es vom Interpreter ausgeführt wird; und stürzt mit einem Stapelüberlauf ab, wenn ein Kandidatenwort angegeben wird, das kein unendliches Wort ist, sondern aus fünf Buchstaben besteht, wobei die ersten beiden Buchstaben übereinstimmen. (Ich weiß nicht warumes stürzt ab; Der rekursive Aufruf sollte als Tailcall behandelt werden können. Anscheinend ist der Optimierer von GNU Prolog nicht sehr gut. Ein Absturz ist definitiv falscher als wahr, und wenn er behoben wird, würde die Lösung erheblich länger dauern. Daher hoffe ich, dass dies als gültige Lösung gilt.Der Algorithmus ist ziemlich einfach (und in der Tat ist das Programm ziemlich lesbar); Überprüfen Sie, ob die Buchstaben eines der vier Muster bilden, aus denen ein Unendlichkeitswort besteht. Wenn nicht, permutieren Sie zyklisch und versuchen Sie es erneut. Wir brauchen nicht explizit für Doppelbuchstaben zu überprüfen , wie die
<
und>
Betreiber lassen Sie uns prüfen, ob implizit zur gleichen Zeit , dass wir prüfen, ob die Deltas entsprechen.quelle
Eigentlich ,
3827 BytesDiese Antwort wurde weitgehend von Jonathan Allans hervorragender Gelee-Antwort inspiriert . Es gibt wahrscheinlich mehrere Orte, an denen Golf gespielt werden kann, also sind Golfvorschläge willkommen! Probieren Sie es online!
Ungolfing
quelle
APL (Dyalog) ,
1615 BytesProbieren Sie es online!
quelle
TI-BASIC, 81 Bytes
Die an das Programm zu übergebende Zeichenfolge befindet sich in Ans. Gibt 1 zurück (und zeigt dies implizit an), wenn das eingegebene Wort ein Unendlichkeitswort ist, und 0 (oder wird mit einer Fehlermeldung beendet), wenn dies nicht der Fall ist.
Fehler bei wiederholten Zeichen oder Nicht-5-Buchstaben-Wörtern.
quelle
05AB1E , 16 Bytes
Port of Jonathan Allans Gelee Antwort .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle