Considérez la séquence naturelle jusqu'à 6 (sans tenir compte de 1) :
2,3,4,5,6
Nous commençons à numériser à partir de la gauche (dans ce cas, à partir de 2), recherchons un nombre divisible par 2 (ici 4), puis supprimons les deux numéros de la liste (ici 2 et 4), de sorte que la liste se réduit à:
3,5,6
Nous continuons le même processus, ici le plus à gauche est 3, donc nous recherchons le nombre divisible par 3. 6 est sûrement ce nombre et donc 3 et 6 sont supprimés,
5
Maintenant, aucune autre recherche de ce type ne peut être effectuée. Ainsi, cela devient la liste des nombres ALONES pour n = 6.
OBJECTIF
- Étant donné un nombre n supérieur à 1, imprimez tous les nombres alonés correspondants.
CONTRIBUTION
2
6
15
20
22
PRODUCTION
2
5
8,9,11,12,13,15
11,12,13,15,17,19,20
12,13,15,17,19,20,21
ENCORE UN AUTRE EXEMPLE RÉALISÉ
Pour n = 22
=>2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
=>3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 (remove 2 & 4)
=>5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 (remove 3 & 6)
=>7,8,9,11,12,13,14,15,16,17,18,19,20,21,22 (remove 5 & 10)
=>8,9,11,12,13,15,16,17,18,19,20,21,22 (remove 7 & 14)
=>9,11,12,13,15,17,18,19,20,21,22 (remove 8 & 16)
=>11,12,13,15,17,19,20,21,22 (remove 9 & 18)
=>12,13,15,17,19,20,21 (remove 11 & 22) (OUTPUT)
Il s'agit de code-golf , donc le code le plus court en octets l'emporte.
Réponses:
05AB1E ,
22171514 octetsEssayez-le en ligne!
Explication
la source
Python 2,
907973 octets-6 octets grâce à xnor
Prend le numéro d'entrée sur stdin. Ideone it!
Explication
Nous construisons la liste initiale à partir du numéro d'entrée et la stockons
L
. Ensuite, bouclez pendant que le dernier nombre est supérieur ou égal à 2 fois le premier nombre et supprimez 2 fois le premier nombre de la liste. Ce sera toujours le prochain nombre divisible parL[0]
.L=L[1:]
enlève également le premier numéro. Lorsque la condition n'est plus vraie, aucun autre retrait ne peut être effectué et la liste est imprimée.la source
range
donne déjà une liste.Python, 61 octets
C'est un peu plus facile de comprendre ce code moins golfé:
Cela utilise une caractérisation directe des nombres alonnés:
Pourquoi cela tient-il? Lorsque vous effectuez le processus pour
n
, disons que nous supprimons un nombre impaira
dans la moitié inférieure (1
àn/2
). Ensuite, il2*a
est supprimé, peu importe où il se trouve dans la liste. Donc,4*a
reste (s'il existait). Mais si c'est dans la moitié inférieure, le processus de suppression y parviendra et supprimera les deux4*a
et8*a
. Ainsi, nous voyons qu'un nombre la moitié supérieure se retire si elle est de la forme2*a
,8*a
... avec bizarrec
, mais reste si elle a une formea
,4*a
,8*a
, ...L'exception est pour
a=1
, qui ne commence pas dans la liste et n'est donc pas supprimée. En conséquence, la chaîne de retrait commence para=2
et la règle des pouvoirs de 2 est inversée.Dans le code ci-dessus,
(i&-i)**.5%1>0
vérifie s'ili
manque la formei = a * 2^b
avecb
impair, par le truc pour extraire le plus grand facteur de puissance de deux2^b = i&-i
, puis vérifie si le résultat n'est pas un carré parfait. Ensuite,i&~-i>0
c'est une autre astuce pour vérifier si cei
n'est pas une puissance parfaite de 2. Ces conditions sont alors xor'ed.Il y a d'autres améliorations ici
En premier lieu , on décale la plage de 1 index vers le bas pour raccourcir à
range(n/2,n)
partirrange(n/2+1,n+1)
, compensant en remplaçant touti
aveci+1
(ou~-i
).Si une puissance de 2 est un nombre est une puissance de
4
(2 ^b
avecb
pair) peut être vérifiée par et avec2**c/3
pour certains grandsc
. En effet,2**c/3
a une représentation binaire10101...101
avec ceux des bits pairs. Utiliserc=2*n
suffit. Pour annuler le résultat quandi
est une puissance de 2, nous divisons par deux ce nombre dans ce cas, en mettant1
à la place les positions impaires.la source
Groovy,
6558 octetsIdée d'algorithme de DSLoc , qui a remarqué qu'il suffit de supprimer les doubles.
Voici une ventilation:
la source
Perl,
53494544 octetsComprend +1 pour
-n
Donnez le numéro d'entrée sur STDIN:
aloned.pl
:La vérification directe des numéros possibles est plus longue:
Cela vérifie tous les nombres dans la moitié supérieure de la plage. Conservez les nombres qui ont un nombre pair de 2 comme facteurs premiers, sauf si le nombre est une puissance de 2, puis impair (car 1 est omis de la série d'origine). Cette méthode devrait cependant bien fonctionner pour d'autres langues.
la source
MATL , 18 octets
A emprunté l'idée "multiplier par 2" à la réponse 05AB1E de @ Emigna .
Essayez-le en ligne!
Explication
la source
Haskell,
71696256 octetsExemple d'utilisation:
q 22
->[12,13,15,17,19,20,21]
.S'il y a un multiple du premier nombre
a
, alors c'est2*a
. Conserveza
si2*a
n'est pas dans la liste et ajoutez un appel récursif aveca
et2*a
supprimé de la liste.la source
Pyth - 19 octets
Sera certainement refactoring.
Suite de tests .
la source
Rubis, 124
En comparant les scores à d'autres réponses, c'est évidemment la mauvaise approche:
Le morceau un peu intelligent ici est celui
a[g[0]]=a[g[1]]=!g[1]
qui définit les valeurs du hachage sur vrai / faux si nécessaire.la source
PHP, 98 octets
8 octets enregistrés par @Titus Merci
Si une virgule de fin est autorisée, elle peut être raccourcie de 9 octets
(!$a?:print"$a,");
au lieu de(!$a?:print$x?",$a":$x=$a);
la source
$a
et les$b
parenthèses ne sont-elles pas nécessaires? Méchant!(!$a?:print"$a,")
->print$a?"$a,":""
. -2 octets pour les deux versions si vous utilisez le trait de soulignement comme séparateur.foreach(... as$v)
,$v-2
au lieu de$k
et$v*2-2
au lieu de$k*2+2
.$a=&$r[$k]&&$b=&$r[$k*2+2]
travaux comme$a=$r[$k]and$b=$r[$k*2+2]
. Je suis désolé de n'avoir trouvé aucune page expliquant les combinaisons avec les références et l'&&
opérateur. Mais j'ai besoin de références et non d'affectations. Je ne sais pas si une virgule de fin ou un autre séparateur est autorisé.&
bit et les références ont une priorité plus élevée que l'&&
opérateurJavascript, 149 octets
Voici un exemple de travail. Tout le HTML et la fonction wrapper () sont juste pour qu'ils soient réellement interactifs.
Afficher l'extrait de code
Cet extrait de code non golfé contient des commentaires et vous permet de voir de manière interactive les étapes d'une entrée donnée.
Afficher l'extrait de code
la source
JavaScript (ES6), 92 octets
Je pensais l'avoir posté hier, mais évidemment pas ...
Voici une autre version:
la source
Java 7, 210 octets
Peut certainement être joué au golf encore plus en utilisant une approche différente, probablement en utilisant un tableau avec quelques astuces. En raison de la distribution, de la rupture, de la liste typée et des vérifications if, c'est un peu plus long que prévu, mais cela fonctionne.
Code non testé et testé:
Essayez-le ici.
Sortie:
la source
Raquette 191 octets
Non golfé (commentaires après ';'):
Essai:
Sortie:
la source