Für die Ziffern ungleich Null auf einem Standard- Nummernblock
789
456
123
Stellen Sie einen Schachritter auf eine beliebige Ziffer und bewegen Sie ihn mit einer beliebigen Anzahl von normalen L-förmigen Sprüngen, wobei Sie eine positive Dezimalzahl nachzeichnen. Welche positiven ganzen Zahlen können so ausgedrückt werden?
Einer von ihnen ist 38
, dass der Ritter auf der anfangen 3
und sich nach links und nach oben bewegen könnte 8
. 381
und 383
sind auch möglich.
3
selbst ist möglich, wenn keine Sprünge gemacht werden (was erlaubt ist). 5
ist auch, aber es können keine anderen Ziffern von der aus erreicht werden 5
, so dass es die einzige Zahl ist, bei der die Ziffer 5
erscheint.
Schreiben Sie ein Programm oder eine Funktion, die eine positive Dezimalzahl enthält (Sie können diese auch als Zeichenfolge verwenden) und einen Wahrheitswert ausgeben oder zurückgeben , wenn die Zahl auf die beschriebene Weise von einem Ritter auf einem Nummernblock ausgedrückt werden kann, ansonsten aber ausgegeben wird ein falscher Wert.
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist frühere Antwort
Beispiele
Wahrheit:
1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 18, 38, 61, 81, 294, 349, 381, 383, 729, 767, 38183, 38383, 18349276, 183492761, 618349276
Falsch:
10, 11, 50, 53, 55, 65, 95, 100, 180, 182, 184, 185, 186, 187, 188, 189, 209, 305, 2009, 5030, 3838384, 4838383, 183492760
78963214
, immer und immer wieder wiederholt. Zählen Sie die Entfernungen - es sind immer vier, so oder so. Ich hätte klarer sein und ausdrücklich sagen sollen, dass Sie es in Kreisreihenfolge schreiben müssen.123...9
. EntschuldigungAntworten:
Jelly,
191514 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Python 2, 52 Bytes
Überprüft, ob zwei aufeinanderfolgende Ziffern in der Zeichenfolge enthalten sind
'18349276167294381'
. Um aufeinanderfolgende Ziffern zu erhalten,zip(`n`,`n`[1:])
überprüft die Funktion wiederholt die letzten beiden Ziffern und entfernt die letzte Ziffer.quelle
Retina ,
5840 BytesVielen Dank an Sp3000 für diesen Vorschlag:
Probieren Sie es online! (Leicht modifiziert, um die gesamte Testsuite gleichzeitig auszuführen.)
Druck
1
für truthy und0
für falsy Ergebnisse.Erläuterung
Finden Sie alle überlappenden Übereinstimmungen
..
, dh alle aufeinander folgenden Ziffernpaare, und verbinden Sie sie mit Zeilenvorschüben.Sortieren Sie die Ziffern in jeder Zeile, so dass nur halb so viele Paare überprüft werden müssen.
Entfernen Sie alle Zeilen, die einem gültigen Zug entsprechen.
Zähle die Übereinstimmungen dieses Regex. Das heißt, wenn alle Zeilen entfernt wurden, stimmt dies einmal mit der resultierenden leeren Zeichenkette überein, andernfalls stimmt es nicht überein und gibt stattdessen Null.
quelle
Pyth -
3528 BytesTest Suite .
quelle
Ruby, 57 Bytes
Anonyme Funktion. Argument ist eine Zeichenfolge.
Programm mit der Testsuite:
Ich habe gerade alle möglichen Springerzüge in eine Zeichenfolge codiert und überprüft, ob alle 2 Ziffern in der Eingabe in dieser Zeichenfolge vorhanden sind.
quelle
grep 58 Bytes
Denn wirklich, wenn Sie grep nicht schlagen können ...
quelle
5
noch mit ihr185
ausgeben1
, solange5
in der Wahrheit und185
in der falschen Liste steht.Haskell 46 Bytes
Anwendungsbeispiel:
all(`elem`q"16729438183492761").q $ "183492761"
->True
So funktioniert es: Es wird die in der Antwort von @Kevin Lau angegebene Suchzeichenfolge verwendet .
q
erstellt eine Liste von Paaren benachbarter Zeichen aus einer Zeichenfolge, zq "1672" -> [('1','6'),('6','7'),('7','2')]
. Die Funktion gibt true zurück, wenn alle Paare aus der Eingabe in den Paaren aus der Suchzeichenfolge enthalten sind.q
wandelt einstellige Eingaben in die leere Liste um, ist alsoelem
immer erfolgreich.quelle
zip<*>tail
eine gekippte Version vonzip=<<tail
? Ich glaube, ich verstehe nicht, was Antragsteller verallgemeinern.<*>
ist definiert als(<*>) f g x = f x (g x)
.JavaScript (ES6),
6562 ByteGibt true oder false zurück. Ich hatte vorher eine rekursive Lösung ausprobiert, die 63 Bytes benötigt,
map
und sogar,reduce
aber sie hat mich 73 Bytes gekostet.Bearbeiten: 3 Bytes dank @ user81655 gespeichert.
quelle
match
arbeitet statt~search
(aber so oder so, das ist wirklich hinterhältig) und|
kann ersetzen||
(aber leider nicht in der rekursiven Version.)!i|...match
da das Übereinstimmungsergebnis, wenn es erfolgreich ist, ein Array aus einer einzelnen Zeichenfolge mit zwei Ziffern ist, die der|
Operator schließlich in eine gültige Ganzzahl umwandelt.C,
8581 BytesGolf gespielt:
Alte nicht rekursive Version (85 Bytes):
Alter Code mit Leerzeichen und Hauptprogramm:
Dieser akzeptiert durch Leerzeichen getrennte Zahlen über die Standardeingabe und gibt 0 aus, wenn kein Numpad-Ritter vorhanden ist, oder 1, wenn dies nicht der Fall ist.
Die neue rekursive 81-Byte-Version spart 4 Byte.
quelle
MATL ,
383729 BytesDies nutzt @ QPaysTaxes Idee .
Die Ausgabe ist ein zweidimensionales, komplexes, nicht leeres Array. Es ist wahr, wenn alle seine Werte einen Realteil ungleich Null haben, und anders falsch.
Probieren Sie es online!
quelle
05AB1E , 29 Bytes
Code:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
MATL,
25243326 Bytes1 Byte weniger dank @LuisMendo!
@Dennis hat einen Fehler gefunden und dann behoben! Vielen Dank!
Übernimmt eine Ganzzahl als Eingabe. Ausgänge 1/0.
Probieren Sie es online!
quelle
A
am Ende brauchst . Die Vektoren von MATL sind wahr, wenn sie keine 0 enthalten.C,
14092 BytesAngenommen, ASCII
Detailliert Probieren Sie es hier
quelle
{,}[]
undchar*
stattdessen als Zeichenfolge codieren . Beachten Sie außerdem, dass Ihre#define
Kosten nicht hoch sind, wenn Sie sie nur zweimal verwenden: Wenn Sie sie entfernen, sparen Sie 4 Byte.\0
innerhalb des Arrays verursachte nicht definiertes Verhalten , damit ich es mit Fassungx
<s>oldscore</s> newscore
beim Bearbeiten zu verwenden, um die Verbesserungen der Partitur widerzuspiegeln, und<!-- language-all: lang-c -->
bevor der Code beginnt, die Syntaxhervorhebung zu beheben. Ich habe es auch geschafft, meinen
in der Kurzversion?). Außerdem sollten Sie wahrscheinlich erwähnen, dass Sie von einer ASCII-Codierung ausgehen - auf EBCDIC-Maschinen erhalten Sie unterschiedliche Zahlen.Julia,
5149 BytesNachprüfung
quelle
Eigentlich 30 Bytes
Übernimmt die Eingabe als Zeichenfolge. Gibt eine positive Ganzzahl für true und 0 für false aus.
Probieren Sie es online!
Erläuterung:
quelle
PowerShell v2 +,
10596 BytesDurchläuft die Eingabe (mit der gekapselt werden muss
""
), indem überprüft wird, ob der Index für ein sequentielles Zeichenpaar in der gültigen Suchzeichenfolge enthalten ist. Ich sehe, Kevin Lau hatte etwas Ähnliches , aber ich habe es mir unabhängig ausgedacht. Jeder dieser Indizes wird mit hinzugefügt+1
, da die.IndexOf()
Funktion zurückgibt,-1
wenn der String nicht gefunden wird. Dies macht "nicht gefunden" zu0
.Wir
-join
berechnen dann alle resultierenden Integer-Werte mit*
und leiten diese aniex
(ähnlich wieeval
) weiter. Dies bedeutet, wenn einer der Indizes nicht gefunden wird, ergibt sich der gesamte Ausdruck0
. Das ist in Pars und verkapselt-or
‚d mit$a-eq5
für den speziellen Fall von Eingang"5"
unserer resultierende Ausgabe zu erzielen.Testläufe
quelle
C 78 Bytes
Da alle anderen die Eingabe als String verstanden haben, habe ich versucht, dies in ganzen Zahlen zu tun. Es funktioniert rekursiv ab der niedrigstwertigen Ziffer (
a%10
). Wenn es die einzige Ziffer ist, wird true zurückgegeben. Andernfalls geben Sie nur dann true zurück, wenn die Zehnerstelle (b%10
) von der Einheitenzahl nicht erreicht werden kann und (rekursiv) der Rest der Eingabe denselben Test erfüllt.Der Test der Erreichbarkeit funktioniert, indem die Tour des Ritters linear codiert und jede Ziffer in ihre Position (null bis sieben) auf der Tour konvertiert wird. Für Ziffern
0
und5
weisen wir Position neun zu, die von den anderen Positionen getrennt ist. Dann unterscheiden sich gegenseitig erreichbare Zahlen um eins (Mod Acht); dha[x%10]-a[b%10]
ist entweder ± 1 oder ± 7. Also testen wir die absolute Differenz (Mod 6) gegen 1.Diese Lösung funktioniert für jede Zeichenkodierung, die für C gültig ist (dh Ziffern haben zusammenhängende Codes von 0 bis 9).
quelle
Java 8,
179167 BytesPlatziert die Zifferntasten (minus 5 und 0) in einem Kreis.
l
enthält den Kreisindex dieser Ints. Wenn der Unterschied zwischen zwei Indizes +/- 3 mod 8 beträgt, bewegen sich Ritter zwischen den diesen Indizes entsprechenden Ints. Beachten Sie, dass diesx
eineint[]
.Aktualisieren
<2
anstelle von==1
quelle