Votre défi consiste à trouver le nombre le plus fluide sur une plage donnée. En d’autres termes, recherchez le nombre dont le plus grand facteur premier est le plus petit.
Un nombre entier est un nombre dont le plus grand facteur premier est petit. Les nombres de ce type sont utiles pour l'algorithme de transformation rapide de Fourier, l'analyse cryptographique et d'autres applications.
Par exemple, sur l'intervalle 5, 6, 7, 8, 9, 10
, 8 est le nombre le plus régulier, car le plus grand facteur premier de 8 est 2, alors que tous les autres nombres ont un facteur premier égal ou supérieur à 3.
Entrée: L'entrée consistera en deux entiers positifs définissant une plage. Le nombre entier minimum autorisé dans la plage est 2. Vous pouvez choisir si la plage est inclusive, exclusive, semi-exclusive, etc., tant qu'une plage arbitraire peut être spécifiée dans les limites de votre langue. Vous pouvez prendre les nombres via une entrée de fonction, stdin, un argument de ligne de commande ou toute autre méthode équivalente pour votre langue. Aucune information supplémentaire d'encodage dans l'entrée.
Sortie: renvoyer, imprimer ou un ou plusieurs équivalents équivalents dans la plage d’entrée qui sont au maximum lisses (facteur le plus grand minimal). Le renvoi de plusieurs résultats est facultatif, mais si vous choisissez de le faire, les résultats doivent être clairement délimités. Le format de sortie natif convient pour plusieurs résultats.
Veuillez indiquer dans votre réponse comment vous prenez et donnez la sortie.
Scoring: code de golf. Compter en caractères si écrit en ASCII, ou 8 * octets / 7 si pas en ASCII.
Cas de test:
Remarque: Il s’agit de plages de style Python, incluant le bas de gamme mais pas le haut de gamme. Changer selon votre programme. Un seul résultat est nécessaire.
smooth_range(5,11)
8
smooth_range(9,16)
9, 12
smooth_range(9,17)
16
smooth_range(157, 249)
162, 192, 216, 243
smooth_range(2001, 2014)
2002
la source
Réponses:
CJam - 13
Essayez-le sur http://cjam.aditsu.net/
Exemple d'entrée:
2001 2014
Exemple de sortie:
2002
Explication:
q~
lit et évalue l'entrée, en poussant les 2 nombres de la pile (disons min et max),,
un tableau [0 1 ... max-1]>
coupe le tableau en commençant à min, ce qui donne [min ... max-1]{…}$
le tableau utilise le bloc pour calculer la clé de tri etmf
obtient un tableau avec tous les facteurs premiers d’un nombre, afin d’W=
obtenir le dernier élément du tableau (W = -1), obtenant ainsi le plus grand facteur premier à utiliser en tant que la clé de tri0=
récupère le premier élément du tableau (trié)la source
mfW
quelqu'un l'a résolu en 13 caractères.Regex ( saveur
.NETPCRE),183129 octetsN'essayez pas ca a la maison!
Ce n'est pas vraiment un candidat à la victoire. Mais Eric Tressler a suggéré de résoudre ce problème avec rien d'autre qu'une regex, et je n'ai pas pu résister à l'idée de tenter le coup. Cela est
peut-être aussipossible dans PCRE (et même plus court, voir ci-dessous), mais j’ai choisi .NET car ma solution nécessite des recherches arbitraires. Et c'est parti:L'entrée est codée comme une plage inclusive, séparée par des virgules, où les deux nombres sont donnés en notation unaire à l'aide de
1
s. La correspondance sera la finS
1 oùS
est le nombre le plus lisse de la plage. Les liens sont brisés en faveur du plus petit nombre.Ainsi, le deuxième exemple de la question serait la chaîne suivante (correspondance soulignée)
Il est basé sur la regex à vérification primaire (maintenant assez connue) , dont les variations sont intégrées 6 fois.
Voici une version utilisant des espaces libres et des commentaires pour ceux qui veulent savoir ce qui se passe.
Vous pouvez le tester en ligne ici . N'essayez pas trop d'entrées, je ne fais aucune garantie sur les performances de ce monstre.
Modifier:
J'ai fini par le porter sur PCRE (ce qui ne nécessite que deux étapes) et à raccourcir l'expression régulière d'un tiers. Voici la nouvelle version:
Ceci est essentiellement le même, avec deux changements:
MIN
dans le groupe1
). Cependant,PCRE
prend en charge\K
ce qui réinitialise le début de la correspondance à la position actuelle du curseur. Ainsi(?<=^(1+),.*)
devient^(1+),.*?\K
, ce qui enregistre déjà deux octets.(?n)
pour faire correspondre le groupe àn
nouveau, comme un appel de sous-programme. Étant donné que la regex originale contenait le code permettant de trouver deux fois le plus grand facteur premier d'un nombre, j'ai pu remplacer la majeure partie du second par un simple(?2)
.la source
3
ou7
) est réellement premier. Cela nécessite qu’il y ait une autre copie du facteur après la première capture, ce qui ne serait pas le cas pour les nombres premiers. Bien que je contourne cela dans .NET en plaçant une zone de recherche de telle sorte que je puisse revenir un peu en arrière pour le contrôle, cela ne serait pas possible dans la version PCRE plus courte en raison de l'absence de recherche de longueur variable. Il est probablement possible de raccourcir cette étape, mais je ne pense pas simplement changer+
pour que cela*
fonctionne.(.*),.*?\K(?=(..+)((?=((?(R)\6|\2))*$).*(?=\4$)(?!(..+)\5+$)))(?!.+(?=\1)(?=(..+)(?3)).*(?!\2)\6).+
99 octets en PCRE. De plus, j'ai rencontré beaucoup de votre travail sur ce site et je suis un grand fan: D Dans l'attente d'une bataille de regex dans le futur!\4$
éliminant le regard et en le collant après le regard négatif, mais cela a un impact important sur les performances (chaque sous-groupe de chiffres <= \ 4 est vérifié pour la composition plutôt que juste \ 4 lui-même) et échoue sur des entrées plus longues.Regex (saveur PCRE), 66 (65🐌) octets
Inspiré en voyant que Martin Ender et Jaytea , deux génies de regex, ont écrit des solutions de regex à ce code de golf, j'ai écrit le mien à partir de zéro. Le fameux regex Prime-Checking n'apparaît nulle part dans ma solution.
Ne lisez pas ceci si vous ne voulez pas que la magie unaire regex vous soit gâtée. Si vous voulez essayer vous-même de découvrir cette magie, je vous recommande vivement de commencer par résoudre certains problèmes dans la regex ECMAScript:
(Le moteur de regex que j'ai écrit peut être utile, car il est très rapide avec les expressions rationnelles mathématiques unaires et inclut un mode numérique unaire qui permet de tester les plages de nombres naturels (mais également un mode chaînes permettant d'évaluer des expressions rationnelles non unaires Par défaut, il est compatible ECMAScript, mais comporte des extensions facultatives (qui peuvent ajouter de manière sélective des sous-ensembles de PCRE, ou même une apparence moléculaire, quelque chose qu'aucun autre moteur d'expression rationnelle n'a).)
Sinon, lisez la suite et lisez également ce GitHub Gist (avertissement, de nombreux spoilers) qui décrit le parcours consistant à pousser la regex ECMAScript à s’attaquer aux fonctions des nombres naturels de difficulté croissante (à commencer par les énigmes de teukon, qui ne sont pas toutes mathématiques, ce qui a déclenché cette périple).
Comme avec les autres solutions regex à ce problème, l'entrée est donnée sous forme de deux nombres dans unary bijective, séparés par une virgule, représentant une plage inclusive. Un seul numéro est renvoyé. L'expression rationnelle peut être modifiée pour renvoyer tous les nombres partageant le même plus petit facteur premier, sous forme de correspondances distinctes, mais cela nécessiterait une recherche de longueur variable et une mise
\K
en attente ou un résultat renvoyé sous forme de capture au lieu d'une correspondance.La technique utilisée ici de division implicite répétée par le plus petit facteur premier est identique à celle utilisée dans les chaînes de correspondance dont la longueur est une quatrième réponse puissante que j'ai postée il y a quelque temps.
Sans plus tarder:
((.+).*),(?!.*(?=\1)(((?=(..+)(\5+$))\6)*)(?!\2)).*(?=\1)\K(?3)\2$
Vous pouvez l'essayer ici.
Et la version à espace libre, avec des commentaires:
L'algorithme peut être facilement porté sur ECMAScript en remplaçant l'appel de sous-routine par une copie du sous-routine et en renvoyant la correspondance en tant que groupe de capture au lieu d'utiliser \ K. Le résultat est 80 octets de longueur:
((x+)x*),(?!.*(?=\1)((?=(xx+)(\4+$))\5)*(?!\2)).*(?=\1)(((?=(xx+)(\8+$))\9)*\2$)
Essayez-le en ligne!
Notez que vous
((.+).*)
pouvez modifier cette option en((.+)+)
supprimant la taille d'1 octet (de 66 à 65 octets ) sans perte de la fonctionnalité correcte - mais l'expression régulière explose de manière exponentielle par lenteur.Essayez-le en ligne! (Version 79 octets ECMAScript à ralentissement exponentiel)
la source
Python 2, 95
Trouve la régularité des nombres par division d’essai jusqu’à ce que le nombre soit égal à 1.
i
stocke la plus petite régularité jusqu’à présent,j
mémorise le nombre qui a donné cette régularité.Merci à @xnor pour les golfs.
la source
if/else
doit être raccourci. Ma première pensée estb=a%p<1;p+=1-b;a/=p**b
. Ou un exec qui exécute l'un des deux dans une chaîne entrelacée. En outre, peut-êtrewhile~-a
fonctionne.s,p=a,2
,i,j=p,s
@ idées de XNOR, la suppression indentation redondante et de mettre le tout en bloc en un rendement en ligne 95 caractères. Vous ne savez pas comment vous en êtes arrivé à 98 ...J,
22 2019 caractèresPar exemple
(Les fonctions prenant deux arguments sont infixes dans J.)
la source
(#~ (= <./)@:(i:"1&1)@:*@:(_&q:))@:([ + i.@-~)
{:
le même que>./
et enregistre 1 octet.Haskell,
9694938680 caractèresutilisation via GHCi (une coque Haskell):
EDIT: maintenant un algorithme beaucoup plus simple.
cette solution inclut les deux nombres dans la plage (donc
8 # 9
et7 # 8
sont tous les deux 8)explication:
la fonction (%) prend deux paramètres, x et y. quand y vaut 2, la fonction retourne la finesse de x.
L'algorithme à partir d'ici est simple - obtenez la liste combinée de toutes les limites des nombres dans l'entrée avec chaque régularité stockant une référence à son numéro d'origine, triez-la ensuite pour obtenir le plus petit et renvoyez le numéro référencé.
Voici une version javascript non-golfée avec le même algorithme:
la source
m l=minimum l
Mathematica,
614539 caractèresImplémentation très simple de la spécification en tant que fonction non nommée.
la source
Lua - 166 caractères
Je
n'ai pas(encore!) Assez de réputation pour commenter la solution d'AndoDaan , mais voici quelques améliorations sur son codeChangements :
n%d==0
parn%d<1
qui est équivalent dans ce castable.insert(f,d)
parf[#f+1]=d
(#f
est le nombre d'éléments de f)la source
Bash + coreutils, 56 octets
L'entrée provient de exactement deux arguments en ligne de commande (Merci @ nyuszika7h !!!). La sortie est un résultat singulier imprimé sur STDOUT.
seq
fournit la plage de nombres, un par ligne, à partir des arguments de la ligne de commande.factor
lit ces nombres et affiche chaque nombre suivi de deux points et de la liste triée des facteurs premiers de ce nombre. Donc, le plus grand facteur premier est à la fin de chaque ligne.sed
supprime les deux points et tous les facteurs sauf le dernier / le plus grand facteur, laissant ainsi une liste de chaque nombre (colonne 1) et de son plus grand facteur premier (colonne 2).sort
numériquement dans l'ordre croissant de la colonne 2.sed
ligne finale correspond à la ligne 1 (numéro dont le plus grand facteur premier est le plus petit de la liste), supprime tout, y compris et après le premier espace, puis se ferme.sed
imprime automatiquement le résultat de cette substitution avant de quitter.Sortie:
Les plages de notes dans ce contexte incluent les deux extrémités.
la source
seq $@
est plus court de 3 octets, si vous pouvez supposer qu’il n’ya que deux arguments.Python 2, 67
Penser à un autre golf m'a donné l'idée d'un nouvel algorithme pour vérifier la fluidité, d'où la réponse tardive.
La factorisation en facteurs de la factorielle
i!
comprend exactement les nombres premiers au plusi
. Donc, sin
est un produit de nombres premiers distincts, sa douceur (le plus grand facteur premier) est le plus petiti
pour lequeln
est un diviseur dei!
. Pour tenir compte de facteurs premiers répétésn
, nous pouvons utiliser une puissance de suffisamment élevéei!
. En particulier,(i!)**n
suffit.Le code tente d'augmenter les factorielles
F=i!
, mises à jour récursivement. Nous filtrons pour les diviseurs deF
dans la plage d'entrée et les sortons s'il y en a, et sinon nous passons à(i+1)!
.Cas de test:
la source
C,
14995Réponse modifiée:
Je ne peux pas demander de crédit pour cette solution. Cette réponse mise à jour reprend la belle méthode utilisée par isaacg dans sa solution Python. Je voulais voir s'il était possible d'écrire en C comme imbriquée
for
/while
boucle sans accolades, et il est!Explication:
R(a,b,n,q,p,m)
balaie la plagea
àb-1
et retourne le premier numéro trouvé plus doux. Exige le respect de l' invocation sous la forme suivante:R(a,b,a,b,2,0)
afin que les variables sont effectivement initialisés dans la fonction comme suit:n=a;q=b;p=2;m=0;
.Réponse originale :
C'était ma réponse originale ...
Explication:
P(n,f,p)
teste la valeurn
pour la primalité et renvoie true (différent de zéro) sin
prime ou faux (zéro) sin
non premier.f
etp
doit être passé comme 1.G(n,f)
renvoie le plus grand facteur premier den
.f
doit être passé commen
.R(a,b,p,n)
balaie la plagea
àb-1
et retourne le premier numéro trouvé plus doux.p
doit être passé en tant que 1.n
peut être n'importe quelle valeur.Pilote d'essai:
Sortie:
la source
Haskell - 120
Exemple d'utilisation:
la source
<1
au lieu de==0
?Q, 91 caractèresK, 78 caractèresk raserait probablement une douzaine de personnages
edit: en effet, traiter la limite supérieure comme non inclusive cette fois
la source
Remarque: cette réponse n'est pas autorisée.
Cette réponse utilise plusieurs fonctionnalités de Pyth ajoutées après la demande du défi.
J'ai ajouté une autre nouvelle fonctionnalité, appelant range unary sur un tuple à 2 éléments, ce qui raccourcit la solution de deux caractères:
Pyth , 7
L'entrée est maintenant prise séparée par des virgules. Le reste est le même.
Cette réponse utilise une fonctionnalité de Pyth qui a été ajoutée après la réponse à cette question, en particulier après avoir consulté la merveilleuse solution CJam de @ aditsu. Cela étant dit, je voulais montrer ce que l'ajout de cette fonctionnalité a rendu possible. La fonction est
P
, qui est une fonction arity-1 qui, en entrée entière, renvoie une liste de tous les facteurs premiers de l'entrée, triés du plus petit au plus grand.Pyth , 9
Utilise des plages de style Python, les nouvelles lignes séparées sur STDIN. Génère la plus petite solution dans STDOUT.
Explication:
Tests:
la source
Lua - 176 personnages
Je devrais vraiment arrêter de jouer au golf à Lua. Il est inutile.
la source
Clojure -
173170 caractèresJe suis un novice Clojure. Golfé:
Échantillons:
Les plages comprennent bas de gamme, excluent haut de gamme: [a, b) N'imprime que l'un des nombres les plus lisses, si plusieurs se produisent.
rendements:
Ungolfed:
la source
Ruby,
6562Veuillez nous excuser auprès de https://codegolf.stackexchange.com/a/36484/6828 , il s’agit de la version avec golf (et légèrement simplifiée) de celle. Utilise une plage inclusive puisqu'il s'agit d'un caractère plus court.
Et merci à YenTheFirst pour avoir sauvé trois personnages.
la source
C # LINQ:
317303289262Ungolfed:
Il prend au début et la longueur de la ligne de commande et renverra le plus grand nombre lisse.
J'ai utilisé les réponses d' ici et ici pour faire ma réponse.
Merci à VisualMelon pour l’avoir peaufiné et avoir rasé 12 octets! Je me suis également débarrassé des accolades dans la sauvegarde de 2 octets si, et CodeInChaos a souligné certaines choses évidentes que j'ai manquées (merci encore).
la source
F
définissant àint b
côté de m. Dans quelques endroits où vous effectuez la comparaisona%b==0
, eta
etb
sont toujours positifs que vous pouvez couper un octet pour chaque en vérifiant si elle est inférieure à 1a%b<1
. Vous pouvez également enregistrer un octet en incrémentantb
la condition ifa%++b<0
plutôt que dans le for en l'initialisant à 1. Je pense aussi que dans ce cas il est moins cher de simplement qualifier complètementSystem.Console.WriteLine
et d'éviter lanamespace
clause.m=...:m;
truc tombe en dehors de la boucle while. Par conséquent, vous pouvez supprimer lem=0,
et remplacerreturn m;
parreturn m=b>m?b:m;
. Ensuite, vous pouvez laisser tomberm=...:m;
entièrement.Aggregate
marche, je l'ai juste essayé après l'avoir vue dans une autre réponse pour obtenir mon nouvel objet au lieu d'un seul champ à l'intérieur, et il est juste arrivé de fonctionner parfaitement :)R, 83
où le bas de la plage d'entrée est assigné
a
et le haut (inclusif) est assignéb
.gmp
est un package disponible sur CRAN. J'avais l'impression d'être sale jusqu'à ce que je voie cettemf
fonction absurde dans CJam. Installez en tapantinstall.packages("gmp")
dans la console.la source
lapply
3 fois, vous voudrez peut-être l'aliaser (c.l=lapply
-à- d. , Puis utiliserl(...
). De même,factorize
étant la seule fonction que vous utilisez depuis un package,gmp
vous pouvez utilisergmp::factorize
au lieu de charger la bibliothèque, puis d’utiliserfactorize
. Votre code deviendrait donc cel=lapply;n=a:b;n[which.min(l(l(l(n,gmp::factorize),max),as.numeric))]
qui est de 69 octets.PowerShell - 85
Cela va trier une plage de nombres (inclus) en fonction du facteur premier maximum de chaque nombre. Il retourne l'élément trié le plus bas.
la source
J - 16 caractères
Utilisation du style de plage ( début , longueur ), comme le permettent les commentaires.
Pour être utilisé comme verbe dyadique: l'argument gauche est début , droite est longueur .
Une solution ( début , fin ) a +2 caractères et exclut la fin; y compris la fin est +2 de plus. Mais du côté positif, cela semble plutôt agréable puisque nous associons tous les {accolades}.
la source
Sérieusement, 8 * 14/7 = 16 (non compétitif)
Seriously a été créé après ce défi, mais je voulais poster cette réponse car elle illustre bien le type de défis que Sérieusement réussit.
Essayez-le en ligne!
Explication:
la source
Pyth , 7 octets
Essayez-le ici!
}
r
la source
Cobra - 150
Je ne sais même pas pourquoi je me suis inquiété, le cobra ne peut tout simplement pas rivaliser ici.
la source
Ruby - 113 caractères
Utiliser stdlib. Renvoie un résultat. Testé sur rubis 2.1.2.
la source
Perl (5.10+), 83
(le saut de ligne peut être supprimé). Prend deux extrémités d’une plage inclusive sur deux lignes de stdin (car
<>
c’est moins cher que d’accéderARGV
) et génère le résultat le plus régulier sur stdout. S'il y a une égalité pour le plus lisse, imprime le plus petit. Pourrait imprimer le plus grand au prix d'un caractère.L'algorithme est fondamentalement le moyen utilisé par isaacg pour trouver le plus grand facteur premier, bien que nous l'ayons développé indépendamment. Cette partie résume à merveille avec une seule déclaration en perl, le reste en a plus que ce que je voudrais bien.
Devrait être exécuté sous
perl -E
ou avec unuse 5.012
préambule. Si vous ne pouvez pas faire cela, remplacezsay$r
parprint$r,$/
.la source
Python 2 (84)
La solution de @ isaacg , mais avec une
min
clé de fonction by à la place de min- find explicite, et une fonction récursive jouant le rôle de l'itération.Exécutez-vous en Stackless Python pour éviter les limites de récursivité.
Il semble inutile d’utiliser la condition entre parenthèses
(n%p<1)
, puis de répéter sa négation également entre parenthèses(n%p>0)
, mais c’est le meilleur que j’ai eu. J'ai essayé beaucoup de choses, mais elles ont empiré.Je me félicite de toute amélioration que vous pouvez penser.
la source
Java 8 - 422
454caractèresJ'apprenais Java 8 et je voulais donner à cette image un coup de projecteur par rapport à Java (ou même aux flux Java 8).
Comparé à d’autres langues, c’est un exercice brutal mais intéressant.
Golfé:
Ungolfed:
exemple exécuté en utilisant:
la source
MATL ( non compétitif ), 20 octets
Ce langage a été conçu après le challenge
La plage est inclusive aux deux extrémités. Les nombres sont pris comme deux entrées séparées.
Essayez-le en ligne!
Explication
la source
&:[]y"@YfX>h]&X<)
ou peut-être 16:[]y"@YfX>h]&X<)
. Le&
était vraiment une bonne idée (et je deviney
était pas en arrière disponible alors?).Yf
de préfixes 1 aurait été utile ici aussi, mais ce n'est probablement pas suffisant pour décider que c'est une bonne idée en général. :)y
ou&
. Merci à Suever pour la sémantique très utile de ce dernier (mon idée initiale était de faire en sorte que cela signifie "une entrée de plus que la valeur par défaut"). Si nous voyons de plus en plus de cas où,Yf
avec l'ajout de ceux-ci, il serait utile d'ajouter cette fonctionnalité. Le problème, c'est qu'il y a environ 34 réponses qui utilisentYf
(selon ce script ), donc c'est difficile à direGelée , 7 octets, score = 7 ÷ 7 × 8 = 8, défi linguistique suivant
Essayez-le en ligne!
Prend les points d'extrémité inférieur et supérieur comme deux arguments séparés. Affiche une liste de tous les nombres les plus lisses de la plage. (Cela peut être considéré comme une fonction, auquel cas la sortie est une liste de gelée, ou comme un programme complet, auquel cas la sortie utilise la même représentation de liste que JSON.)
Explication
Ces moments où votre programme Jelly n'est qu'une traduction littérale de la spécification…
la source