Certains nombres tels que: 6, 12, 20, 30, 42, 56, 60, 90, 120 et ainsi de suite peuvent être exprimés comme un produit de nombres entiers consécutifs comme indiqué ci-dessous.
6 = 2 * 3
12 = 3 * 4
30 = 5 * 6
60 = 3 * 4 * 5
90 = 9 * 10
120 = 4 * 5 * 6
Écrivez un programme ou une fonction qui génère une liste d'entiers consécutifs dont le produit est égal au nombre spécifié.
Voici des exemples de nombres qui ne conviennent pas à cette logique:
99 = 9 * 11 (Product of non-consecutive numbers)
121 = 11 * 11 (Same numbers)
2 = 1 * 2 (Product of itself and 1)
13 = 13 (Product of only one number)
Veuillez noter que dans le cas de 2 = 2 * 1
, nous ne le considérons pas comme un résultat valide, car un entier multiplié par 1 donne le même résultat. Pour cette question, nous considérons uniquement les entiers> = 2 dans le produit.
Contribution
Un entier positif 32 bits valide. Peut provenir d'une entrée standard, d'un argument de fonction, etc.
Production
Une liste de nombres entiers consécutifs> = 2 (dans l'ordre croissant ou décroissant). S'il y a plusieurs combinaisons d'entiers consécutifs, il suffit d'en fournir un instance. Si vous fournissez plus, c'est bien.
Restrictions
Le code doit prendre un temps raisonnable (<5 minutes) pour s'exécuter sur un ordinateur standard pour toutes les entrées valides (entiers 32 bits positifs). S'il existe un produit entier consécutif, le code doit en afficher un ou plusieurs dans le délai imparti. Sinon, le code doit se terminer sans sortie dans le délai imparti.
Il s'agit du code golf, donc le code le plus court en octets l'emporte.
30=5*6
.Réponses:
Java - 124
À partir de 2, cela boucle jusqu'à ce que le numéro de départ soit> la racine carrée de la cible (ou que la cible soit atteinte exactement). Si le produit est faible, il multiplie par le nombre élevé et l'incrémente. S'il est élevé, il divise par le nombre de départ et l'incrémente.
Par exemple, pour 30, il vérifierait:
Génère une chaîne de facteurs séparés par des espaces dans l'ordre croissant.
Avec des sauts de ligne:
la source
Python -
104 97 9592 l' essayerS'il
n
est, par exemple, réglé à 120 au préalable, le programme génère les deux solutions:la source
+=
. Mais je manque++
en Python ...if s>=n
etif s/n
sont équivalents, vous pouvez donc fournir toutes les solutions dans le même nombre de caractères.s=s*(i+c)
pours*=i+c
.Clojure -
127109octetsExemple:
Explication:
Il s'agit d'une approche fonctionnelle de base, peu optimisée. Je crée une liste paresseuse de toutes les possibilités en utilisant une simple boucle sur elles (cela saute toutes les combinaisons qui donneraient des nombres trop grands, empêchant le débordement) et prends la première d'entre elles. Si aucune possibilité n'existe, elle renvoie zéro.
Le plus facile à tester sur http://tryclj.com/ .
J'ai également remarqué que je peux retourner toutes les possibilités:
120 octets102 octets , mais donne des résultats dans une liste imbriquée.Exemple:
la source
CJam, 31 octets
C'est une approche par force brute, mais le temps d'exécution n'est que de quelques secondes en utilisant le interpréteur Java officiel .
Si vous souhaitez tester le code à l'aide de l' interpréteur en ligne , vous devez garder l'entrée assez faible. Tout ce qui est inférieur à 2 26 fonctionne toujours sur ma machine.
Exemples
Comment ça fonctionne
la source
Java, 162
renvoie un tableau d'entiers, ou
null
s'il n'existe aucun nombre consécutif.non golfé:
la source
C 105
110essayer144 avec bonus: celui-ci parcourt chaque numéro et trouve les produits correspondants
la source
k < n
devient trop élevée à cause dek *= l++
. je pourrais ajouter longtemps non signé au début mais ... cela ruinerait des viesPHP 258 caractères, 201 sans compter la fonction factorielle.
La façon la plus simple d'exprimer mathématiquement "des facteurs consécutifs qui égalent un nombre" est
X!/Y!
OùX
est le nombre le plus élevé etY
le plus petit moins. Malheureusement, j'ai arrêté de prendre le calcul avant d'apprendre à résoudreZ = X!/Y!
, j'ai donc dû le forcer un peu.Version désordonnée et non golfée:
Exemple de sortie:
Golfé:
Production:
Je ne m'attendais pas à ce que le temps d'exécution soit aussi rapide!
la source
Pyth , 35
Remarque: Mon code trouve en fait la représentation la plus courte de l'entrée en tant que représentation d'entiers consécutifs> = 2, donc sur une entrée non valide, il imprimera une liste de 1 élément, éventuellement après un très long temps. Étant donné que l'énoncé du problème indique que l'entrée sera valide, je suppose que cela est OK.
Brève explication:
Essentiellement, le programme stocke les limites supérieure et inférieure d'une plage, calcule le produit des nombres dans la plage à l'aide d'une réduction, ajuste les points de terminaison selon les besoins et répète jusqu'à ce que le produit soit égal à l'entrée.
Explication longue:
Pour chaque extrait de code, je donnerai un python équivalent, ainsi qu'une explication et un raisonnement plus détaillés.
Jvw
=>J=eval(input())
Manière standard de saisir des données en Pyth.
Kr2 4
=>K=range(2,4)
=>K=[2,3]
Voici la première partie bizarre: au lieu de stocker les points de terminaison en tant que variables distinctes, je les stocke en tant qu'éléments d'une liste. La raison sera bientôt claire. De plus, au lieu de faire une simple affectation, qui en Pyth serait
K[2 3)
, j'utilise une plage pour enregistrer un caractère.W-ZJ
=>while Z-J
=>while Z!=J
À ce stade, vous pourriez demander: "Qu'est-ce que Z? Vous ne l'avez pas défini." En Pyth, toutes les variables sont prédéfinies. Il se trouve que Z commence par 0. Cependant, Z sera défini sur la valeur du produit plus tard, donc cette vérification servira à mettre fin à la boucle while une fois que la liste est à la valeur correcte.
~@K>JZ1
=>K[J>Z] += 1
Voici pourquoi je stocke les valeurs dans une liste, pas dans des variables distinctes: je veux incrémenter l'un des deux points de terminaison, selon que le produit est actuellement trop élevé ou trop bas. Ce serait une condition assez longue si les points de terminaison étaient des variables distinctes, mais avec la magie de l'indexation de liste, cela devient court. De plus, le fait que cette vérification précède le produit et le fait que Z soit initialisé à 0 garantissent que K le sera
[2,4]
au moment où nous prenons le produit pour la première fois, qui sont les points finaux appropriés.=YurGHK
=>Y=reduce(lambda G,H: range(G,H),K)
=>Y=range(K[0],K[1])
Maintenant, j'ai besoin de la liste réelle que le produit sera repris, et qui sera imprimée si nous réussissons. De toute évidence, nous utiliserons une fonction de plage. L'astuce réside dans l'obtention des entrées de la fonction range. La façon évidente de le faire, en indexant la liste, serait
=Yr'K@K1
. Cependant, en utilisant une fonction de réduction sur cette liste de deux éléments, nous pouvons raccourcir celle-ci par un caractère.=Zu*NTY
=>Z=reduce(lambda N,T: N*T,Y)
Et maintenant, pour tout le point de cette affaire, l'opération de réduction pour trouver le produit de la liste.
)
=> Fin pendantY
=>print(Y)
En cas de succès, imprimez la liste.
Exemple d'exécution:
la source
Java - 115
Un peu moins golfé:
la source
System.out.println
au golfSystem.out.print
et le point-virgule à la finfor(int k=1,x=j;(x*=j+k)<i;k++)
n'est pas seulement inutile, mais provoque également des erreurs.x
,j
,k
Sont hors de portée dans les derniersif/for
blocs en raison d'un;
. Si je supprime le;
, il n'imprime rien.print
signifierait qu'il doit ajouter un caractère blanc pour éviter que les nombres ne fonctionnent ensemble.Matlab (88)
Le code s'attend à ce que le nombre soit stocké
x
et sortil
.Étant donné que
13! > 2^32
ce code recherche uniquement les produits de longueur 2 jusqu'à 12. Ce code a un temps d'exécution constant d'environ 0,001 s.la source
Scala - 86
Ce code est très inefficace mais l'optimiser ne ferait qu'ajouter quelques caractères supplémentaires. Il utilise une approche fonctionnelle pour vérifier les produits de toutes les séquences consécutives possibles. (une séquence consécutive d'entiers est représentée comme un objet Range dans Scala)
non golfé:
la source
CJam ne fonctionne pas actuellement pour les grands nombres en raison du temps de calcul long
Ceci est mon code CJam le plus court. Testez à http://cjam.aditsu.net/ . Il fonctionne en: définissant l'entrée comme A; créer un tableau de tous les nombres de 0 à A-1; Coup de pied 0; botter les plus petits nombres jusqu'à ce que la multiplication de tous les nombres du tableau ne soit pas supérieur à A; vérifier s'il est supérieur à A; sinon, créer un tableau de 0 à A-2; et répéter jusqu'à ce que la réponse soit trouvée. Si aucun n'est trouvé, une exception est levée. Je ne considérais pas que des espaces entre les nombres étaient nécessaires, ils sont donc inclus dans le deuxième code de 32 caractères.
la source
Fléchette - 102 caractères
Il s'agit d'une implémentation lente. Cela peut être fait plus rapidement mais cela nécessite plus de caractères (comme faire la boucle seulement jusqu'à
i*i<n
)(Les 102 caractères sont sans les sauts de ligne et les espaces de début).
Pour l'utiliser, faites quelque chose comme:
la source
Javascript, 88
Code golf:
Code plus facile à lire (bien espacé):
Pour chaque nombre de 2 au numéro d'entrée, il trouve le produit d'entiers consécutifs du nombre actuel jusqu'à 2. Si ce produit est égal au numéro d'entrée, la série de nombres consécutifs, ainsi que le numéro d'entrée d'origine, est sortie .
Il sort le numéro d'entrée suivi des entiers consécutifs dont le produit est le numéro d'entrée.
Par exemple, f (120) produit une alerte avec le texte "120,5,4,3,2" puis une deuxième alerte avec le texte "120,6,5,4".
la source