Este desafío es un homenaje al usuario de PPCG Dennis por ganar la parte de ladrones de The Programming Language Quiz .
Mirando la página de perfil PPCG de Dennis podemos ver algunas cosas bastante impresionantes:
Actualmente tiene más de sesenta y ocho mil reputación, lo que lo convierte en el segundo en general en representación , superando el tercer lugar en casi treinta mil. Recientemente ganó nuestra elección para un nuevo moderador y obtuvo un nuevo diamante brillante al lado de su nombre. Pero personalmente creo que la parte más interesante de Dennis es su número de identificación de usuario PPCG: 12012.
A primera vista, 12012
casi parece un palíndromo , un número que dice lo mismo cuando se invierte, pero está un poco apagado. Puede convertirse en el palíndromo 21012
si intercambiamos las posiciones del primero 1
y 2
, y puede convertirse en el palíndromo 12021
si intercambiamos el último 1
y 2
. Además, siguiendo la convención de que los ceros a la izquierda en un número no se escriben, intercambian el primero 1
y los 0
resultados en 02112
o más bien 2112
que es otro palíndromo.
Definamos un número de Dennis como un entero positivo que no es palindrómico en sí mismo, pero que puede convertirse en un palíndromo intercambiando las posiciones de al menos un par de dos dígitos. El orden de un número de Dennis es el número de pares distintos de dígitos que se pueden intercambiar para hacer un palíndromo (no necesariamente distinto).
Así que el orden de 12012
es 3 desde 3 pares distintos de sus dígitos ( 12012
, , ) se pueden intercambiar alrededor para producir palíndromos. pasa a ser el menor número de orden 3 Dennis.12012
12012
12012
10
es el número de Dennis más pequeño y tiene el orden 1 porque al cambiar 1
y 0
da 01
aka, 1
que es un palíndromo.
Los ceros imaginarios iniciales de un número no cuentan como dígitos conmutables. Por ejemplo, el cambio 8908
de 08908
e intercambiando los dos primeros dígitos para obtener el palíndromo 80908
es válido. 8908
No es un número de Dennis.
Se podría decir que los números que no son de Dennis tienen orden 0.
Desafío
Escriba un programa o función que tome un entero positivo N e imprima o devuelva el enésimo número Dennis más pequeño junto con su orden en algún formato razonable como 12012 3
o (12012, 3)
.
Por ejemplo, 12012
es el número 774 de Dennis, por lo que si 774
es la entrada a su programa, la salida debería ser algo así 12012 3
. (Curiosamente, 774 es otro número de Dennis).
El código más corto en bytes gana.
Aquí están los primeros 20 números de Dennis y sus órdenes de referencia:
N Dennis Order
1 10 1
2 20 1
3 30 1
4 40 1
5 50 1
6 60 1
7 70 1
8 80 1
9 90 1
10 100 1
11 110 2
12 112 1
13 113 1
14 114 1
15 115 1
16 116 1
17 117 1
18 118 1
19 119 1
20 122 1
fuente
Respuestas:
Pyth, 44 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
Un pequeño error estúpido (?) En Pyth arruinó una solución de 41 bytes.
Explicación:
fuente
.f
. Aquí está la solicitud de extracción que hice debido a esta pregunta: github.com/isaacg1/pyth/pull/151CJam, 45 bytes
Pruébalo en línea!
Cómo funciona
fuente
Haskell, 174 bytes
p
comprueba si una lista es un palíndromo.x!y
esTrue
si las listasx
yy
(que deberían tener la misma longitud) difieren exactamente en dos lugares. Específicamente, six
es una permutación dey
,x!y
determina si es un "intercambio".o n
encuentra el orden Dennis den
. Filtra los intercambios entre las permutaciones dex = show n
, y luego cuenta cuántos de esos intercambios son palíndromos. La comprensión de la lista que realiza este recuento tiene una protección adicionalnot (p x)
, lo que significa que volverá0
sin
para empezar era un palíndromo.El
snd (span (<'1') v)
bit es solodropWhile
un byte más corto; se convierte"01221"
en"1221"
.f
índices de una lista de(i, o i)
dóndeo i > 0
(i
es decir, es un número de Dennis). Normalmente, aquí habría un error de uno por uno, ya que(!!)
cuenta desde 0 pero el problema cuenta desde 1. Logré remediar esto iniciando la búsqueda desde-10
(que resultó ser considerado un número de Dennis por mi programa!) empujando así todos los números en los lugares correctos.f 774
es(12012,3)
.fuente
Pitón 2, 176
No puedo imaginar que mi código de intercambio sea particularmente óptimo, pero esto es lo mejor que he podido obtener. Tampoco me gusta la frecuencia con la que convierto entre cadena y entero ...
Para cada número, crea una lista de si todos los intercambios de dos dígitos son palíndromos. Disminuye el contador cuando al menos uno de estos valores es verdadero, y el número original no es un palíndromo. Dado que
0+True
en python se evalúa a1
la suma de la lista final funciona para el orden del número de Dennis.fuente
Óxido, 390 bytes
El nuevo Java? : /
Ungolfed y comentó:
fuente
Jalea , 33 bytes (no competitiva)
Pruébalo en línea!
Cómo funciona
fuente
APL, 87
El cuerpo del bucle devuelve un vector de 4 números: 1) su argumento izquierdo
⍺
leído desde la entrada, 2) recuento de números de Dennis hasta el momento, 3) valor actual deX
- el contador del bucle y 4) su ordenK
calculado como la suma de palíndromos dentro de permutaciones de 1 intercambio. Termina cuando los dos primeros elementos se vuelven iguales y los dos últimos se devuelven como resultado.fuente
JavaScript (ES6), 229
Como de costumbre, JavaScript destaca por su ineptitud para la combinatoria (o tal vez sea mi ineptitud ...). Aquí obtengo todas las posiciones de intercambio posibles para encontrar todos los números binarios de la longitud dada y solo 2 unidades establecidas.
Pruebe a ejecutar el fragmento a continuación en Firefox (ya que MSIE está lejos de ser compatible con EcmaScript 6 y Chrome aún no tiene los parámetros predeterminados)
fuente
awk, 199
Estructura
Uso
Pegue esto en su consola y reemplace el número después
echo
, si lo deseaSe vuelve lento en números más altos;)
Versión reutilizable sin golf
fuente
Ruby, 156
Utiliza la función Ruby donde se
"19".next!
devuelve la llamada"20"
para evitar tener que convertir tipos de un lado a otro; solo usamos una expresión regular para ignorar el liderazgo0s
. Itera sobre todos los pares de posiciones de cuerda para verificar si hay interruptores palindrómicos. Originalmente escribí esto como una función recursiva pero rompe la pila.La salida para 774 es
["12012", 3]
(eliminar las comillas costaría 4 bytes más, pero creo que la especificación lo permite).fuente