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, 12012casi 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 21012si intercambiamos las posiciones del primero 1y 2, y puede convertirse en el palíndromo 12021si intercambiamos el último 1y 2. Además, siguiendo la convención de que los ceros a la izquierda en un número no se escriben, intercambian el primero 1y los 0resultados en 02112o más bien 2112que 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 12012es 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.120121201212012
10es el número de Dennis más pequeño y tiene el orden 1 porque al cambiar 1y 0da 01aka, 1que es un palíndromo.
Los ceros imaginarios iniciales de un número no cuentan como dígitos conmutables. Por ejemplo, el cambio 8908de 08908e intercambiando los dos primeros dígitos para obtener el palíndromo 80908es válido. 8908No 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 3o (12012, 3).
Por ejemplo, 12012es el número 774 de Dennis, por lo que si 774es 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
pcomprueba si una lista es un palíndromo.x!yesTruesi las listasxyy(que deberían tener la misma longitud) difieren exactamente en dos lugares. Específicamente, sixes una permutación dey,x!ydetermina si es un "intercambio".o nencuentra 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á0sinpara empezar era un palíndromo.El
snd (span (<'1') v)bit es solodropWhileun byte más corto; se convierte"01221"en"1221".fíndices de una lista de(i, o i)dóndeo i > 0(ies 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 774es(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+Trueen python se evalúa a1la 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 ordenKcalculado 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