La densité numérique des nombres carrés (SNDD) d'un nombre - inventé par moi-même - est le rapport entre le nombre de nombres carrés trouvés en chiffres consécutifs et la longueur du nombre. Par exemple, 169 est un nombre à 3 chiffres contenant 4 nombres carrés - 1, 9, 16, 169 - et a donc une densité de chiffres de nombre carré de 4/3, ou 1,33. Le nombre à 4 chiffres 1444 a 6 carrés - 1, 4, 4, 4, 144, 1444 - et donc un rapport de 6/4, ou 1,5. Notez dans l'exemple précédent que les carrés peuvent être répétés. En outre, 441 n'est pas autorisé, car il ne peut pas être trouvé consécutivement à l'intérieur du numéro 1444.
Votre tâche consiste à écrire un programme qui recherche dans une plage donnée A - B (inclus) le nombre ayant la densité de chiffres du nombre carré le plus élevé. Votre programme doit respecter les spécifications suivantes:
- Prenez l'entrée A, B dans la plage de 1 à 1 000 000 000 (1 milliard). Exemple:
sndd 50 1000
- Renvoyez en conséquence le nombre avec le plus grand SNDD. En cas d'égalité, renvoyez le plus petit nombre.
- 0 ne compte pas comme un carré sous quelque forme que ce soit, 0, 00, 000, etc. Pas plus que les carrés commençant par 0, comme 049 ou 0049.
- Notez que le nombre entier ne doit pas nécessairement être un nombre carré.
Exemples:
sndd 14000 15000
Output: 14441
sndd 300 500
Output: 441
Bonus: Quel est le nombre avec le plus grand SNDD entre 1 et 1 000 000 000? Pouvez-vous prouver si c'est le plus grand possible, ou s'il pourrait y en avoir un plus grand dans une gamme plus élevée?
Scores actuels:
- Rubis: 142
- Windows PowerShell: 153
- Scala: 222
- Python: 245
Maintenant qu'une réponse a été sélectionnée, voici mon implémentation de référence (non golfée) en JavaScript: http://jsfiddle.net/ywc25/2/
la source
$ ruby1.9 sndd.rb 14000 15000 => 14441
.x[0]>?0
vérifie les carrés commençant par 0.ruby sndd.rb 14000 15000
Windows, j'obtiens 14000.?0
est un Fixnum, alors que dans Ruby 1.8, c'est une chaîne, donc la comparaison que j'ai mentionnée a une signification différente selon la version de Ruby (en fait, elle devrait lever une exception dans 1.8). C'est pourquoi j'ai mentionné explicitement la version 1.9 dans le titre.Répondre au bonus: le meilleur score pour les nombres <1e9 est 5/3 = 1,666 ..., généré par 144411449 (et peut-être d'autres?).
Mais vous pouvez faire mieux avec de plus grands nombres. En général, si n a un score de x, vous pouvez concaténer deux copies de n et obtenir le même score x. Si vous êtes chanceux et que n a le même premier et dernier chiffre, vous pouvez supprimer l'un de ces chiffres dans la concaténation et améliorer légèrement votre score (un de moins du double du nombre de carrés et un de moins du double du nombre de chiffres) .
n = 11449441 a un score de 1,625 et a le même premier et dernier chiffre. En utilisant ce fait, nous obtenons la séquence de scores suivante:
ce qui donne une séquence infinie de nombres qui sont strictement (bien que de façon décroissante) meilleurs que les nombres précédents, et tous sauf les 2 premiers meilleurs que le meilleur score pour les nombres <1e9.
Cependant, cette séquence n'est peut-être pas la meilleure dans l'ensemble. Il converge vers un score fini (12/7 = 1,714) et il peut y avoir d'autres nombres avec de meilleurs scores que la limite.
Edit : une meilleure séquence, converge vers 1,75
la source
Windows PowerShell, 153
154155164174Merci à Ventero pour une réduction d'un octet j'étais trop stupide pour me retrouver.
Version de 154 octets expliquée:
la source
Python, 245
256Cela pourrait être beaucoup plus court si la plage était lue
stdin
par opposition aux arguments de la ligne de commande.Éditer:
En ce qui concerne le bonus, mes expériences suggèrent ce qui suit:
Conjecture 1 . Pour chaque n ∈ ℕ , le nombre dans ℕ ≤ n avec le plus grand SNDD doit contenir uniquement les chiffres 1, 4 et 9.
Conjecture 2. ∃ n ∈ ℕ ∀ i ∈ ℕ ≥ n : SNDD ( n ) ≥ SNDD ( i ).
Croquis de preuve . L'ensemble des carrés avec les chiffres 1, 4 et 9 est probablement fini . ∎
la source
range(*map(int,sys.argv[1:]))
Scala, 222
(Scala 2.9 requis.)
la source
Considérant la question bonus: en dehors de la plage, le SNDD le plus élevé possible est infini.
Au moins, si j'ai bien lu la question, un carré comme 100 (10 * 10) compte.
Si vous considérez le nombre 275625, le score est de 5/6, car 25, 625, 5625, 75625 et 275625 sont tous carrés.
L'ajout de 2 zéro donne: 27562500, qui a un score de 10/8. La limite de cette séquence est 5/2 = 2,5
Dans le même ordre d'idées, vous pouvez trouver des carrés qui se terminent par un nombre quelconque de petits carrés souhaités. Je peux le prouver, mais vous avez probablement compris l'idée.
Certes, ce n'est pas une très bonne solution, mais cela prouve qu'il n'y a pas de limite supérieure au SNDD.
la source
Clojure - 185 caractères
Pourrait probablement être optimisé davantage, mais voici:
Utilisé en fonction avec deux paramètres:
la source
Jelly , 21 octets, défi de postdates de langue
Essayez-le en ligne!
Explication
Fonction d'assistance (calcule la densité numérique de son entrée):
Programme principal:
Le programme est sans doute plus intéressant sans
Ḣ
- de cette façon, il renvoie tous les nombres à densité maximale plutôt qu'un seul - mais je l'ai ajouté pour se conformer à la spécification.la source