Objetivo
Dada entrada r
y n
encuentra los primeros n
números naturales de x
tal manera que si rotamos el primer dígito al último lugar que obtenemos x/r
.
Puede suponer eso 2 <= r <= 9
y 1 <= n <= 65535
.
Puede escribir un programa que tome datos de argumentos estándar o de línea de comandos; o puede escribir una función que tome r
y n
como parámetros. La salida, sin embargo, debe ser stdout. La salida debe ser una línea por valor de x
, formateada como x/r=y
, en orden de aumento x
.
Su solución debe poder manejar todos los casos válidos en un minuto en una computadora de escritorio razonable.
Casos de prueba
Entrada: 4 5
Salida:
102564/4=25641
205128/4=51282
307692/4=76923
410256/4=102564
512820/4=128205
Entrada: 5 1
Salida:714285/5=142857
Este es el código de golf, por lo que ganan menos bytes. La respuesta ganadora será aceptada dentro de 4 semanas (2014-09-19).
Los créditos para esta pregunta van a mi colega, quien me permitió publicar esta pregunta aquí :)
fuente
gprof
, un caso de entrada para mi programa pasa menos de medio segundo en mi código, pero toma alrededor de 80 segundos en total, lo que supongo que debe estar bloqueando la salida.printf
.Respuestas:
Haskell,
182179Segunda versión, probablemente más golfable, pero con algoritmo "apropiado" esta vez. En particular, termina en unos minutos con
r=4
yn=65535
, pero, de nuevo, mi computadora no es razonable ni de escritorio, por lo que es probable que se quede dentro de un minuto en otras máquinas.Se basa en la idea de que
x=10^k*a + m
, donde0≤a≤9
se mueve su primer dígito hasta el final para obtenery=10*m+a
. Un poco de matemáticas revela quem
se puede obtener comoa*(10^k-r)/(10*r-1)
, por lo que sólo tiene que escaneara
más[1..9]
por cadak
de 0 a infinito, y mantenemos e imprimir los primerosn
resultados para los cuales la expresión anterior param
es integral.Se
fromIntegral
requiere porqueread
incluir una listan
como uno de sus elementos enmain
, en combinación con el uso den
intake
, obligaríar
aInt
todo, lo que da como resultado desbordamientos desagradables con los grandes números en cuestión. Podría haber usadogenericTake
, pero eso requiere unimport
.Este código también tiene el beneficio de ser casi trivial para expandirse a otras bases que no sean 10.
La entrada se lee
stdin
, los dos valores se pueden separar por cualquier espacio en blanco.fuente
r = 5; n = 65535
en un minuto?y`mod`10
conmod y10
, que es un char más cortoPure Bash (sin utilidades externas), 80 bytes
Tenga en cuenta que bash solo hace aritmética de enteros y no coma flotante, por lo que verificamos si en
x == y * r
lugar dex / r == y
. También la multiplicación generalmente debería ser más rápida. Aún así, esto no está cerca de cumplir con el requisito de rendimiento.Salida:
fuente
C 468
(Algunas líneas nuevas no contadas en el recuento de bytes se han agregado anteriormente para eliminar las barras de desplazamiento. Sí, se cuenta la línea nueva final).
Espera argumentos en la línea de comando y supone que la salida estándar acepta ASCII. El tiempo de ejecución es O (número de bytes de salida) = O (n * n).
No, no puedo usar
printf
. Eso lleva demasiado tiempo y empuja el programa por encima del límite de minutos en mi escritorio. Tal como están las cosas, algunos casos de prueba tardan unos 30 segundos.El algoritmo trata la salida como cadenas, no números, ya que rápidamente se vuelven enormes, y hay patrones fuertes en la salida.
Algo sin golf:
Prueba
que el programa resuelve el problema:
(En la prueba, considere que todos los operadores y funciones son las funciones matemáticas reales, no las operaciones de la computadora que las aproximan.
^
Denota exponenciación, no bit a xor).Para mayor claridad, usaré una función
ToDec
para describir el proceso ordinario de escribir un número como una secuencia de dígitos decimales. Su rango es el conjunto de tuplas ordenadas{0...9}
. Por ejemplo,Para un entero positivo
n
, defínaloL(n)
como el número de dígitos en la representación decimal den
; o,Para un entero positivo
k
y un entero no negativon
conL(n)<k
, definaRep_k(n)
como el número real obtenido agregando ceros delante de los dígitos decimales den
, si es necesario para obtenerk
dígitos totales, y luego repitiendo infinitamente esosk
dígitos después del punto decimal. P.ejMultiplicar
Rep_k(n) * 10^k
da los dígitosn
anteriores al punto decimal, y los dígitos (rellenos con cero) den
infinitamente repetidos después del punto decimal. EntoncesDado un número entero positivo
r
, supongamos quex
es una solución al problema, ydonde
x_1 != 0
yk = L(x)
.Para ser una solución,
x
es un múltiplo der
yAplicar la
Rep_k
función da una buena ecuación:Usando su forma cerrada desde arriba,
x_1
debe estar en el set{1 ... 9}
.r
se especificó para estar en el conjunto{2 ... 9}
. Ahora la única pregunta es, ¿para qué valores dek
la fórmula anteriorx
da un número entero positivo? Consideraremos cada valor posible de formar
individual.Cuando
r
= 2, 3, 6, 8 o 9,10r-1
es 19, 29, 59, 79 u 89, respectivamente. En todos los casos, el denominadorp = 10r-1
es primo. En el numerador, solo10^k-1
puede ser un múltiplo dep
, lo que sucede cuandoEl conjunto de soluciones se cierra con sumas y restas que no resultan en un número negativo. Entonces, el conjunto comprende todos los múltiplos de algún factor común, que también es la solución menos positiva para
k
.Cuando
r = 4
y10r-1 = 39
; o cuandor = 7
y10r-1 = 69
, el denominador es 3 veces un primo diferentep=(10r-1)/3
.10^k-1
siempre es un múltiplo de 3, y nuevamente ningún otro factor en el numerador puede ser múltiplo dep
, por lo que nuevamente el problema se reduce ay nuevamente las soluciones son todos los múltiplos de la solución menos positiva para
k
.[Sin terminar...]
fuente
Python -
9190Aquí hay un primer tiro:
Editar: Ok, probablemente sea una forma lenta de cumplir con el límite de tiempo requerido de 1 minuto para los números de 65K.
fuente
JavaScript - 145
no golfizado:
fuente
(5,4)
. La razón por la que no funcionará es que los números crecen mucho . a) Mucho más grande que un número en JS puede representar con precisión yb) demasiado grande como para que sea posible recorrer todos los números para llegar allí.Python 3 -
223179 bytesImplementación de Python de la solución TheSpanishInquisition:
Correr:
python3 <whatever you named it>.py
Salida:
Recomendaciones:
https://oeis.org/A092697 es el primer valor para cada r.
Parece que solo ciertos valores de k producen respuestas, y que el intervalo es regular. Por ejemplo, para r = 4:
Los intervalos son:
Esto forma https://oeis.org/A094224 .
Usando estos valores, se puede construir una versión más eficiente:
Sin embargo, no puedo (todavía) demostrar que esto continúa matemáticamente.
Resultados para r = 5:
fuente
9 65535
?unsigned long long
para eso, y hacerlo multinúcleo para hacerlo en un minuto.unsigned long long
es de 64 bits, no es lo suficientemente grande.