Objetivo
Dada entrada ry nencuentra los primeros nnúmeros naturales de xtal manera que si rotamos el primer dígito al último lugar que obtenemos x/r.
Puede suponer eso 2 <= r <= 9y 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 ry ncomo 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=4yn=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≤9se mueve su primer dígito hasta el final para obtenery=10*m+a. Un poco de matemáticas revela quemse puede obtener comoa*(10^k-r)/(10*r-1), por lo que sólo tiene que escanearamás[1..9]por cadakde 0 a infinito, y mantenemos e imprimir los primerosnresultados para los cuales la expresión anterior parames integral.Se
fromIntegralrequiere porquereadincluir una listancomo uno de sus elementos enmain, en combinación con el uso denintake, obligaríaraInttodo, 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 = 65535en un minuto?y`mod`10conmod 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 * rlugar 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
ToDecpara 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
ky un entero no negativonconL(n)<k, definaRep_k(n)como el número real obtenido agregando ceros delante de los dígitos decimales den, si es necesario para obtenerkdígitos totales, y luego repitiendo infinitamente esoskdígitos después del punto decimal. P.ejMultiplicar
Rep_k(n) * 10^kda los dígitosnanteriores al punto decimal, y los dígitos (rellenos con cero) deninfinitamente repetidos después del punto decimal. EntoncesDado un número entero positivo
r, supongamos quexes una solución al problema, ydonde
x_1 != 0yk = L(x).Para ser una solución,
xes un múltiplo deryAplicar la
Rep_kfunción da una buena ecuación:Usando su forma cerrada desde arriba,
x_1debe estar en el set{1 ... 9}.rse especificó para estar en el conjunto{2 ... 9}. Ahora la única pregunta es, ¿para qué valores dekla fórmula anteriorxda un número entero positivo? Consideraremos cada valor posible de formarindividual.Cuando
r= 2, 3, 6, 8 o 9,10r-1es 19, 29, 59, 79 u 89, respectivamente. En todos los casos, el denominadorp = 10r-1es primo. En el numerador, solo10^k-1puede 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 = 4y10r-1 = 39; o cuandor = 7y10r-1 = 69, el denominador es 3 veces un primo diferentep=(10r-1)/3.10^k-1siempre 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>.pySalida:
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 longpara eso, y hacerlo multinúcleo para hacerlo en un minuto.unsigned long longes de 64 bits, no es lo suficientemente grande.