Snaking Number Challenge
Ich frage mich, wie viele Schlangenzahlen es zwischen 1 und 50.000 gibt.
Snaking Numbers sind in diesem Spiel Zahlen, die auf einem herkömmlichen Nummernblock (Format unten) eingegeben werden können, indem eine Taste nach oben, unten, links oder rechts bewegt wird.
7 8 9
4 5 6
1 2 3
0
Wenn Sie beispielsweise mit der Zahl 5 beginnen, können Sie 4, 6, 8 oder 2 als nächsten gültigen Zug auswählen. 7, 3, 9 und 1 sind jedoch nicht zulässig, da sie diagonal zur aktuellen Taste positioniert sind . Wenn Sie also 5, dann 2 haben, sind Ihre nächsten möglichen Schlüsselwahlen wieder 0, 1, 3 oder 5.
In dieser Code-Golf-Übung geben Sie eine Liste aller positiven Snaking-Zahlen zwischen 1 und 50.000 sowie eine endgültige Zählung aller Zahlen aus, die das Kriterium erfüllen.
Regeln
- Zahlen können nicht mit einer Null beginnen.
- Zahlen müssen ganze positive ganze Zahlen sein.
- Jede fortlaufende Nummer, die von links nach rechts gelesen wird, muss sich um den Nummernblock "schlängeln".
- Die Schlange kann nicht diagonal über Tasten laufen
- Auf die Nummer 0 kann von den Nummern 1 und 2 zugegriffen werden
- Nummern können nicht gepaart werden (zB: 22)
Beispiele für gültige Snaking Numbers:
12369
45201
1254
10102
1
12
987
Beispiele für ungültige Nummern
1238 - 8 is not connected
0001 - multiple leading 0s
0101 - leading 0
159 - snake cannot travel diagonally
4556 - duplicate 5
Wie bei normalen Code Golfs ist das Ziel die kleinste Anzahl von Bytes!
Nach meiner Mathematik und meinen Regeln sollten Sie 670 gültige Snaking-Nummern in Ihrer Liste haben, plus 670 selbst, die als letzte Nummer gedruckt werden.
Antworten:
K (NGN / k) ,
6057 BytesProbieren Sie es online!
!50000
liste von0
..49999
1+
addiere 1 zu allen{
}#
Filter mit der Funktion in{
}
10\x
Dezimalstellen des Arguments(
)@
Verwendung als Indizes in ...!3 3
ein paar Listen:(0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)
2*
multiplizieren Sie alle mit 20 1,'
0
der ersten und1
der zweiten Liste voranstellen+
transponieren (Listenpaar -> Liste der Paare). Dies gibt uns die ungefähren Knopfkoordinaten.-':
subtrahieren Sie von jedem Paar das vorherige Paar. verwenden0 0
als imaginäres Element vor dem ersten.1_
Lass den ersten fallen+
transponierenx*x:
Quadrat (Zuordnen zux
und Multiplizieren mitx
). Hierx
sind zwei Listen - --xs und ∆ys+/
Summiere die beiden Listen (Element für Element)5&
min mit 53!
mod 31=
Boolesche Liste, wo es gleich 1 ist*/
Produkt (Boolesches "und")(x;#x:
)
Machen Sie ein Paar aus dem Ergebnis und der Länge (#
) des Ergebnissesquelle
Gelee ,
2423 BytesEin vollständiges Programm, das eine Liste aller Ergebnisse und anschließend die Anzahl der Ergebnisse druckt.
Probieren Sie es online!
Wie?
quelle
1.
bewertet man das1.5
?Python 3 , 140 Bytes
Probieren Sie es online!
Ich bin mir sicher, dass dies jemand mit einem Ausdruck anstelle einer Suchzeichenfolge tun kann.
quelle
Python 2 , 101 Bytes
Probieren Sie es online!
Die Hex-Zahl ist eine Dezimalzahl
10120214525632365878969854741
, die jedes geordnete Ziffernpaar codiert, das nebeneinander erscheinen kann.quelle
JavaScript (V8) ,
112 106104 Byte2 Bytes dank @NahuelFouilleul gespeichert
Ein volles Programm.
Probieren Sie es online!
Oder 96 Bytes, wenn wir die Zahlen in umgekehrter Reihenfolge ausgeben können:
Probieren Sie es online!
quelle
3
vielleicht weil36
es schon in string ist6589632145201478
ist ein Byte kürzerStax ,
3735 BytesFühren Sie es aus und debuggen Sie es unter staxlang.xyz!
Es war so schön und kurz, bis es nicht mehr war.
Entpackt (42 Bytes) und Erklärung
2012365478963258741 codiert die Tastatur. Schauen Sie sich Paare benachbarter Ziffern an. Wenn ich eine anständige kurze Alternative bekommen könnte, die für jedes Paar in beide Richtungen geht, könnte ich vielleicht die acht Bytes von kürzen
{{om
.Ohne diese nachgestellte 670 würde ein einfacher Filter ausreichen:
f..!
statt{..C_Qf%p
. Es könnte einen besseren Weg geben, um mit dieser Unregelmäßigkeit umzugehen. In beiden Fällen ist dieses Filterbereichsverhalten nicht dokumentiert.quelle
PHP , 145 Bytes
Probieren Sie es online!
Überprüfen Sie für jede Zahl von 1 bis 50.000 jede Ziffer dieser Zahl von links nach rechts. Wenn sich alle Ziffern in der Liste der gültigen Ziffern der vorherigen Ziffer befinden, wird diese Nummer gedruckt. Am Ende wird ein fest codierter 670 gedruckt, da er weniger Bytes benötigt, als er tatsächlich zählt.
quelle
05AB1E , 23 Bytes
Probieren Sie es online!
Port of Jonathan Allans Gelee Antwort .
quelle
₄50*
oder4°5*
als ich einen früheren Versuch unternommen habe. Und zuerst war ich verwirrt, warum Sie€OP
statt nur hattenOP
, aber dann wurde mir klar, dass die einstelligen Zahlen (eine leere Liste nach derüα
) dann[] → 0 → 0
anstelle von sein würden[] → [] → 1
. :)4°5*
wenn Sie können5°;
? ZAK gefällt mir allerdings besser. Und ja, diese Randbedingung für einstellige Zahlen ist ein Schmerz.Perl 5 (
-M5.01
),96, 92 Bytes-4 Bytes dank @Xcali
TIO
quelle
JavaScript (SpiderMonkey) ,
179173151129 BytesProbieren Sie es online!
-22 bytes danke an Arnauld -22 bytes danke an dana
Erläuterung:
@dana gab auch eine 123-Byte-Lösung an, wenn wir zuerst 670 drucken können
quelle
Ruby , 99 Bytes
Probieren Sie es online!
quelle
Stax ,
2826 BytesFühren Sie es aus und debuggen Sie es
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie dieses aus
Die geheime Sauce steht im String-Literal
"{<f:[/T8Z"
. Nachdem Sie alle Codepunkte zusammengesteckt haben, erhalten Sie12360102589147845690
. Die aufsteigenden Paare in dieser Zeichenfolge sind die gültigen Schlangenbewegungen.quelle
15JJ
anstatt219J
würde auch funktionieren, aber ich glaube nicht, dass Sie von dort aus jedes Byte golfen können, es sei denn, es gibt eine 1-Byte-Konstante für15
.Haskell , 118 Bytes
Probieren Sie es online!
Ein erster Durchgang; Ich kann nicht gut komprimieren.
Das
s=
zählt nicht, da wir das Ergebnis eigentlich nicht binden müssen.Ungolfed Code .
quelle
Holzkohle , 42 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Verarbeiten des inklusiven Bereich von
1
bis50,000
Guss zu bespannen.Filtern Sie diejenigen heraus, deren Ziffernpaare nicht in der komprimierten Zeichenfolge enthalten sind
01478963202125458565236987410
.Geben Sie das verbleibende Array und seine Länge aus.
quelle
Japt , 34 Bytes
Versuch es
quelle
Perl 6 , 64 Bytes
Probieren Sie es online!
Erläuterung
quelle
~>
es noch nicht implementiert ist, sonst könnten Sie dies nur mit String-Operatoren tun, wobei das Bit-Feld ein String istPyth ,
686545 BytesProbieren Sie es online!
Inspiration für die überarbeitete Nachschlageprozess kam von Khuldraeseth na'Barya der Stax Antwort , so dass sie eine upvote gehen zu geben!
Edit 2: Umschreiben, um ein paar Bytes zu speichern, frühere Version:
Bearbeiten: 3 Bytes mit String-Lookups abgelegt, Vorgängerversion:
quelle