Étant donné un nombre n> 77 , écrivez un programme ou une fonction qui trouve un ensemble d' entiers positifs distincts tels que la somme de l'ensemble est égale à n et la somme des inverses de l'ensemble est égale à 1.
Exemple pour 80:
80 = 2 + 4 + 10 + 15 + 21 + 28 ⟶ 1/2 + 1/4 + 1/10 + 1/15 + 1/21 + 1/28 = 1
Votre programme ou fonction doit (théoriquement) fonctionner pour tout n <2 32 et n'est pas excusé pour les erreurs d'arrondi à virgule flottante. Notez que des solutions existent pour tous les n> 77 .
Le code le plus court en octets gagne.
Il y a un bonus incitatif: je vais attribuer une prime à la plus petite solution qui fonctionne pour n et exécute log (n) . Pour les petits n il doit être rapide (déterminé à ma discrétion). Oui, c'est possible.
O(log n)
algorithme.Réponses:
Mathematica, 54 octets
À peu près aussi inefficace que possible, mais il se résout
n = 78
en environ 9 secondes.Le résultat est renvoyé sous forme de liste enveloppée dans une liste singleton, par exemple:
la source
Python 3,
73061995 octetsCette solution fonctionne en complexité log (n) (pour autant que je sache).
Vous pouvez tester qui
f(2**32 - 1)
s'exécute presque instantanémentJ'ai utilisé cet article sur une méthode de calcul. Avec cette méthode, il y a une énorme quantité de données pour les valeurs prédéterminées pour n de 78 à 334 sans les nombres pairs après 168. Je voulais transformer ces données en quelque chose de petit et je ne connaissais pas de bons algorithmes de compression, donc j'ai fait le mien.
La façon dont je l'ai compressé était d'avoir une liste de règles de remplacement de chaîne. J'ai créé une méthode qui a trouvé la règle de remplacement de chaîne qui réduirait le plus de contenu en tenant compte de la définition de la règle. J'ai ensuite appliqué récursivement ceci jusqu'à ce que je ne puisse plus créer de règles (j'ai utilisé les caractères gz et AZ). La chaîne que j'ai créée pour remplacer était une liste séparée par des virgules des valeurs hexadécimales pour chacun des nombres. Rétrospectivement, les convertir en leurs valeurs hexadécimales n'a peut-être pas été le choix le plus sage, il serait probablement plus court de les laisser en décimal, car avoir hex ne sauverait que pour les nombres à 3 chiffres mais ajouterait un 0 pour les nombres à un chiffre.
La ligne où je mets c, vous pouvez voir la liste des règles de remplacement et le texte sur lequel il s'exécute. Les règles doivent également être appliquées en sens inverse, car certaines règles incluent des caractères créés à partir d'autres règles.
Il y a aussi de nombreux endroits dans ce code où je pourrais probablement réduire la syntaxe, comme transformer la liste des listes en une seule liste puis utiliser une méthode différente pour accéder aux règles pour remplacer le texte par
la source
n=218
les sorties[2]
sont-elles attendues ??Haskell, 93 octets
Horriblement lent 1 mais il fonctionne en mémoire constante. Solution triviale: vérifiez toutes les sous-séquences de
[2..n]
pour la somme et la somme des inverses.Renvoyer toutes les solutions au lieu d'une est 3 octets plus court: il suffit de supprimer le
!!0
(attention: le temps d'exécution sera toujours hors des graphiques).1 Le temps d'exécution dépend de la précocité du résultat dans la liste des sous-séquences. La paresse de Haskell arrête la recherche si la première correspondance est trouvée. Une fois compilé,
p 89
(résultat:)[3,4,6,9,18,21,28]
fonctionne sur mon ordinateur portable (âgé de 4 ans) en 35s. D'autres valeurs, même plus petites, peuvent prendre des heures.la source
Julia, 77 octets
Il s'agit d'une fonction lambda inefficace qui accepte un entier et renvoie un tableau d'entiers. Pour l'appeler, affectez-le à une variable.
Nous obtenons les partitions de l'entier en utilisant
partitions
. Nous filtrons ensuite l'ensemble des partitions uniquement pour celles avec des éléments uniques dont les réciproques sont égales à 1. Pour garantir qu'aucune erreur d'arrondi ne se produit, nous utilisons leRational
type de Julia pour construire les réciproques.filter
renvoie un itérateur, nous devons donc le placercollect
dans un tableau. Cela nous donne un tableau de tableaux (avec un seul élément), afin que nous puissions obtenir la première utilisation[1]
.Maintenant, quand je dis inefficace, je le pense. L'exécution de ceci pour n = 80 prend 39,113 secondes sur mon ordinateur et alloue 13,759 Go de mémoire.
la source