La densidad de dígitos de números cuadrados (SNDD) de un número, inventada por mí mismo, es la relación entre el recuento de números cuadrados encontrados en dígitos consecutivos y la longitud del número. Por ejemplo, 169 es un número de 3 dígitos que contiene 4 números cuadrados (1, 9, 16, 169) y, por lo tanto, tiene una densidad de dígitos de 4/3 o 1,33. El número de 4 dígitos 1444 tiene 6 cuadrados (1, 4, 4, 4, 144, 1444) y, por lo tanto, una relación de 6/4 o 1.5. Observe en el ejemplo anterior que los cuadrados pueden repetirse. Además, 441 no está permitido, porque no se puede encontrar consecutivamente dentro del número 1444.
Su tarea es escribir un programa que busque un rango dado A - B (inclusive) para el número con la mayor densidad de dígitos del número cuadrado. Su programa debe cumplir con las siguientes especificaciones:
- Tome la entrada A, B en el rango de 1 a 1,000,000,000 (1 billón). Ejemplo:
sndd 50 1000
- Devuelve como resultado el número con el mayor SNDD. En caso de empate, devuelva el número más pequeño.
- 0 no cuenta como un cuadrado en ninguna forma, 0, 00, 000, etc. Tampoco los cuadrados que comienzan con 0, como 049 o 0049.
- Tenga en cuenta que el número completo no tiene que ser un número cuadrado.
Ejemplos:
sndd 14000 15000
Output: 14441
sndd 300 500
Output: 441
Bonificación: ¿Cuál es el número con el mayor SNDD entre 1 y 1,000,000,000? ¿Puede probar si este es el más grande posible o si podría haber uno más grande en un rango más alto?
Puntuaciones actuales:
- Rubí: 142
- Windows PowerShell: 153
- Scala: 222
- Python: 245
Ahora que se ha seleccionado una respuesta, aquí está mi implementación de referencia (sin golf) en JavaScript: http://jsfiddle.net/ywc25/2/
fuente
$ ruby1.9 sndd.rb 14000 15000 => 14441
.x[0]>?0
comprueba los cuadrados que comienzan con 0.ruby sndd.rb 14000 15000
desde Windows, obtuve 14000.?0
es un Fixnum, mientras que en Ruby 1.8 es una cadena, por lo que la comparación que mencioné tiene un significado diferente dependiendo de la versión de Ruby (en realidad debería arrojar una excepción en 1.8). Es por eso que mencioné explícitamente la versión 1.9 en el título.Respondiendo al bono: el mejor puntaje para los números <1e9 es 5/3 = 1.666 ..., generado por 144411449 (¿y quizás otros?).
Pero puedes hacerlo mejor con números más grandes. En general, si n tiene una puntuación de x, puede concatenar dos copias de n y obtener la misma puntuación x. Si tiene suerte yn tiene el mismo primer y último dígito, puede colocar uno de esos dígitos en la concatenación y mejorar su puntaje ligeramente (uno menos del doble del número de cuadrados y otro menos del doble del número de dígitos) .
n = 11449441 tiene un puntaje de 1.625 y tiene el mismo primer y último dígito. Usando ese hecho, obtenemos la siguiente secuencia de puntajes:
que proporciona una secuencia infinita de números que son estrictamente (aunque de manera decreciente) mejores que los números anteriores, y todos menos los primeros 2 son mejores que la mejor puntuación para los números <1e9.
Sin embargo, esta secuencia puede no ser la mejor en general. Converge en un puntaje finito (12/7 = 1.714) y puede haber otros números con mejores puntajes que el límite.
Editar : una secuencia mejor, converge a 1.75
fuente
Windows PowerShell, 153
154155164174Gracias a Ventero por una reducción de un byte, fui demasiado estúpido para encontrarme.
Versión de 154 bytes explicada:
fuente
Python, 245
256Esto podría ser mucho más corto si el rango se leyera en
stdin
lugar de los argumentos de la línea de comando.Editar:
Con respecto a la bonificación, mis experimentos sugieren lo siguiente:
Conjetura 1 . Por cada n ∈ ℕ , el número en ℕ ≤ n con el SNDD más grande debe contener únicamente los dígitos 1, 4 y 9.
Conjetura 2. ∃ n ∈ ℕ ∀ i ∈ ℕ ≥ n : SNDD ( n ) ≥ SNDD ( i ).
Bosquejo de prueba . El conjunto de cuadrados con los dígitos 1, 4 y 9 son probablemente finitos . ∎
fuente
range(*map(int,sys.argv[1:]))
Scala, 222
(Se requiere Scala 2.9.)
fuente
Teniendo en cuenta la pregunta adicional: fuera del rango, el SNDD más alto posible es infinito.
Al menos, si leo la pregunta correctamente, un cuadrado como 100 (10 * 10) sí cuenta.
Si considera el número 275625, el puntaje es 5/6, ya que 25, 625, 5625, 75625 y 275625 son todos cuadrados.
Sumar 2 ceros da: 27562500, que tiene una puntuación de 10/8. El límite de esta secuencia es 5/2 = 2.5
En la misma línea, puedes encontrar cuadrados que terminan en cualquier número de cuadrados más pequeños deseados. Puedo probar esto, pero probablemente entiendes la idea.
Es cierto que esta no es una solución muy buena, pero demuestra que no hay límite superior para el SNDD.
fuente
Clojure - 185 caracteres
Probablemente podría optimizarse aún más, pero aquí va:
Utilizado como una función con dos parámetros:
fuente
Jelly , 21 bytes, desafío de postdates de idioma
Pruébalo en línea!
Explicación
Función auxiliar (calcula la densidad de dígitos de su entrada):
Programa principal:
Podría decirse que el programa es más interesante sin el
Ḣ
, de esa manera, devuelve todos los números de densidad máxima en lugar de solo uno, pero lo agregué para cumplir con la especificación.fuente