Nicht zu verwechseln mit Password Bishop Goodness !
Beantworten Sie eine Zeichenfolge (wahr / falsch oder zwei konsistente Werte), wenn es sich um ein Passwort handelt, das gegen Bischöfe sicher ist .
Ein Passwort ist gegen Bischöfe sicher, wenn es sich um eine Zeichenfolge handelt, die aus abwechselnden Buchstaben (in a-h
) und Ziffern (in 1-8
) besteht, sodass jedes Zeichenpaar als Quadrat auf einem Schachbrett interpretiert werden kann, und wenn Sie auf jedes genannte Quadrat einen weißen Bauern setzen Im Passwort gibt es dann keine Möglichkeit für einen weißen Läufer, in einer beliebigen Anzahl von aufeinanderfolgenden Zügen von einem beliebigen Feld in der ersten ( 1
) Reihe zu einem beliebigen Feld in der letzten ( 8
) Reihe zu reisen .
Beispiele
Passwörter stark gegen Bischöfe
a1b1c1d1e1f1g1h1
a8b8c8d8e8f8g8h8
a1b2c3d4d5f5f4g3g4h2b5
h4g4f4e4c4b4a4c3e3
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
b4b5d4d5f4f5g3h5
Zum Beispiel
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
entspricht der Position undb4b5d4d5f4f5g3h5
entspricht der Position
Gegen Bischöfe schwache Passwörter
a4c4e4g4g5d6f6e3d2b2
(Gut geformt, aber nicht stark - danke Jo King für dieses Beispiel!)b1c1d1e1f1g1h1a8b8c8d8e8f8g8
(gut geformt, aber nicht stark)h4g4f4e4c4b4a4c3
(gut geformt, aber nicht stark)d4
(gut geformt, aber nicht stark)b4b5d4d5f4f5g2h5
(gut geformt, aber nicht stark)correct horse battery staple
(schlecht geformt)1a1b1c1d1e1f1g8a8b8c8d8e8f8g
(schlecht geformt)a
(schlecht geformt)aa
(schlecht geformt)
quelle
1
dann8
im ersten Testfall nicht zu jeder Reihe durchfahren ? Es kann nicht zu jeder Spalte bewegt werden, da diea
Spalte vollständig mit Bauern gefüllt ist, aber es kann problemlos zu jeder Zeile bewegt werden, nicht wahr? Ich habe das Gefühl, ich vermisse etwas ..: SAntworten:
Ruby,
115182163 BytesProbieren Sie es online!
Kehrt
1
für Starke undnil
für Schwache zurück. (Die +67 Bytes wurden zur Berücksichtigung von "Backtracking" verwendet.)Einige Tricks, die angewendet wurden:
Anstelle des numerischen Bereichs
0..99
wird der Zeichenfolgenbereich verwendet ,'00'..'99'
sodass die Zahl automatisch auf zwei Ziffern aufgefüllt und mit einem String versehen wird. Dies macht die Überprüfung außerhalb der Grenzen sehr kurz - mit Regex übereinstimmen/[09]/
.Während
[x-11, x-9, x+9, x+11]
wir in der Helferfunktion die Liste der neuen Koordinaten erstellen , weisen wir sie gleichzeitigz[x]
zu9
, was zufällig ein wahrer Wert ist (Markierung des besuchten Quadrats).In der letzten Zeile möchten wir überprüfen, dass das Array
z[81,9]
nicht enthält9
. Dazu entfernen wir alle Instanzen von9
(z[81,9]-[9]
) und fragen nach dem 9. Element des resultierenden Arrays ([8]
). Da wir wissen, dass das Array ursprünglich 9 Elemente enthielt, erhalten wir, falls eines entfernt wurde,nil
das letzte Element des Arrays (das zufällig immer vorhanden ist1
).quelle
Python 2 ,
330318313309370 BytesProbieren Sie es online!
Probieren Sie die praktische Version online aus! (Das Original kann 4 ^ 32 Operationen benötigen, um vollständig zu prüfen. Ich empfehle die Verwendung derselben Anzahl von Bytes.)
Keine superkurze Lösung - ich konnte nicht herausfinden, wie man eine Lambda-Funktionsversion von g kürzer als g selbst macht.
-4 Bytes dank Quuxplusone
+61 Bytes für das Backtracking (danke für den Hinweis auf Jo King und die Golftipps)
quelle
q=r=1
wäre kürzer alsq=1 r=1
, oder? Undif r:
kürzer alsif r>0:
.Python 2 ,
490476474Probieren Sie es online!
Dies funktioniert durch "Überfluten". Zuerst erstellen wir eine Liste,
a
welche Quadrate neben welchen anderen Quadraten bischofsmäßig liegen. Dann erstellen wir eine Reihex
von Ausschlüssen (basierend auf dem Passwort). Dann initialisieren wir einen Satzr
erreichbarer Quadrate, der als erste Zeile beginnt (abzüglich etwaiger Ausschlüsse), und "fluten" von dort wiederholt 99 Mal nach außen, was mehr als genug sein sollte. Zum Schluss testen wir, ob eines der Quadrate in der letzten Reihe in unserer erreichbaren Menge gelandet ist. Wenn ja, haben wir ein schwaches Passwort! Wenn nicht, haben wir ein sicheres Passwort.Nachteil, vielleicht Disqualifikation (ich kenne die übliche Regel hier nicht): Wenn das Passwort falsch ist (wie "richtige Batterie für Pferde"), dann werfen wir eine Ausnahme, anstatt zurückzukehren
False
. Wir geben aber immer zurück,True
wenn das Passwort sicher ist!Minus 16 Bytes dank Jo King. Wir fügen
a
an der einen Stelle, an der es verwendet wird, eine Inline ein und falten etwas Mathematik.quelle
for
Sekunden, die ich nicht entfernen konnte. Ich fand, dass das Ersetzenrange(99)
mitrepr(f)
auf meinem lokalen Computer funktioniert, aber nicht auf dem Interpreter von tio.run ... aber dann fand ich, dass[1]*99
das sowieso kürzer war! Das sparte also 4 weitere Bytes.for
s, die ich nicht entfernen konnte - Oh! Anscheinend behandelt Python33for
als zwei Token (wobeifor33
ein Token wäre). Heute habe ich gelernt. Abzüglich 2 Bytes mehr.Sauber , 285 Bytes
Probieren Sie es online!
$[]
ist$ :: [[Int]] [Char] -> Bool
mit dem ersten Argument zusammengesetzt, geben\ [Char] -> Bool
.Die Funktion verbraucht die Zeichenfolge jeweils zwei Zeichen und gibt sofort false zurück, wenn die Zeichenfolge ein ungültiges Format aufweist, sobald der ungültige Teil angezeigt wird. Sobald die Saite verarbeitet wurde, platziert sie einen Läufer auf jedes leere Feld auf einer Seite des Bretts und bewegt sie 64 Mal auf jede mögliche Weise und überprüft, ob sich eine der Endpositionen in der Zielreihe befindet.
quelle
True
füra1b1c1d1e1f1g1
? Nicht, dass ich etwas darüber verstehe, wie es funktioniert. :)Wolfram Language (Mathematica) ,
339316358353345 Bytes-23 Bytes dank @Doorknob.
+42 Bytes für die Rückverfolgung.
Probieren Sie es online!
Ich habe das meiste davon umgeschrieben, um das Zurückverfolgen zu berücksichtigen. Ich glaube, es gibt eine einfachere Möglichkeit, das Diagramm zu definieren
g
. Mathematica gibtGraphData[{"bishop",{8,8}}]
das Diagramm aller Züge an, die ein Bischof auf einem Schachbrett ausführen kann ( Bischofs-Diagramm ). Dieses Diagramm enthält jedoch weitere Verbindungen als nächster diagonaler Nachbar. Wenn jemand einen kürzeren Weg kennt, lass es mich wissen. Diese MathematicaSE-Antwort ist für die Erstellung des Graphen verantwortlich .Gibt
True
für starke Passwörter undFalse
für schwache / falsch geformte Passwörter zurück. Beachten Sie, dass bei den meisten falsch formulierten Passwörtern eine Reihe von Fehlermeldungen ausgegeben werden und diese dann zurückgegeben werdenFalse
. Wenn dies nicht den Regeln entspricht, können sie durch Umstellungf[n_]:=...
auff[n_]:=Quiet@...
6 Byte unterdrückt werden .Ungolfed:
Nervenzusammenbruch:
Nimmt ein Zeichenfolgenargument und teilt es in eine Liste von Zeichenfolgen mit jeweils einer Länge auf
m
.Gibt zurück,
False
wenn Fehlermeldungen erzeugt werden. Auf diese Weise werden die falsch geformten Zeichenfolgen abgefangen (dh es wird angenommen, dass sie gut geformt sind und zwangsläufig einen Fehler auf der ganzen Linie verursachen).Nimmt die Folge von Bauernpositionen und teilt sie so, dass sie
"a2h5b"
wird{{"a","2"},{"h","5"},{"b"}}
,LetterNumber
konvertiert dann den Buchstaben in eine Zahl (a -> 1
usw.) undFromDigits
konvertiert die Zahl in eine Ganzzahl. Wenn die Zeichenkette nicht richtig geformt ist, erzeugt dieser Schritt einen Fehler, der bei derCheck
Rückkehr abgefangen wirdFalse
. Diese beiden Zahlen werden dann in eine Ganzzahl umgewandelt, die einem Quadrat auf der Tafel entspricht.Konstruiert das Diagramm aller diagonalen Kanten des nächsten Nachbarn, wobei die Bauernpositionen gelöscht werden.
Hierbei handelt es sich um Listen nicht belegter Start- und Endpunkte
Durchlaufen Sie die Start- und Endpunkte. Für jedes Paar
FindPath
wird eine Liste von Pfaden zwischen ihnen erstellt. Wenn es keine Pfade zwischen ihnen sind, wird es eine leere Liste, so seinLength@
Rendite0
. Wenn es überhaupt keine Pfade gibt,m
wird Null sein, und wir kehren zurückTrue
, andernfalls kehren wir zurückFalse
.quelle
True
undFalse
sein können1>0
und0>1
jeweils.p[1]@#&/@
ist gleichbedeutend mit nurp@1/@
.Sequence@@
kann durch ersetzt werden##&@@
. Stattdessen{LetterNumber[#[[1]]],FromDigits[#[[2]]]}&/@
können Sie verwenden{LetterNumber@#,FromDigits@#2}&@@@
.p@1/@
, aber ich sehe die allgemeine Idee. Ich nehme anp@1 = StringPartition[#,1]&
, es ist etwas verwirrend für mich, denke ich, weilp
zwei Argumente auf zwei verschiedene Arten vorgebracht werden,m_
und zwar auf die eine und die andere#...&
, ich denke, das ist nur eine Frage der Rangfolge. Das macht aber Sinnp@m = p[m]
.f
, die ein einzelnes Argument verwendet,f@#&
dasselbe Verhalten wief
hierf
vorliegtp[1]
. (Dann habe ich die[]
Schreibweise in geändert@
, die bis auf den Vorrang immer identisch ist.)