Ce défi est assez simple qu'il est fondamentalement tout dans le titre: on vous donne un entier positif N et vous devez retourner le plus petit entier positif qui n'est pas un diviseur de N .
Un exemple: les diviseurs de N = 24 sont 1, 2, 3, 4, 6, 8, 12, 24
. Le plus petit entier positif qui ne figure pas dans cette liste est 5 , c'est donc le résultat que votre solution devrait trouver.
Ceci est la séquence OEIS A007978 .
Règles
Vous pouvez écrire un programme ou une fonction et utiliser l’une quelconque de nos méthodes standard de réception d’entrée et de sortie.
Vous pouvez utiliser n'importe quel langage de programmation , mais notez que ces failles sont interdites par défaut.
C'est du code-golf , donc la réponse valide la plus courte - mesurée en octets - est gagnante.
Cas de test
Les 100 premiers termes sont:
2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2,
3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3,
2, 3, 2, 4, 2, 3, 2, 3, 2, 7, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2,
3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3
En particulier, assurez-vous que votre réponse fonctionne pour les entrées 1 et 2, auquel cas le résultat est plus grand que l'entrée.
Et pour certains cas de test plus importants:
N f(N)
1234567 2
12252240 19
232792560 23
la source
Réponses:
Mathematica, 19 octets (codage UTF-8)
Fonction sans nom prenant un argument entier différent de zéro et renvoyant un entier positif. La barre verticale à peu près à mi-chemin est en fait le caractère à trois octets U + 2223, qui indique la relation de divisibilité dans Mathematica. Explication:
Edité à ajouter: ngenisis indique que
//.
, par défaut, le nombre maximal de répétitions sera de 65 536 fois. Cette implémentation fonctionne donc pour tous les nombres en entrée inférieurs au plus petit commun multiple des nombres entiers compris entre 1 et 65538 (en particulier pour tous les nombres comportant au plus 28 436 chiffres), mais pas techniquement pour tous les nombres. On peut remplacerx//.y
parReplaceRepeated[x,y,MaxIterations->∞]
pour réparer cette faille, mais au prix de 34 octets supplémentaires.la source
For
,While
etcPyth, 3 octets
Fondamentalement,
f
boucle le code jusqu'à ce que%QT
(Q % T
oùT
est la variable d'itération) est vrai.Essayez-le en ligne ici.
la source
.V1In%Qb0bB
peau : Vous avez vu votre réponse et vous ne vous sentez plus aussi bien.JavaScript (ES6),
2523 octetsRemarque: Une chose intéressante ici est que le
k
paramètre est initialisé ex nihilo à la première itération. Cela fonctionne carn % undefined
estNaN
(fausseté comme prévu) et-~undefined
égal1
. Aux prochaines itérations,-~k
est essentiellement équivalent àk+1
.Tester
Afficher l'extrait de code
la source
Python,
433635 octetsla source
Hexagonie , 12 octets
Embiggened:
Essayez-le en ligne!
la source
R, 28 octets
Assez simple, rien d'extraordinaire. Prend l'entrée de stdin, incrémente la valeur
T
jusqu'à ce quei
moduloT
soit différent de zéro.Si vous voulez quelque chose d'un peu plus sophistiqué, voici 29 octets :
A expliqué:
la source
which.min
, mais j’ai vu le montage et il semblematch
faire un travail similaire.T
, évitant la nécessité de le définir avant lawhile
boucle.while
approche, ce qui est correct car elle nécessite beaucoup de mémoire pour les grands N. LeT
truc est un de ces gâteries qui est excellent pour le golf mais absolument horrible pour la programmation réelle. (Et bien sûr, vous pouvezF
aussi utiliser quand vous avez besoin d'un0
.)%%
priorité est sur+
, les parens sont donc toujours nécessaires:,(0:i+1)
avec le même nombre d'octets que1:(i+1)
. J'avais en fait le premier à l'origine, mais j'ai changé pour le dernier, car il est plus facile à lire.Haskell, 26 octets
Tout le monde oublie
until
!la source
Brachylog , 10 octets
Essayez-le en ligne!
Cela est apparu très similaire à (mais plus court que) la solution originale de Fatalize. Fatalize a depuis basculé vers un algorithme différent qui est lié à celui-ci via une méthode différente, je vais donc devoir l'expliquer moi-même:
Lorsque nous inversons la fonction, en échangeant "entrée" et "sortie", nous obtenons un algorithme assez raisonnable (juste exprimé de manière maladroite): "essayez les entiers positifs possibles, dans leur ordre naturel (c'est-à-dire 1 et plus), jusqu'à ce que vous trouviez celui qui ne peut être multiplié par rien pour produire l’entrée ". Brachylog ne fait pas de calculs en virgule flottante à moins que toutes les entrées soient connues, donc il ne considérera que l'entier A.
la source
Brachylog ,
11 à10 octetsEssayez-le en ligne!
Explication
la source
VACHE, 174 octets
Essayez-le en ligne!
Ce code n'est que partiellement le mien - il implémente un algorithme de module que j'ai porté de brainfuck. Le reste du code est le mien. Cependant, comme je n’ai pas écrit l’algorithme de module, je n’ai pas vraiment étudié son fonctionnement et je ne peux pas documenter cette partie du code. Au lieu de cela, je donnerai ma ventilation habituelle, suivie d'une explication plus détaillée de la raison pour laquelle le code fonctionne.
Code ventilation
Explication
Le code lit d'abord le nombre entier dans [0]. Chaque itération de la boucle principale (lignes 2 à 26) incrémente [1], puis copie tout ce qui est nécessaire dans l’algorithme de module, qui extrait son résultat dans [5]. Si [5] contient une valeur, alors [1] est le nombre que nous devons imprimer. Nous l’imprimons, puis nous forçons à quitter le programme.
Puisque COW est un dérivé du brainfuck, il fonctionne relativement de la même manière que le brainfuck: une bande de bande infinie, vous pouvez vous déplacer à gauche ou à droite, augmenter ou diminuer et "boucler" tant que la valeur actuelle de la bande est non nulle. En plus de brainfuck, COW est livré avec quelques fonctionnalités utiles.
Le point d'intérêt réel est l' instruction 3 ici,
mOO
. L'interprète lit la valeur actuelle de la bande et exécute une instruction en fonction de cette valeur. Si la valeur est inférieure à 0, supérieure à 11 ou égale à 3, l'interpréteur termine le programme. Nous pouvons utiliser cela comme une force rapide et sale de quitter la boucle principale (et le programme entièrement) une fois que nous avons trouvé notre non-diviseur. Tout ce que nous avons à faire, c'est imprimer notre numéro, effacer [1] (avecOOO
), le décrémenter à -1 avecMOo
, puis exécuter l'instruction -1 viamOO
laquelle se termine le programme.La bande elle-même pour ce programme fonctionne comme suit:
L'algorithme de module supprime naturellement [2], [3], [6] et [7] à la fin de l'opération. Le contenu de [4] est écrasé par le registre coller de la ligne 4 et [5] est égal à zéro lorsque [0] est divisible par [1], nous n'avons donc pas à l'effacer. Si [5] est non nul, nous forcons la ligne 23 pour ne pas avoir à nous en préoccuper.
la source
05AB1E , 7 octets
Essayez-le en ligne!
Explication
la source
Gelée , 5 octets
Essayez-le en ligne!
Explication:
Ceci est un abus horrible de
#
; il y a beaucoup d'opérateurs dans ce programme, mais une tonne d'opérandes manquants.#
veut vraiment1
qu'on le donne explicitement pour une raison quelconque (sinon, il essaie de passer par défaut à l'entrée); Cependant, tout ce qui n'est pas spécifié dans le programme est par défaut l'entrée du programme. (Ainsi, par exemple, si vous donnez 24 en entrée, ce programme trouve les 24 premiers nombres qui ne divisent pas 24, puis retourne le premier; genre de gaspillage, mais cela fonctionne.)la source
2%@1#
C,
3235 octetsEdit: ajouté
i=1
dans la boucleUsage
Version complète du programme, 64 octets:
la source
C #,
3937 octetsSauvé deux octets grâce à Martin!
la source
Perl, 19 octets
18 octets de code +
-p
drapeau.Pour l'exécuter:
Explications peu détaillées :
-
$.
est une variable spéciale dont la valeur par défaut est le numéro de la ligne du dernier descripteur de fichier utilisé (stdin ici). Ainsi, après avoir lu la première ligne d'entrée, il est mis à 1.-
$_
conserve l'entrée et est implicitement imprimée à la fin (merci au-p
drapeau).-
redo
(dans ce contexte) considère que le programme est dans une boucle et refait l'itération actuelle (ne$.
sera différent que s'il a été incrémenté).- Donc, si nous trouvons le plus petit nombre (stocké dans
$.
) qui ne se divise pas$_
, alors nous le définissons$_
, sinon, nous essayons le nombre suivant (grâce àredo
).la source
Octave / MATLAB,
26 à24 octetsfind(...,1)
renvoie l'index (1
-based) du premier élément non nul du vecteur dans le premier argument. Le premier argument est que[n mod 1, n mod 2, n mod 3, n mod 4,...,n mod (n+1)]
cela signifie que nous devons ajouter+1
à l'index, car nous commençons à tester à1
. Merci @ Giuseppe pour -2 octets.Essayez-le en ligne!
la source
@(n)find(mod(n,1:n+1),1)
est plus courte, n'est-ce pas?Gelée , 6 octets
Essayez-le en ligne!
Explication:
la source
[1, 1, 1, 1, 5, ...]
.Perl 6 , 17 octets
L'essayer
Étendu:
la source
05AB1E , 6 octets
Essayez-le en ligne!
En outre, cela signifie "LIEN!" ... un peu ...
la source
Gelée , 5 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Python 2.7.9, 32 octets
Test sur Ideone
Compte récursivement les non-diviseurs potentiels
d
. Il est plus court d'incrémenter le résultat de manière récursive que d'afficherd
. Un décalage de1
est obtenu par le booléen deTrue
, ce qui est égal1
, maisd==1
étant toujours un diviseur, la sortie est toujours convertie en un nombre.Python 2.7.9 est utilisé pour permettre
0or
. Les versions commençant à la version 2.7.10 essaieront d’analyser0or
le début d’un nombre octal et une erreur de syntaxe. Voir cela sur Ideone .la source
En fait , 7 octets
Essayez-le en ligne! (note: c'est une solution très lente, et cela prendra beaucoup de temps pour les cas de test volumineux)
Explication:
la source
Haskell , 29 octets
L'expression
[k|k<-[2..]]
crée simplement une liste infinie[2,3,4,5,...]
. Avec cette condition,mod n k>0
nous n'autorisons que ceuxk
de la liste qui ne se divisent pasn
. Ajouter!!0
ne retourne que la première entrée (l'entrée à l'index0
) de cette liste.Essayez-le en ligne!
la source
Dyalog APL , 8 octets
1⍳⍨
position de premier vrai dans0≠
les valeurs non nulles de⍳|
les restes de division de 1 ... N quand divisé par⊢
NTryAPL en ligne!
Remarque: cela fonctionne pour 1 et 2 car
1⍳⍨
retourne 1 + la longueur de son argument si aucun n'est trouvé.la source
julia, 28 octets
Note: comme
1:N+2
ne pas allouer de mémoire, il n'y a pas de problèmes de mémoire pour les grosN
s- @flawr
N+2
enregistrez pour moi quelques octets- La suggestion de @Martin a été sauvegardée de 1 octet
la source
QBIC , 14 octets
Explication:
la source
PHP, 30 octets
si exécuté depuis la console avec
-r
option (merci à @ ais523)32 octets
merci à @manatwork pour la suppression de 1 octet
33 octets (original)
la source
<?
ne doit pas nécessairement faire partie de votre nombre d'octets (parce que PHP a un mode de ligne de commande qui ne l'exige pas).<1
au lieu de==0
.for(;!($argv[1]%$i);$i++);echo$i;
. Le vôtre est l'évolution naturelle de la mienne. Cela a mon vote positif!Cubix ,
1412 octetsSauvegardé 2 octets grâce à MickyT.
L'essayer
Explication
Sous forme de cube, le code est:
Fondamentalement, cela prend juste l'entrée et démarre un compteur. Il vérifie ensuite chaque valeur successive du compteur jusqu'à ce qu'il en trouve une qui n'est pas un facteur de l'entrée.
la source
I2/L/);?%<@O
pour quelques octets de moins. Même processus général, chemin différent> <> , 15 +3 = 18 octets
L'entrée devrait être sur la pile au début du programme, donc +3 octets pour le
-v
drapeau. Essayez-le en ligne!la source
Méduse ,
12 à10 octetsPrend l'entrée de STDIN et les sorties vers STDOUT. Essayez-le en ligne!
Martin Ender a économisé 2 octets, merci!
Explication
Cette partie est une fonction qui utilise la valeur d’entrée dans sa définition.
Cette
~
fonction reçoit une fonction, elle retourne donc ses arguments: elle produit la fonction binaire "argument gauche argument modulo (|
) argument droit". La fonction modulo intégrée à Jellyfish prend ses arguments dans l'ordre inverse.Cette
~
-cellule reçoit une valeur et une fonction, elle effectue donc une application partielle: elle produit la fonction binaire "input (i
) modulo right argument". Appelons cette fonction f .La
\
cellule a deux fonctions, elle effectue donc une itération: elle produit la fonction unaire "increment (>
) jusqu'à ce que la fonction f appliquée aux valeurs précédentes et actuelles donne un résultat véridique (différent de zéro), puis renvoie la valeur actuelle". Cela signifie que l'argument est incrémenté jusqu'à ce qu'il ne divise pas l'entrée.Enfin, nous appliquons cette fonction à la valeur initiale
1
et imprimons le résultat avecp
.la source