Votre travail consiste à reconvertir les décimales en la somme des racines carrées d'entiers. Le résultat doit avoir une précision d'au moins 6 chiffres décimaux significatifs.
Contribution :
Un nombre indiquant le nombre de racines carrées et une décimale indiquant le nombre à approximer.
Exemple d'entrée:
2 3.414213562373095
Sortie : Entiers séparés par des espaces qui, lorsqu'ils sont enracinés au carré et ajoutés, ont approximativement la décimale d'origine précise à au moins 6 chiffres décimaux significatifs.
Les zéros ne sont pas autorisés dans la solution.
S'il existe plusieurs solutions, il vous suffit d'en imprimer une.
Exemple de sortie (dans n'importe quel ordre):
4 2
Cela fonctionne parce que Math.sqrt(4) + Math.sqrt(2) == 3.414213562373095
.
C'est le golf de code. Le code le plus court (avec bonus en option) gagne!
Il y aura toujours une solution mais -10 si votre programme affiche "Non" quand il n'y a pas de solution avec des entiers. De plus, -10 si votre programme imprime toutes les solutions (séparées par des retours à la ligne ou des points-virgules ou autre) au lieu d'une seule.
Cas de test:
3 7.923668178593959 --> 6 7 8
2 2.8284271247461903 --> 2 2
5 5.0 --> 1 1 1 1 1
5 13.0 --> 4 4 9 9 9 --> 81 1 1 1 1 --> 36 9 4 1 1 etc. [print any, but print all for the "all solutions bonus"]
Et oui, votre programme doit se terminer en temps fini en utilisant la mémoire finie sur n'importe quelle machine raisonnable. Cela ne peut pas simplement fonctionner "en théorie", vous devez pouvoir le tester.
la source
6 7 8
pour le deuxième bonus?Réponses:
Python 3, 90 - 10 = 80
(Méga merci à @xnor pour des conseils, en particulier la restructuration de la boucle for en un moment)
Une tentative récursive simple. Il commence par le nombre cible et soustrait continuellement les racines carrées jusqu'à ce qu'il atteigne 0 ou moins. La fonction
S
peut être appelée commeS(2,3.414213562373095)
(le deuxième argument est supposé positif).Le programme n'imprime pas seulement toutes les solutions, il imprime toutes les permutations de solutions (un peu étrangères, je sais). Voici la sortie pour le dernier cas: Pastebin .
Un léger ajustement donne une solution 98 - 10 = 88 qui n'imprime pas les permutations, ce qui la rend plus efficace:
Et juste pour le plaisir, ce 99-10 = 89 est à peu près aussi efficace que possible (contrairement aux autres, il ne fait pas exploser la pile
S(1,1000)
:Notez que, bien que nous ayons un argument par défaut modifiable, cela ne pose jamais de problème si nous réexécutons la fonction car
n+[i]
crée une nouvelle liste.Preuve d'exactitude
Afin de se retrouver dans une boucle infinie, nous devons atteindre un point où x <0 et 0,1 + x 2 > 1 . Ceci est satisfait par x <-0,948 ... .
Mais notons que nous partons de x positifs et que x diminue toujours, donc pour atteindre x <-0,948 ... nous devons avoir eu x '- i 0,5 <-0,948 ... pour certains x'> -0,948 .. . devant x et nombre entier positif i . Pour que la boucle while s'exécute, nous devons également avoir eu 0,1 + x ' 2 > i .
En réarrangeant, nous obtenons x ' 2 + 1,897x' + 0,948 <i <0,1 + x ' 2 , les parties extérieures impliquant que x' <-0,447 . Mais si -0,948 <x '<-0,447 , alors aucun entier positif i ne peut combler l'écart dans l'inégalité ci-dessus.
Par conséquent, nous ne nous retrouverons jamais dans une boucle infinie.
la source
abs
avecx*x<1e-12
.while
boucle fonctionne pour remplacer lefor
:while.1+x*x>i:S(x-i**.5,n+[i]);i+=1
après avoir initialiséi=1
dans les paramètres de la fonction. L'idée est d'éviter d'avoir à se convertir à l'int
art. Le.1
est de gérer les inexactitudes de flotteur; Je pense que c'est sûr contre les boucles infinies.N
maintenant un argument de fonction, il est plus court de récapitulerN-1
et de vérifier quandN==0
plutôt quelen(n)==N
..1
est sûr; Je peux vous discuter d'un argument si vous le souhaitez.ECLiPSe Prolog - 118 (138-20)
J'ai utilisé l'implémentation suivante de Prolog: http://eclipseclp.org/
Il s'agit d'une approche exponentielle très naïve. La liste de toutes les solutions possibles prend du temps pour couvrir toutes les combinaisons ( édition : la plage des nombres entiers visités diminue désormais à chaque étape, ce qui supprime beaucoup de combinaisons inutiles).
Voici une transcription d'une session de test. Par défaut, l'environnement essaiera de trouver toutes les solutions possibles (-10) et affichera "Non" s'il échoue (-10).
Comme Sp3000 l'a correctement noté dans le commentaire, il affiche également "Oui" lorsqu'il réussit. Cela signifie sûrement que je peux supprimer 10 points supplémentaires ;-)
(Edit) Concernant les performances, elles sont assez bonnes, du moins par rapport aux autres (voir par exemple ce commentaire de FryAmTheEggman ). Tout d'abord, si vous souhaitez imprimer tous les résultats, ajoutez le prédicat suivant:
Voir http://pastebin.com/ugjfEHpw pour le cas (5,13.0), qui se termine en 0,24 seconde et trouve 495 solutions (mais peut-être que je manque des solutions, je ne sais pas).
la source
Erlang,
305-10302-10Cette fonction renvoie la chaîne "Non" ou une chaîne avec des valeurs séparées par des espaces. Il (inefficacement) traite toutes les valeurs possibles en les encodant en un grand entier, et en commençant par des valeurs plus élevées. 0 n'est pas autorisé dans la solution, et 0 codé représente tous les uns. L'erreur est quadrillée.
Exemple:
Veuillez être patient avec
f(5,13.0)
comme espace de recherche de fonction est 13 ^ 10. Il peut être rendu plus rapide avec 2 octets supplémentaires.la source
Python
32:173159 - 10 = 149Explication: Chaque solution est de la forme x_1 x_2 ... x_n avec 1 <= x_1 <= x ^ 2 où x est la somme cible. Par conséquent, nous pouvons coder chaque solution sous forme d'entier dans la base x ^ 2. La boucle while itère sur toutes les (x ^ 2) ^ n possibilités. Ensuite, je reconvertis l'entier et teste la somme. Assez simple.
Il trouve toutes les solutions, mais le dernier cas de test prend beaucoup trop de temps.
la source
JavaScript (ES6) 162 (172-10)
173Edit Un peu plus court, un peu plus lent.
En tant que fonction avec 2 paramètres, sortie vers la console javascript. Cela imprime toutes les solutions sans répétitions (les tuples de solutions sont générés déjà triés).
Je me souciais plus du timing que du nombre de caractères, afin qu'il soit facilement testé dans une console de navigateur dans le délai standard javascript.
(Mise à jour de février 2016) Heure actuelle du dernier scénario de test: environ 1
150 secondes. Besoins en mémoire: négligeable.Version ES 5 N'importe quel navigateur
Extrait de test, il doit s'exécuter sur n'importe quel navigateur récent
( Modifier ) Vous trouverez ci-dessous le résultat sur mon PC lorsque j'ai posté cette réponse il y a 15 mois. J'ai essayé aujourd'hui et c'est 100 fois plus rapide sur le même PC, juste avec une version alpha 64 bits de Firefox (et Chrome est loin derrière)! - heure actuelle avec Firefox 40 Alpha 64 bits: ~ 2 sec, Chrome 48: ~ 29 sec
Sortie (sur mon PC - dernier numéro est temps d' exécution en millisecondes)
la source
Mathematica - 76-20 = 56
Exemples
la source
No
? De plus, la sortie n'est pas séparée par des espaces. De plus, ne pouvez-vous pas utiliser à laTr@
place dePlus@@
? Et vous pourriez être en mesure d'enregistrer certains caractères en changeantSelect
enCases
, la fonction à la fin d'un modèle et en créantf
une fonction pure sans nom.Haskell,
8780-10 = 70Il s'agit d'un algorithme récursif similaire au programme Python 3 de @ Sp3000. Il se compose d'une fonction infixe
#
qui renvoie une liste de toutes les permutations de toutes les solutions.Avec un score de
102 9992 - 10 = 82 nous pouvons imprimer chaque solution une seule fois, triées:la source
Pyth
55 5447-20 = 27Essayez-le en ligne.
Effrontément emprunte de commentaire de xnor ;)
Cela manquera de mémoire sur n'importe quel ordinateur sain, même pour une valeur comme
5,5.0
. Définit une fonction,,g
qui peut être appelée commeg 3 7.923668178593959
.Ce programme python 3 utilise essentiellement le même algorithme (ne fait tout simplement pas l'impression "Non" à la fin, ce qui pourrait être fait en affectant une variable à tous les résultats, puis en écrivant
print(K if K else "No")
), mais utilise un générateur, donc il ne fonctionne pas " t obtenir une erreur de mémoire (cela prendra encore très longtemps, mais je l'ai fait imprimer car il trouve les valeurs):Cela a donné exactement les mêmes résultats que @ Sp3000. De plus, cela a pris plusieurs jours pour terminer (je ne l'ai pas chronométré, mais environ 72 heures).
la source
Python 3 -
157174169 169 - 10 = 159Edit1: modification du format de sortie en entiers séparés par des espaces au lieu de séparés par des virgules. Merci pour le conseil de retirer les accolades autour (n, x).
Edit2: Merci pour les conseils de golf! Je peux couper 9 autres caractères si j'utilise simplement un test == au lieu de tester l'égalité approximative à 1e-6, mais cela invaliderait les solutions approximatives, le cas échéant.
Utilise itertools pour générer toutes les combinaisons entières possibles, espérons-le efficacement :)
Je n'ai pas trouvé un moyen d'ajouter efficacement "Non" à l'impression, il semble toujours prendre plus de 10 caractères supplémentaires.
la source
n,x
.SyntaxError
eval
from itertools import*
enregistre 1, supprime l'espacez**.5for
économise 1, et supprime les[]
sum(z**.5for z in c)
()
if(...)
n,x=input()
seraient-elles plus compactes?Scala (397 octets - 10)
S'il n'y a pas de permutations, ce programme n'imprime rien.
la source