Inspirado por Generate Keyboard Friendly Numbers .
Fondo
Muchos botones numéricos tienen el siguiente diseño:
789
456
123
0
Definimos la vecindad de un número como el conjunto de celdas ortogonalmente adyacentes a él en el teclado numérico que se muestra, incluido él mismo. Por ejemplo, el vecindario de 2 es {1,5,3,0,2}
y el vecindario de 0 es {1,2,0}
. Hay una lista del vecindario de cada número a continuación, arriba de los casos de prueba.
Definimos un número amigable para el teclado numérico como un entero positivo donde, cuando se escribe en decimal sin ceros a la izquierda, cada dígito, excepto el primero, está cerca del dígito anterior.
Por ejemplo,
- 7856 es un número compatible con el teclado numérico porque 8 está cerca de 7, 5 está cerca de 8 y 6 está cerca de 5.
- 1201 es un número compatible con el teclado numérico porque 2 está cerca del 1, 0 está cerca del 2 y 1 está cerca del 0.
- 82 no es un número compatible con el teclado numérico porque 2 no está cerca del 8.
- 802 no es un número compatible con el teclado numérico porque 0 no está cerca del 8 (los vecindarios no se ajustan).
Secuencia OEIS relacionada . Tenga en cuenta que esta secuencia relacionada es distinta porque cuenta 0como adyacente a en 7lugar de 1y 2.
Reto
Dado un número entero positivo n
, devuelva los números amigables número n
-1 o primer n
teclado numérico, donde el primero es 1. Puede usar indexación basada en 0, donde el número amigable número-0 sería 1.
Barrios
El vecindario de cada dígito se enumera aquí:
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}
Casos de prueba / secuencia
Estos son los primeros 100 términos
[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]
fuente
Respuestas:
JavaScript (ES6),
104938988 bytesDevuelve el enésimo término de la secuencia, 1 indexado.
Manifestación
Mostrar fragmento de código
fuente
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
tal vez algo que ayude, mi prueba es probablemente demasiado largaPerl 5 , 123 + 1 (-p) = 124 bytes
Pruébalo en línea!
fuente
Jalea ,
2724 bytesDevuelve los N primeros términos de la secuencia.
Pruébalo en línea!
Este es un puerto de mi respuesta JS .
fuente
05AB1E ,
2423 bytesPruébalo en línea!
Devuelve el enésimo número de la secuencia.
Explicaciones:
La idea principal es que, aparte de la
0
clave, cualquier dígito decrementado y convertido a base 3 tiene las siguientes propiedades:Por supuesto, necesitamos una
if
declaración para manejar la0
tecla del teclado numérico.fuente
MATL ,
2927 bytesEmite los primeros
n
números compatibles con el teclado numérico.Pruébalo en línea!
Explicación
Cada dígito desde
1
hasta9
se codifica como un número complejo que representa su posición en el teclado numérico, utilizando una cuadrícula de paso 2, donde la parte real representa la posición vertical y la parte imaginaria representa la posición horizontal. Así1
es0+0j
,2
es0+2j
,3
es0+4j
,4
es2+0j
, ...,9
es4+4j
.El dígito
0
se codifica como0+1j
, es decir, como si estuviera colocado exactamente entre1
y2
.Para cada número del teclado numérico de usar candidato, se aplica una conversión de base "decimal" mediante los métodos anteriores números complejos en lugar de los dígitos
0
,1
, ...,9
. Esto proporciona una matriz, de la cual se calculan las diferencias absolutas consecutivas. El número candidato es compatible con el teclado numérico si y solo si todas las diferencias absolutas son como máximo2
(es decir, el paso de la cuadrícula). Si ese es el caso, el número se deja en la pila.El código usa un
do
...while
bucle, que sale cuando la cantidad de números en la pila es igual a la entradan
.Una cuadrícula de unidades habría sido una opción más natural. Dígitos
1
,2
y0
luego correspondería a0+0j
,1+0j
y0.5+0j
respetuosamente. Pero es más golfista usar una cuadrícula de paso 2, porque multiplicar por2
(funciónE
) y empujar0+1j
(funciónJ
) es un byte más corto que empujar0+0.5j
(J2/
o.5j
)fuente
Jalea , 26 bytes
Pruébalo en línea!
-2 bytes gracias a caird coinheringaahing
-2 bytes gracias a Erik the Outgolfer
Explicación
fuente
[]
de 2 bytesPython 2 , 134 bytes
Pruébalo en línea!
fuente
f
y lo use una vez , podría incorporarlo y guardar dos bytes .Mathematica,
249234202 bytesPruébalo en línea!
gracias user202729 por comprimir datos (-32 bytes)
Mis resultados:
fuente
IntegerDigits
:IntegerDigits/@{210,4210,53210,632,7541,86542,9653,874,9875,986}
y useFreeQ
,Tr
use enDo
lugar deFor
, use la notación infija paraAppendTo
y use enDo
lugar deWhile
para repetirTr[1^s]
tiempos, también elimine la variablep
. Además, no ha demostrado que el algoritmo sea correcto, es decir, el número resultante siempre es menor que su índice al cuadrado, lo cual es necesario para que una respuesta sea válida.PHP, 124 + 1 bytes
Ejecutar como tubería con
-nR
o probarlo en línea .fuente
Java 8,
192190 bytesDevuelve el (1 indexado)
n
en la secuencia.Esto fue sorprendentemente más difícil de lo que pensé ... Probablemente solo teniendo algunos pedos cerebrales esta tarde ...
Explicación:
Pruébalo aquí
fuente