Bei den meisten Android-Smartphones kann der Benutzer ein Wischmuster verwenden, um das Telefon zu öffnen:
Bestimmte Muster sind legitim und andere sind unmöglich. Geben Sie bei einem Eingabewischmuster eine Wahrheit oder eine Falschangabe zurück, die angibt, ob das angegebene Eingabemuster zulässig ist oder nicht.
Eingang
Das Raster ist zeilenweise mit 1 bis 9 gekennzeichnet:
1 2 3
4 5 6
7 8 9
Die Eingabe ist eine Zahl, die aus den vom ersten bis zum letzten besuchten Knoten besteht. Das Wischmuster oben lautet beispielsweise 12357.
Die Eingabe kann eine Dezimalzahl, eine Zeichenfolge oder eine Liste von Zahlen sein. Es wird keine 0 enthalten, da es keinen Knoten 0 gibt.
Änderung: Indexierung von 0-8 ist zulässig, da viele Sprachen einen Index von 0 aufweisen. Wenn Sie 0-8 verwenden, müssen Sie dies zu Beginn Ihrer Antwort angeben und die Testfälle entsprechend anpassen.
Regeln
Jeder Knoten startet zunächst als nicht besucht und darf nur einmal besucht werden. Jedes Muster, das einen Knoten mehr als einmal besucht, ist falsch.
Ein wahres Muster muss mindestens einen Schlag enthalten, also mindestens 2 Knoten.
Es ist nicht möglich, einen nicht besuchten Knoten direkt neben einem anderen zu überspringen. Zum Beispiel ist 13 falsch, weil 2 nicht besucht ist und direkt in der Reihe steht.
Es ist nur möglich, einen besuchten Knoten zu überspringen. 42631 ist ein Beispiel dafür.
Linien können sich sonst kreuzen. Zum Beispiel ist 1524 wahr.
Angenommen, die Knotenbreiten sind unbedeutend und ignorieren praktische Probleme (Fingerdicke usw.). 16 ist also wahr, auch wenn es in der Realität etwas schwieriger zu erreichen ist.
Testfälle
1 -> false
12 -> true
13 -> false
16 -> true
31 -> false
33 -> false
137 -> false
582 -> true
519 -> true
1541 -> false
12357 -> true
15782 -> true
19735 -> false
42631 -> true
157842 -> true
167294385 -> true
297381645 -> false
294381675 -> true
Dies ist Codegolf , daher gewinnt die geringste Anzahl von Bytes.
quelle
Antworten:
JavaScript (ES6), 64 Byte
Nimmt die Eingabe als Array von Zahlen. Falsche Werte sind 0 oder NaN . Wahrheitswerte sind ausschließlich positive ganze Zahlen.
Testfälle
Code-Snippet anzeigen
Wie?
Präambel
Zwei Ziffern stehen sich vertikal, horizontal oder diagonal gegenüber, wenn:
ODER sie sind beide gerade und ihre Summe ist 10 (Abbildung 2)
Außerdem ist die Ziffer, die zwischen zwei gegenüberliegenden Ziffern n und p steht, gleich (n + p) / 2 .
Formatierter Quellcode
Verfolgen Sie die vorherigen Ziffern
Flags für besuchte Ziffern werden bei negativen Indizes im Eingabearray a gespeichert , damit sie nicht mit den ursprünglichen Elementen kollidieren.
Wenn p auf -n gesetzt ist :
Wenn die aktuelle Ziffer n zuvor nicht ausgewählt wurde,
a[-n] ^= -n
wird das Flag gesetzt und dieevery()
Schleife mit der nächsten Iteration fortgesetzt. Andernfalls wird das Flag gelöscht und die Schleife sofort zum Fehlschlagen gezwungen.Wenn p auf undefiniert gesetzt ist :
a[undefined] ^= undefined
ergibt 0 , was auch den Fehler der Schleife erzwingt.Entgegengesetzte Ziffern erkennen
Der folgende Ausdruck wird verwendet, um zu testen, ob die aktuelle Ziffer n und die vorherige Ziffer -p entgegengesetzte Ziffern sind, wie in der Präambel definiert:
was äquivalent ist zu:
Hinweis: In JS hat das Modulo-Ergebnis das gleiche Vorzeichen wie die Dividende.
Es kann interpretiert werden als:
Daher gibt dieser Ausdruck genau dann 1 zurück, wenn n und -p entgegengesetzte Ziffern sind oder dieselbe ungerade Ziffer sind. Da eine Ziffer nicht zweimal ausgewählt werden kann, wird letzterer Fall trotzdem korrekt behandelt.
Wenn dieser Ausdruck 1 zurückgibt , testen wir a [p / 2] (wobei p jetzt gleich der negierten Summe der Ziffern ist), um zu wissen, ob die 'Zwischenziffer' zuvor besucht wurde. Ansonsten testen wir eine [0], die garantiert wahr ist.
Über die erste Iteration
Die erste Iteration ist ein Sonderfall, da es keine vorherige Ziffer gibt und wir möchten, dass sie bedingungslos erfolgreich ist.
Wir erreichen das, indem wir p auf 1 initialisieren , weil für jedes n in [1 .. 9] :
(1 * n) % 5
kann nicht negativ sein~(1 - n)
kann nicht gleich 9 seinUrsprüngliche Antwort, 90 Bytes
Wurde aus diesem Beitrag entfernt, damit er nicht zu ausführlich wird. Sie können es hier sehen .
quelle
!!a[1]&
durcha[1]&&
, da jeder wahrheitsgemäße Wert zurückgegeben werden kanna[1]*
ist es noch kürzer.)has a node directly in line
, ich wusste nicht, dass es so einfach sein würde ...?a[-n]^=1:0
mit&&a[-n]^=1
-1 ersetzen , können nicht testen (auf dem Handy)x86-32-Bit-Computercode,
62-60ByteHexdump:
Es empfängt die Länge der Liste in
ecx
und einen Zeiger auf das erste Element inedx
und gibt das Ergebnis zurück inal
:Es gibt 8 Zeilen, die einen Knoten in der Mitte enthalten:
Ich habe sie nach dem Unterschied zwischen der größeren und der kleineren Zahl gruppiert.
Dann habe ich das in eine 2-D-Nachschlagetabelle konvertiert, die nach halber Differenz und kleinerer Zahl indiziert ist:
Dies ergibt eine "magische" Bitmap von 32 Bits. Um es zu indizieren, schiebt der Code es in den Stapel. Dann extrahiert es ein Byte unter Verwendung eines Index und aus diesem Byte extrahiert es ein Bit unter Verwendung des anderen Index. All dies mit einer Anweisung:
Wenn die Bitmap angibt, dass sich in der Mitte ein Knoten befindet, ist die Berechnung einfach. Addieren Sie die Hälfte der Differenz zur kleineren Zahl.
Versammlungsquelle:
quelle
bt byte ptr [esp + eax], ebx
.cdq
anstelle vonxor edx, edx
aseax
is zero verwenden. Außerdem können falten Sie diedec eax
inbt [esp + eax - 1], ebx
denen gleiche Länge , aber dann können Sie das entferneninc ebx
später. Das sollte Ihnen zwei Bytes sparen.Python 2 ,
14013111410499 Bytes-2 Bytes dank Jonathan Frech
-5 Bytes dank Chas Brown
Probieren Sie es online!
Erläuterung:
Probieren Sie es online!
Nur 8 Knotenpaare haben einen Knoten dazwischen. Ein Knotenpaar kann durch die Formel als einzelne Ganzzahl dargestellt werden
2^a-2^b-1
. Diese Zahl kann durch wiederholtes Modulo verkürzt werden:(2**n+~2**l)%21%15%9==5
prüft zunächst, ob ein solches Paar vorhanden ist,v-{l+n>>1}==v
prüft dann , ob der von angegebene dazwischenliegende Knoten(a+b)/2
noch nicht besucht wurde undq
löst einen NameError aus. Bei Verwendung eines verketteten Vergleichs zwischen diesen Paaren wird der nächste Vergleich nur ausgeführt, wenn der vorherige zurückgegeben wirdTrue
.quelle
Jelly ,
24 22 1918 Bytes-2 , da wir nicht mehr erforderlich sind , eine leere Liste zu handhaben
, -1 Umschalten von verbinden
j@
, verketten,;
(der verpassten Punkt nicht braucht beschäftigt in der Mitte für das Verfahren angetroffen werden, zu Beginn des Trios zu sein , ist in Ordnung )-2 vom Einschalten
P¬aSH
bisoSH
(OK zwei Ergebnisse haben , da wir glätten, die Hälfte1
ist0.5
die ohnehin herausgefiltert wird, und verwendet haben Auswirkungen auf entweder auf dem Verfahren nicht mehr gleichen Ergebnisse mit)-1 Dank Herrn Xcoder (0-indiziert Eingabe ist erlaubt)
Ein monadischer Link, der eine Liste von Ganzzahlen
[0,8]
aufnimmt1
und einen Wahrheitswert (0
) zurückgibt, wenn dies legal ist, und einen Falschwert ( ), wenn dies nicht der Fall ist .Probieren Sie es online! oder sehen Sie sich eine Testsuite an .
Wie?
Betrachtet jedes benachbarte Paar von 0-indizierten Knoten in der Eingabeliste. Unterscheidet sich die Ganzzahldivision durch drei der beiden durch 2, befinden sie sich in der oberen und unteren Reihe. Unterscheidet sich das Modulo durch drei der beiden durch 2, befinden sie sich in der linken und rechten Spalte. Die Summe solcher Paare geteilt durch zwei ist entweder der 0-indizierte Mittelknoten einer Drei-Knoten-Linie oder ein nicht ganzzahliger Wert - diese Werte werden also zuerst vor dem 0-indizierten Paar und dann vor jedem eingefügt Scheinknoten (wie
0.5
oder3.5
) entfernt werden, wird die resultierende Liste von Listen abgeflacht und dann desupliziert (um auftragsbewahrte, eindeutige Einträge zu erhalten) und schließlich mit der Eingabe verglichen - für einen legalen Swipe wird all dies zu einem No-Op, solange es illegal ist Diese fügen fehlende Mittelknoten hinzu und / oder entfernen doppelte Knoten (beachten Sie, dass für eine Eingabeliste der Länge 1 keine spezielle Groß- / Kleinschreibung erforderlich ist, da keine benachbarten Paare vorhanden sind):Vorherige Methode
Jelly ,
3635 BytesProbieren Sie es online! oder sehen Sie sich eine Testsuite an .
Wie?
Ähnlich wie oben, jedoch werden alle Möglichkeiten mit drei Knotenlinien konstruiert und eine Suche durchgeführt (anstatt die Summe für den mittleren Knoten mit divmod zu testen und zu halbieren).
Erstens die Konstruktion der Liste der Dreiknotenlinien:
Nun die Entscheidungsfindung:
quelle
Stax , 28 Bytes
Starte es
Es erzeugt 0 für falsch und positive ganze Zahlen für wahr. Dies ist die entsprechende ASCII-Darstellung desselben Programms.
Die allgemeine Idee ist, mehrere notwendige Bedingungen für legale Wischmuster zu berechnen und sie alle miteinander zu multiplizieren.
quelle
Y
Registers.v
und1
als falschen Wert einfügen.2
und darüber sind wahr.JavaScript, 112 Bytes
Vielleicht sollte eine auf Regex basierende Sprache kürzer sein. Aber ich weiß es nicht.
Code-Snippet anzeigen
Dank Neil, ändern
)(?!
zu|
3 Bytes zu speichern.quelle
144
.Retina 0.8.2 , 98 Bytes
Beeinflusst durch die Antwort von tsh . Ich habe versucht, es "neu zu formulieren", um das Gegenteil zu erreichen.
Probieren Sie es online aus
quelle
Schale ,
25 bis20 BytesNimmt eine Liste von Ganzzahlen mit 0-basierter Indizierung auf. Gibt 0 oder 1 zurück. Probieren Sie es online aus!
Erläuterung
Ich habe einige Ideen aus Jonathan Allans Gelee-Antwort gestohlen . Die Idee ist dieselbe: Fügen Sie einen neuen "Durchschnittsknoten" zwischen jedes benachbarte Paar ein, filtern Sie diejenigen heraus, die keine tatsächlichen Knoten sind, entfernen Sie Duplikate und vergleichen Sie sie mit der ursprünglichen Liste. Wenn die ursprüngliche Liste Duplikate enthält, ist das Ergebnis falsch. Wenn die Liste einen nicht besuchten Knoten überspringt, ist er in der verarbeiteten Liste zwischen dem entsprechenden Paar vorhanden und das Ergebnis ist falsch. Wenn die Eingabe ein Singleton ist, ist die verarbeitete Liste leer und das Ergebnis ist falsch. Ansonsten ist es wahr.
quelle
C ++,
267256 BytesUm zu überprüfen, ob das Muster einen nicht besuchten Knoten nicht überspringt, werden verschiedene Aktionen ausgeführt:
d
wod
sich die numerische Differenz zwischen dem aktuellen und dem letzten Knoten befindet.d
es ungerade ist, muss es nicht überprüft werden. Es kann keinen Knoten überspringen.d
gleich4
oder ist8
, erfolgt der Sprung zwischen den Knoten1-9
oder3-7
. Überprüfen Sie daher den Knoten5
d
2 ist und der mittlere Knoten ((last_node + current_node)/2
) entweder 2,5 oder 8 ist, dann überprüfe den mittleren Knotend
6 ist, überprüfen Sie das gleiche wie zuvor, aber mit4
,5
oder6
Die Parameter sind ein
int[]
und es ist die Anzahl der Elemente. Es gibt einen zurück,int
der alsbool
Typ interpretiert werden kannquelle
!(d%2)
=>d%2<1
sollte funktionieren.int s[]
=>int*s
. Ich denke das wird funktionieren.Perl, 135 Bytes (134+
-n
)Leicht ungolfierte Version
Ausgänge über Exit-Code.
0
ist wahr, jeder andere Wert ist falsch. Wie pro Meta Konsens wird STDERR Ausgabe im Fehlerfall ignoriert.Es gibt wahrscheinlich eine schnellere Möglichkeit, die Regel "Überspringen nicht möglich" zu überprüfen, als einfach alle Möglichkeiten aufzulisten.
quelle
MATL ,
424139 BytesDies erzeugt
Hier können Sie nachlesen, warum diese Ausgaben jeweils wahr und falsch sind. Probieren Sie es online!
Oder überprüfen Sie alle Testfälle , mit Fußzeile Code, der den Standard enthält Test für Truthiness / falsiness.
quelle
Stax ,
73726665 Bytes CP43779 Bytes beim Auspacken,
Online ausführen und debuggen!
oder führen Sie den Batch-Test durch , wobei
meX
sich ein Header befindet, damit Stax mehrzeilige Eingaben verarbeiten kann.Implementierung ohne Verwendung von Hash. Gibt eine streng positive Zahl (tatsächlich die Anzahl der fehlgeschlagenen Tests) für falsche und
0
für wahrheitsgemäße Fälle aus.Erläuterung
d
Löscht den Eingabestapel. Die Eingabe istx
ohnehin variabel .4{cAs-5F
Erzeugt den ersten Teil der Liste der mittleren Knoten.132396978714EE
codiert den zweiten Teil der Liste der mittleren Knoten fest.L3/
Sammelt alle Elemente im Hauptstapel und teilt sie in Teile auf, die jeweils 3 Elemente enthalten. Das Ergebnis ist ein Arraya
, das nur das Array aller ungültigen 3-Knoten-Gruppen ist.{xs:IBc0<A*++cEd:-1=sccHs|M=s{U>m|A**mE
Führen Sie für jede ungültige Knotenliste die folgenden Überprüfungen durch. Das Ergebnis der Prüfergebnisse wirdand
mit dem**
. Da es 8 ungültige Knotenlisten gibt, ist das Ergebnis dieses Codes ein Array von 8 Elementen. Das endgültigeE
Versenden des Arrays an seine einzelnen Elemente im Hauptstapel.xs:I
Ruft den Index der Knotenlistenelemente im Eingabearray ab.Bc0<A*++
Wenn der Index des "mittleren Knotens" (z. B.5
im Knotensatz1,5,9
) ist-1
(was bedeutet, dass er im Eingabearray nicht vorhanden ist), ändern Sie den Index in9
.cEd:-1=
Testen Sie, ob die beiden "Endknoten" (z. B.1,5
im Knotensatz1,5,9
) im Eingangsarray benachbart sind.sccHs|M=
Testen Sie, ob der transformierte Index des "mittleren Knotens" größer ist als der der beiden "Endknoten". Dies schließt zwei Fälle ein: Der "mittlere Knoten" fehlt, oder der "mittlere Knoten" kommt nach den beiden "Endknoten".s{U>m|A
testet, ob beide Indizes der "Endknoten" nicht negativ sind. (dh beide erscheinen in der Eingabe).Es werden zwei zusätzliche Tests durchgeführt.
x%2<
testet, ob das Eingabearray ein Singleton ist.xu%x%=!
testet, ob Knoten doppelt besucht wurden.Der Hauptstapel enthält 10 Testergebnisse (eines für jede ungültige Knotenliste plus zwei zusätzliche Tests).
L|+
sammelt die 10 Elemente und fügt sie hinzu.|a
könnte auch verwendet worden sein, die einfach prüft, ob es irgendwelche wahrheitsgemäßen Elemente auf dem Array gibt.Implizite Ausgabe.
quelle
Java,
375355 Bytes-20 Bytes dank Zacharý
Dies ist eine Portierung dieser Antwort und sie funktioniert nach den gleichen Grundsätzen
quelle
int v(int s[]){int[]m=new int[10];int i=1,p=s[0],d,n,l=s.length;if(l<2)return 0;for(;i<l;++i){m[p]=1;if(m[s[i]]!=0)return 0;d=(d=p-s[i])<0?-d:d;if(d%2==0){n=(p+s[i])/2;if((d==4||d==8)&&n==5&&m[5]==0)return 0;if((d==2)&&(n==2&&m[2]==0||n==5&&m[5]==0||n==8&&m[8]==0))return 0;if(d==6&&(n==4&&m[4]==0||n==5&&m[5]==0||n==6&&m[6]==0))return 0;}p=s[i];}return 1;}
sollte funktionieren (Reihenfolge der Operationen)(d==2)
einfach ändernd==2
, ich habe das vorher übersehen.d%2==0
=>d%2<1
Pyth , 33 Bytes
Testsuite.
Verwendet eine 0-basierte Indizierung.
Erläuterung
Alternativer Ansatz für 34 Bytes :
quelle
Japt , 35 Bytes
Probieren Sie es online!
Etwas ungolfed & wie es funktioniert
Portierte die Idee aus dieser Jelly-Lösung mit einigen Unterschieden bei der Bestimmung möglicher Sprünge:
/3
oder einen Unterschied von 2 hat%3
.%3
und prüft, ob die Differenz 0 oder 2 ist. Wenn die Differenz 0 ist, sind die beiden Zellen vertikal ausgerichtet und Nicht-Sprünge haben immer noch die Eigenschaft von(X+Y)%2 != 0
.quelle
Python 2 , 97 Bytes
Basierend auf der Antwort von ovs, aber 2 Bytes kürzer und weniger kryptisch. Konvertiert einfach Indizes in 2D-Koordinaten und testet die Parität. Nimmt 0-8 Indizes an.
Probieren Sie es online!
quelle