Inspiriert von Generate Keyboard Friendly Numbers .
Hintergrund
Viele Nummernblöcke haben das folgende Layout:
789
456
123
0
Wir definieren die Nachbarschaft einer Zahl als die Menge von Zellen, die orthogonal dazu auf dem gezeigten Nummernblock benachbart sind, einschließlich sich selbst. Zum Beispiel ist die Nachbarschaft von 2{1,5,3,0,2}
0 {1,2,0}
. Unterhalb der Testfälle befindet sich eine Liste der Nachbarschaften der einzelnen Nummern.
Wir definieren a Numpad-freundliche Zahl als eine positive Ganzzahl, bei der sich jede Ziffer mit Ausnahme der ersten in der Nachbarschaft der vorherigen Ziffer befindet, wenn sie dezimal ohne führende Nullen geschrieben wird.
Beispielsweise,
- 7856 ist eine Numpad-freundliche Zahl, weil 8 in der Nachbarschaft von 7 ist, 5 in der Nachbarschaft von 8 ist und 6 in der Nachbarschaft von 5 ist.
- 1201 ist eine Numpad-freundliche Zahl, weil 2 in der Nachbarschaft von 1 ist, 0 in der Nachbarschaft von 2 ist und 1 in der Nachbarschaft von 0 ist.
- 82 ist nicht Numpad-freundliche Zahl, da 2 nicht in der Nähe von 8 liegt.
- 802 ist keine Numpad-freundliche Zahl, da 0 nicht in der Nähe von 8 liegt (Nachbarschaften werden nicht umbrochen).
Verwandte OEIS-Sequenz . Beachten Sie, dass diese verwandte Sequenz verschieden ist , weil es zählt 0als neben 7statt 1und 2.
Herausforderung
Bei einer positiven Ganzzahl n
geben Sie die n
-te oder die ersten n
Anzeigenummern zurück, wobei die erste 1 ist. Sie können eine 0-basierte Indizierung verwenden, wobei die 0-te Anzeigenummer 1 ist.
Nachbarschaften
Die Nachbarschaft der einzelnen Ziffern ist hier aufgelistet:
0:{0,1,2}
1:{0,1,2,4}
2:{0,1,2,3,5}
3:{2,3,6}
4:{1,4,5,7}
5:{2,4,5,6,8}
6:{3,5,6,9}
7:{4,7,8}
8:{5,7,8,9}
9:{6,8,9}
Testfälle / Sequenz
Dies sind die ersten 100 Begriffe
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 20, 21, 22, 23, 25, 32, 33, 36, 41, 44, 45, 47, 52, 54, 55, 56, 58, 63, 65, 66, 69, 74, 77, 78, 85, 87, 88, 89, 96, 98, 99, 100, 101, 102, 110, 111, 112, 114, 120, 121, 122, 123, 125, 141, 144, 145, 147, 200, 201, 202, 210, 211, 212, 214, 220, 221, 222, 223, 225, 232, 233, 236, 252, 254, 255, 256, 258, 320, 321, 322, 323, 325, 332, 333, 336, 363, 365, 366, 369, 410, 411, 412, 414, 441, 444, 445, 447]
quelle
Antworten:
JavaScript (ES6),
104938988 ByteGibt den N-ten Term der Sequenz zurück, der 1-indiziert ist.
Demo
Code-Snippet anzeigen
quelle
k=(n,a=1)=>n?k(n-([...(x=a+[]).slice(0,-1)].reduce((a,c)=>a*!!~"012 0124 01235 236 1457 24568 3569 478 5789 689".split` `[c].indexOf(x[i++]),i=1)),a+1):a-1
vielleicht hilft etwas, mein Test ist wahrscheinlich zu langPerl 5 , 123 + 1 (-p) = 124 Bytes
Probieren Sie es online!
quelle
Jelly ,
2724 BytesGibt die N ersten Terme der Sequenz zurück.
Probieren Sie es online!
Dies ist ein Port meiner JS-Antwort .
quelle
05AB1E ,
2423 BytesProbieren Sie es online!
Gibt die n-te Zahl in der Sequenz zurück.
Erklärungen:
Die Hauptidee ist, dass, abgesehen von der
0
jede in Basis 3 dekrementierte und konvertierte Ziffer Schlüssel die folgenden Eigenschaften aufweist:Natürlich brauchen wir eine
if
Anweisung, um mit der0
Zifferntaste umgehen zu können.quelle
MATL ,
2927 Bytesn
Gibt die ersten Nummernblock-freundlichen Nummern aus.Probieren Sie es online!
Erläuterung
Jede Ziffer von
1
bis9
wird als komplexe Zahl codiert, die ihre Position im Nummernblock darstellt. Dabei wird in einem Schritt-2-Raster ein Realteil für die vertikale Position und ein Imaginärteil für die horizontale Position verwendet. So1
ist0+0j
,2
ist0+2j
,3
ist0+4j
,4
ist2+0j
, ...9
ist4+4j
.Die Ziffer
0
wird so codiert0+1j
, als ob sie genau zwischen1
und platziert wäre2
.Für jeden Kandidaten numpad freundliche Nummer, eine „dezimal“ Basis Umwandlung wird die obige komplexe Zahlen anstelle der Ziffern angewendet mit
0
,1
, ...,9
. Dies ergibt ein Array, aus dem die absoluten aufeinanderfolgenden Differenzen berechnet werden. Die Kandidatennummer ist genau dann nummernfreundlich, wenn alle absoluten Unterschiede maximal sind2
(dh der ). In diesem Fall bleibt die Nummer auf dem Stapel.Der Code verwendet eine
do
...while
-Schleife, die beendet wird, wenn die Anzahl der Zahlen im Stapel der Eingabe entsprichtn
.Ein Einheitsraster wäre eine natürlichere Wahl gewesen. Ziffern
1
,2
und0
würden dann entsprechen0+0j
,1+0j
und0.5+0j
respecrively. Es ist jedoch besser, ein Step-2-Gitter zu verwenden, da das Multiplizieren mit2
(FunktionE
) und Drücken0+1j
(FunktionJ
) ein Byte kürzer ist als Drücken0+0.5j
(J2/
oder.5j
).quelle
Gelee , 26 Bytes
Probieren Sie es online!
-2 Bytes dank caird coinheringaahing
-2 Bytes dank Erik the Outgolfer
Erläuterung
quelle
[]
für 2 BytesPython 2 , 134 Bytes
Probieren Sie es online!
quelle
f
es einmal definieren und dann verwenden , können Sie es einbetten und zwei Bytes sparen .Mathematica,
249234202 BytesProbieren Sie es online!
danke user202729 für das komprimieren von daten (-32 bytes)
Meine Ergebnisse:
quelle
IntegerDigits
:IntegerDigits/@{210,4210,53210,632,7541,86542,9653,874,9875,986}
und VerwendungFreeQ
,Tr
verwenden SieDo
stattFor
, Verwendung Infixschreibweise fürAppendTo
und verwendetDo
stattWhile
zu wiederholenTr[1^s]
Zeiten, auch die Variable beseitigenp
. Sie haben auch nicht bewiesen, dass der Algorithmus korrekt ist, dh, die resultierende Zahl ist immer kleiner als das Quadrat des Index, das erforderlich ist, um eine gültige Antwort zu erhalten.PHP, 124 + 1 Bytes
Laufen Sie als Pipe mit
-nR
oder versuchen Sie es online .quelle
Java 8,
192190 BytesGibt die (1-indizierte)
n
'te Zahl in der Sequenz zurück.Das war überraschend schwieriger als ich dachte. Wahrscheinlich hatte ich heute Nachmittag nur ein paar Hirn-Fürze.
Erläuterung:
Probieren Sie es hier aus.
quelle