Inspiré par la génération de numéros adaptés au clavier .
Contexte
De nombreux pavés numériques ont la disposition suivante:
789
456
123
0
Nous définissons le voisinage d'un nombre comme l'ensemble de cellules orthogonalement adjacentes à celui-ci sur le pavé numérique illustré, y compris lui-même. Par exemple, le quartier de 2 est {1,5,3,0,2}
et le quartier de 0 est {1,2,0}
. Il y a une liste des environs de chaque numéro ci-dessous, au-dessus des cas de test.
Nous définissons un nombre convivial du pavé numérique comme un entier positif où, lorsqu'il est écrit en décimal sans zéros non significatifs, chaque chiffre, à l'exception du premier, se trouve au voisinage du chiffre précédent.
Par exemple,
- 7856 est un numéro convivial car 8 se trouve dans le quartier de 7, 5 dans le voisinage de 8 et 6 dans le quartier de 5.
- 1201 est un nombre convivial du pavé numérique, car 2 se trouve dans le voisinage de 1, 0 est dans le voisinage de 2 et 1 est dans le voisinage de 0.
- 82 n'est pas un numéro convivial car 2 n'est pas dans le voisinage de 8.
- 802 n'est pas un numéro convivial car 0 n'est pas dans le voisinage de 8 (les quartiers ne s'enroulent pas).
Séquence OEIS associée . Notez que cette séquence associée est distincte car elle compte 0comme adjacente à la 7place de 1et 2.
Défi
Étant donné un entier positif n
, retournez le n
-ème ou les premiers n
nombres compatibles avec le pavé numérique, où le premier est 1. Vous pouvez utiliser une indexation basée sur 0, où le 0-ème numéro compatible avec le pavé numérique serait 1.
Quartiers
Le quartier de chaque chiffre est répertorié ici:
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}
Cas de test / séquence
Ce sont les 100 premiers termes
[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]
la source
Réponses:
JavaScript (ES6),
104938988 octetsRenvoie le N-ème terme de la séquence, indexé 1.
Démo
Afficher l'extrait de code
la source
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
peut-être quelque chose aide, mon test est probablement trop longPerl 5 , 123 + 1 (-p) = 124 octets
Essayez-le en ligne!
la source
Gelée ,
2724 octetsRenvoie les N premiers termes de la séquence.
Essayez-le en ligne!
Ceci est un port de ma réponse JS .
la source
05AB1E ,
2423 octetsEssayez-le en ligne!
Renvoie le nième nombre de la séquence.
Explications:
L'idée principale est que, outre la
0
clé, tout chiffre décrémenté et converti en base 3 a les propriétés suivantes:Bien sûr, nous avons besoin d'une
if
instruction pour gérer la0
touche du pavé numérique.la source
MATL ,
2927 octetsGénère les premiers
n
numéros compatibles avec le pavé numérique.Essayez-le en ligne!
Explication
Chaque chiffre de
1
à9
est codé comme un nombre complexe représentant sa position dans le pavé numérique, en utilisant dans une grille de l'étape 2, où la partie réelle représente la position verticale et la partie imaginaire représente la position horizontale. Ainsi1
est0+0j
,2
est0+2j
,3
est0+4j
,4
est2+0j
, ...,9
est4+4j
.Le chiffre
0
est codé comme0+1j
, c'est-à-dire comme s'il était placé exactement entre1
et2
.Pour chaque candidat numéro numpad convivial, une conversion de base « décimale » est appliquée en utilisant ce qui précède des nombres complexes au lieu des chiffres
0
,1
...,9
. Cela donne un tableau, dont les différences consécutives absolues sont calculées. Le numéro de candidat est compatible avec le pavé numérique si et seulement si toutes les différences absolues sont au maximum2
(c'est-à-dire le pas de grille). Si c'est le cas, le numéro est laissé sur la pile.Le code utilise une boucle
do
...while
, qui est quittée lorsque le nombre de nombres dans la pile est égal à l'entréen
.Une grille unitaire aurait été un choix plus naturel. Chiffres
1
,2
et0
correspondraient alors0+0j
,1+0j
et0.5+0j
respectivement. Mais il est plus judicieux d'utiliser une grille de l'étape 2, car multiplier par2
(fonctionE
) et pousser0+1j
(fonctionJ
) est un octet plus court que pousser0+0.5j
(J2/
ou.5j
)la source
Gelée , 26 octets
Essayez-le en ligne!
-2 octets grâce à caird coinheringaahing
-2 octets grâce à Erik the Outgolfer
Explication
la source
[]
pour 2 octetsPython 2 , 134 octets
Essayez-le en ligne!
la source
f
, puis l'utilisez une fois , vous pouvez l'intégrer et enregistrer deux octets .Mathematica,
249234202 octetsEssayez-le en ligne!
merci à user202729 pour la compression des données (-32 octets)
Mes résultats:
la source
IntegerDigits
:IntegerDigits/@{210,4210,53210,632,7541,86542,9653,874,9875,986}
et l' utilisationFreeQ
,Tr
, utilise auDo
lieu deFor
, la notation utilisation infix pourAppendTo
et utiliser auDo
lieu deWhile
la répétitionTr[1^s]
fois, éliminer également la variablep
. De plus, vous n'avez pas prouvé que l'algorithme est correct, c'est-à-dire que le nombre résultant est toujours inférieur à son index au carré, ce qui est nécessaire pour valider une réponse.PHP, 124 + 1 octets
Exécuter en tant que pipe avec
-nR
ou l' essayer en ligne .la source
Java 8,
192190 octetsRenvoie le
n
numéro (indexé 1) dans la séquence.C'était étonnamment plus difficile que je ne le pensais.
Explication:
Essayez-le ici.
la source