instructions
Écrivez un programme qui, étant donné un entier d'entrée n ( n >= 0
), sort le plus petit entier positif m où:
n = a[1]^b[1] + a[2]^b[2] + a[3]^b[3] + ... + a[k]^b[k]
a
etb
sont des séquences finies de la même longueur- tous les éléments de
a
sont inférieurs àm
- tous les éléments de
b
sont inférieurs àm
- tous les éléments de
a
sont différents et entiersa[x] >= 0
- tous les éléments de
b
sont différents et entiersb[x] >= 0
a[x]
etb[x]
ne sont pas tous les deux 0 (puisque 0 ^ 0 est indéterminé)
Il s'agit de code-golf , donc le moins d'octets gagne.
Exemples
In 0 -> Out 1
Possible Sum:
In 1 -> Out 2
Possible Sum: 1^0
In 2 -> Out 3
Possible Sum: 2^1
In 3 -> Out 3
Possible Sum: 2^1 + 1^0
In 6 -> Out 4
Possible Sum: 2^2 + 3^0 + 1^1
In 16 -> Out 5
Possible Sum: 2^4
In 17 -> Out 4
Possible Sum: 3^2 + 2^3
In 23 -> Out 6
Possible Sum: 5^1 + 3^0 + 2^4 + 1^3
In 24 -> Out 5
Possible Sum: 4^2 + 2^3
In 27 -> Out 4
Possible Sum: 3^3
In 330 -> Out 7
Possible Sum: 6^1 + 4^3 + 3^5 + 2^4 + 1^0
code-golf
number
arithmetic
kukac67
la source
la source
m<2
puism<3
alorsm<4
etc. jusqu'à ce que je trouve une somme égalen
. Aussi, j'ai pensé à ne pas avoir de somme0
, mais quelle est la sortie? m>?n = a[1]^b[1] + a[2]^b[2] + ... + a[k]^b[k]
.a
etb
sont des séquences finies de longueur0
, donc il n'y a pas d'entierm
qui ne satisfait pas aux contraintes, et comme il n'y a pas de plus petit entier, la réponse n'est pas définie. Les correctifs possibles seraient de demander le plus petit nombre naturelm
(auquel cas vous devriez y changer la réponse attendue0
) ou le plus petit entier positifm
.Réponses:
GolfScript (59 caractères)
Démo en ligne
Cela utilise la récursivité pour énumérer les valeurs réalisables pour une donnée
m
et recherche la premièrem
qui fonctionne. Il est légèrement inspiré par la réponse de xnor mais tout à fait différent dans la mise en œuvre.Dissection
la source
Python, 120
La fonction
f
est une fonction auxiliaire qui vérifie si elle nen
peut pas être exprimée comme une somme de puissances avec des bases distinctesA
et des exposants deB
. Il utilise une stratégie récursive naturelle:n
doit être différente de zéro, et nous essayons tous les choix possibles de base et d'exposant et ils doivent tous échouer. Nous les supprimons des listes autorisées et diminuonsn
du montant correspondant.La fonction
g
est la fonction principale. Il recherche unm
qui fonctionne.M
est l'ensemble des valeurs autorisées jusqu'àm-1
. Nous supprimons0
des exposants autorisés à arrêter0**0
(que Python évalue à 1) d'être utilisés. Cela ne fait rien de mal Parce que0**x
c'est inutile0
pour tous les autresx
.la source
n and all()
pourn*all()
.Python 2, 138 octets
(Merci à @Jakube pour tous les conseils)
Je n'ai jamais autant appris sur le
itertools
module que sur cette seule question. Le dernier cas prend environ une minute.Nous commençons par rechercher
m = 1
et incrémenter jusqu'à ce que nous obtenions une solution. Pour rechercher une solution, nous parcourons:k = 0 to m-1
, oùk
est le nombre de termes dans la solution[0, 1, ... m-1]
taillek
), puis en additionnant et en vérifiant si nous avonsn
Notez que nous répétons
k
jusqu'àm-1
- même si techniquement desm
termes sont possibles au total, il y a toujours une solution avec desm-1
termes comme cela0^0
n'est pas autorisé et0^b
ne contribue rien. C'est en fait important car il0^0
est traité comme 1 par Python, ce qui semble être un problème, mais cela n'a pas d'importance!Voici pourquoi.
Supposons qu'une solution trouvée utilise par erreur
0^0
comme 1, par exemple3^2 + 1^1 + 0^0 = 11
. Puisque nous ne générons que desm-1
termes, il doit y en avoir certains quej
nous n'utilisons pas comme base (icij = 2
). Nous pouvons échanger la base 0 pourj
obtenir une solution valide, ici3^2 + 1^1 + 2^0 = 11
.Si nous avions répété tous les
m
termes, alors nous aurions pu obtenir des solutions incorrectes commem = 2
pourn = 2
, via0^0 + 1^1 = 2
.la source
imap(pow,C,D) ... for C,D in
itertools
en ce moment: PI a déjà une autre économie -tee
.imap
-il quand il y en amap
? -1 octettee
est déjàn=2
. Enregistre 2 octets.map
avec plus d'un itérable, et en fait, cette question fait ressortir beaucoup de premières pour moi.GolfScript (
9084 octets)Démo en ligne
Dissection
L'astuce la plus élégante est la manipulation du boîtier spécial pour
0
.la source
Haskell,
143130Exemple d'utilisation:
p 23
->6
.Il s'agit d'une simple recherche par force brute. Pour chaque liste,
[0..0], [0..1], [0..2] ... [0..∞]
prenez tous les segments initiaux des permutations (par exemple [0..2]: permutations:,[012], [102], [210], [120], [201], [021]
segments initiaux pour la 1ère permutation:,[0], [01], [012]
2e:,[1], [10], [102]
etc.). Pour chaque combinaison de 2 de ces listes, calculez la somme des puissances. Arrêtez lorsque le premier est égal à n.la source
>>=
plutôt queconcatMap
. ce sont les mêmes, mais les arguments sont inversés.Python: 166 caractères
Explication
La fonction
f
crée tous les entiers possibles, qui peuvent être exprimés comme la somme des puissances des nombres dansr
. Si commence parr = [0]
. Si l'un de ces entiers est égal àn
, il renvoie la longueur der
, sinon il s'appelle récursivement avec un étendur
.Le calcul de tous les entiers, qui peuvent être exprimés en somme, se fait avec deux boucles. La première boucle est la
for j in r
, qui nous indique la longueur de l'expression (2 ^ 3 + 1 ^ 2 a la longueur 2). La boucle intérieure itère sur toutes les combinaisons de permutationsr
de longueurj
. Pour chacun, je calcule la somme des puissances.la source
JavaScript (ES6) 219
224Fonction récursive. En commençant par m = 1, j'essaie toutes les combinaisons d'entier 1..m pour les bases et 0..m pour les exposants (0 base est inutile étant donné 0 ^ 0 == indéfini).
Si aucune solution n'est trouvée, augmentez m et réessayez.
Cas particulier pour l'entrée 0 (à mon avis c'est quand même une erreur dans les spécifications)
La fonction C génère récursivement toutes les combinaisons à partir d'un tableau de longueur donnée, de sorte que
Le troisième niveau
every
est utilisé pour compresser ensemble le tableau a de bases et b d'exposants (il n'y a pas dezip
fonction en JavaScript). En utilisantevery
d'arrêter tôt lorsqu'il existe une solution n'utilisant pas tous les éléments des deux tableaux.Test dans la console FireFox / FireBug
Production
la source