La formule
Prenez par exemple le nombre 300
- Les facteurs premiers de 300 sont
[2, 3, 5]
(les nombres uniques qui sont des facteurs de 300 et premiers) - La mise au carré de chacun de ces nombres vous donnera
[4, 9, 25]
- La sommation de cette liste vous donnera
4 + 9 + 25 = 38
- Enfin soustrayez cette somme (38) de votre nombre d'origine
300-38 = 262
(c'est le résultat)
Contribution
Votre entrée sera un entier positif supérieur à 2. Vous devez vérifier tous les nombres de 2 à la valeur d'entrée (incluse) et trouver le nombre qui produit le meilleur résultat avec la formule ci-dessus.
Production
Votre sortie sera composée de deux nombres séparés par un espace, une virgule, un retour à la ligne ou tout ce que votre langue permet (la séparation est nécessaire pour distinguer les deux nombres). Ceux-ci peuvent être exportés vers un fichier, une sortie standard ou tout ce que votre langue utilise. Votre objectif est de trouver le nombre dans la plage qui produit la sortie maximale lors de l'exécution de la formule ci-dessus. Le premier nombre affiché doit être le nombre de départ (comme 300) et le deuxième nombre doit être la sortie produite par la formule (comme 262)
Cas de test
Input: 3 Output: 2, -2
Input: 10 Output: 8, 4
Input: 50 Output: 48, 35
Input: 1000 Output: 1000, 971
Input: 9999 Output: 9984, 9802
Exemple travaillé
Considérez l'entrée de 10, nous devons exécuter la formule pour tous les nombres de 2 à 10 (inclus)
Num PrimeFacs PrimeFacs^2 SumPrimeFacs^2 Result
2 [2] [4] 4 -2
3 [3] [9] 9 -6
4 [2] [4] 4 0
5 [5] [25] 25 -20
6 [2, 3] [4, 9] 13 -7
7 [7] [49] 49 -42
8 [2] [4] 4 4
9 [3] [9] 9 0
10 [2, 5] [4, 25] 29 -19
Comme vous pouvez le voir, le meilleur résultat est le 4
résultat de la saisie de la valeur 8
dans la formule. Cela signifie que la sortie d'une entrée de 10
doit être8, 4
Notation et règles
Les règles par défaut pour les entrées et sorties s'appliquent: Par défaut pour Code Golf: Méthodes d'entrée / sortie
Les failles standard sont interdites: Les failles interdites par défaut
Les soumissions peuvent être des fonctions ou des programmes complets
Le code le plus court en octets gagne
50
:35, 48
?Réponses:
Pyth,
1715 octetsSuite de tests.
la source
Java 8 lambda,
247239233225224219198161 caractèresJe pensais que cela devait être possible en moins de 300 caractères car ... vous savez ... Java!
Et c'est en effet possible même en moins de 200 caractères!
Je ne sais pas si cette utilisation des importations est légitime, mais je suppose qu'elle devrait être acceptable.Voici le lambda non golfé dans une classe:La découverte du facteur principal est basée sur cette réponse . Le code utilise la fonctionnalité des ensembles car ils n'enregistrent chaque valeur qu'une seule fois, donc je n'ai pas à me soucier des doublons ajoutés plus tard. Le reste du code est assez simple, juste après la question.
Mises à jour
Suppression de la nouvelle ligne de la sortie.
Merci à @ogregoire d'avoir joué au Integer.MIN_VALUE au 1 << 31!
Après avoir regardé à nouveau le code, j'ai trouvé d'autres endroits où jouer.
Merci à @Blue pour l'astuce == 0 à <1!
Suppression de certains espaces restants. De plus, pour la séparation, un seul caractère est nécessaire, donc pas besoin de gaspiller un caractère.
Merci encore à @ogregoire d'avoir souligné que je peux retourner la valeur au lieu de l'imprimer et de rassembler les déclarations! Cela a sauvé beaucoup!
Découvert, je peux utiliser un ternaire au lieu du second si pour enregistrer un autre caractère.
Merci à @AstronDan pour l' utilisation impressionnante d'un tableau qui enregistre l'importation. Cela m'a également donné la possibilité de raccourcir le premier si en ternaire.
la source
Integer.MIN_VALUE
peut être raccourci comme1<<31
.int
s au même endroit pour éviter de les répéterint
plusieurs fois et attribuez-leur leur valeur si possible.System.out.println(...)
et retournez une valeur au lieu de l'imprimer: comme le mentionne OP, la méthode d'E / S standard est utilisée.En fait, 21 octets
Essayez-le en ligne!
Explication:
la source
Actually Programming Language
et je n'ai rien trouvé même après avoir parcouru la 5ème page des résultats de google. Quel est ce langage?MATL , 18 octets
Essayez-le en ligne!
Le dernier cas prend trop de temps pour le compilateur en ligne, mais il produit le résultat correct (cela prend environ 11 secondes sur mon ordinateur, fonctionnant sur Matlab):
Explication
Application simple de la procédure décrite.
la source
C #, 194 octets
Mon premier Code Golf :). J'ai utilisé ma langue préférée malgré sa verbosité. J'ai commencé cela comme un port de fonction C # de Java de @ Frozn, mais j'ai trouvé plusieurs façons de réduire davantage le code avec des optimisations.
Celui-ci utilise un tableau pour stocker les facteurs premiers. Parce qu'il est indexé par le facteur, il remplacera les facteurs répétés par des copies du facteur. Cela permet à la fonction de n'avoir aucune importation. Cela ne nécessite même pas de système.
la source
Utilitaires Bash + GNU, 74
seq
génère tous les entiers 2 à nfactor
donne le nombre suivi de deux points, puis une liste séparée par des espaces de tous les facteurs premiers, y compris les doublons. Par exemple, le résultat pour 12 est12: 2 2 3
sed
supprime les deux points et les facteurs en double, puis génère l'expression arithmétique requise. par exemple pour 12:12- 2* 2- 3* 3
bc
évalue celanl
préfixes n de retour (à partir de 2)sort
par la deuxième colonne, numériquement, par ordre décroissantseq
imprime la première ligne et quitte.Ideone.
la source
Brachylog , 48 octets
Explication
la source
Gelée , 13 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça fonctionne
la source
05AB1E,
191716 octetsCode:
Explication:
Essayez-le en ligne
la source
Julia, 56 octets
Essayez-le en ligne!
Comment ça fonctionne
Étant donné une entrée n , pour chaque entier k tel que 2 ≤ k ≤ n , nous générons le tuple (f (k), k) , où f (k) est la différence entre k et la somme des carrés de ses facteurs premiers .
f (k) lui-même est calculé avec
k-sumabs2(k|>factor|>keys)
, qui factorise k en un Dict de clés premières et de valeurs d'exposant, extrait toutes les clés (facteurs premiers), prend la somme de leurs carrés et soustrait l'entier résultant de k .Enfin, nous prenons le maximum lexicographique des tuples générés et l'inversons en y accédant aux indices 2 et 1 .
la source
Clojure, 215 octets
Suit juste les règles. Calcule les facteurs premiers de chaque nombre, les met au carré et les additionne. Après cela, générez une liste de vecteurs de 2 éléments: le nombre initial et son résultat et trouvez l'élément avec la valeur maximale du deuxième élément.
Vous pouvez le voir en ligne ici: https://ideone.com/1J9i0y
la source
R 109 octets
J'ai triché et utilisé un paquet,
gmp
.la source
CJam, 32 octets
Essayez-le en ligne!
la source
Pyke, 17 octets
Essayez-le ici!
la source
PowerShell v2 +,
124120117 octetsLa première ligne calcule les valeurs, la seconde est juste sortie.
Nous commençons par créer une plage allant
2
jusqu'à notre argument de ligne de commande$args[0]
et bouclons cela|%{...}
. Pour chaque boucle, nous définissons des variables d'assistance égales à notre valeur actuelle avec$y=$z=$_
. Nous parcourons ensuite chaque numéro2
jusqu'à notre numéro actuel. Chaque boucle intérieure, nous vérifions si ce nombre est un diviseur!($z%$_)
et s'il est premier('1'*$_-match'^(?!(..+)\1+$)..')
, et si c'est les deux, nous soustrayons le carré de$y
(les vérifications sont effectuées en utilisant la multiplication booléenne).Une fois que nous avons parcouru tous les diviseurs premiers et soustrait les carrés, si le nombre restant est le plus grand que nous ayons vu jusqu'à présent
$y-gt$o
, nous définissons nos variables de sortie$o=$y;$p=$_
. Après avoir parcouru toute la gamme, nous sortons simplement avec un espace entre les deux.la source
Haskell, 91 octets
Exemple d'utilisation:
f 50
->[48,35]
.Les fonctions de facteur premier sont disponibles uniquement via
import Data.Numbers.Primes
ce qui coûte trop d'octets, donc j'utilise le vérificateur principal de @ Lynn . Le reste est simple: pour l' entrée enm
boucle àn
travers[2..m]
et dans une boucle interne àp
travers[2..n]
. Gardez tout cep
qui est premier et divisezn
, carré et somme.la source
Python 2,
108105100 octetsTestez-le sur Ideone .
la source
JavaScript (ES6),
111105 octetsJe ne sais pas pourquoi je ne pensais pas à le faire récursivement auparavant.
la source
J, 44 octets
Approche directe. Renvoie également toutes les valeurs de
n
ce résultat dans une valeur maximale.Usage
la source