Les numéros de fusil de chasse sont une séquence avec une définition assez simple mais une structure intéressante. Commencez avec les nombres naturels:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
Maintenant, prenez tous les nombres aux indices divisibles par 2 , regroupez-les en paires et échangez les nombres de chaque paire:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
^ ^ ^ ^ ^ ^ ^
<---> <---> <-----> <----
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
Faites maintenant la même chose avec les indices divisibles par 3 :
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
^ ^ ^ ^
<------> <--------->
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
Et puis pour 4 , 5 , 6 et ainsi de suite:
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
1, 4, 8, 6, 5, 3, 7, 2, 10, 12, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 3, 7, 2, 10, 5, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 14, 7, 2, 10, 5, 11, 3, 13, 16, ...
...
Après k ces étapes, les k + 1 premiers nombres seront fixés. Ainsi, nous pouvons définir la séquence infinie de nombres Shotgun comme la limite permettant à k d’ aller à l’infini. Les 66 premiers numéros sont:
1, 4, 8, 6, 12, 14, 16, 9, 18, 20, 24, 26, 28, 22, 39, 15, 36, 35, 40, 38, 57, 34, 48, 49, 51, 44,
46, 33, 60, 77, 64, 32, 75, 56, 81, 68, 76, 58, 100, 55, 84, 111, 88, 62, 125, 70, 96, 91, 98, 95,
134, 72, 108, 82, 141, 80, 140, 92, 120, 156, 124, 94, 121, 52, 152, 145, ...
Fait amusant: bien qu'elle n'ait été obtenue qu'en permutant les nombres naturels, cette séquence ne contient aucun nombre premier.
Le défi
À partir d’un nombre entier n > 0
, trouvez le n
numéro du fusil de chasse. Vous pouvez écrire un programme ou une fonction en prenant une entrée via STDIN (ou l’alternative la plus proche), un argument de ligne de commande ou une argumentation de fonction, puis renvoyer la sortie ou l’imprimer sur STDOUT (ou l’alternative la plus proche).
C'est le code de golf, donc la soumission la plus courte (en octets) gagne.
Classements
Cela donne plus de réponses que je ne le pensais, ainsi que plusieurs personnes en compétition dans la même langue. Voici donc un extrait de pile permettant de générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=47338;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
10
,21
,25
et30
ne semble pas non plus , par exemple.k
troisième itération, lek
dixième élément du tableau est transposé à la2k
dixième position et ne sera pas touché à nouveau avant la dernière2k
itération, moment où il sera transposé à la4k
vingtième position à l'infini. Un nombre premier n'est pas transposé jusqu'à ce que son tour arrive, pour ainsi dire, alors tous les nombres premiers sont mélangés. Mais nous pouvons facilement dresser une liste des victimes innocentes en imprimant simplement le premier élément à transposer à la deuxième itération et à chaque itération étrange. La liste est la suivante: 2, 3, 5, 7, 10, 11, 13, 21, 17, 19, 30, 23, 27, 25, 29, 31, 45, 42, 37, 54, 41, 43, 65, ...Réponses:
Pyth, 19
22Une implémentation assez naïve de la réponse golfscript de @ PeterTaylor .
Essayez-le en ligne ici
Ceci utilise les mêmes astuces pour convertir une boucle while en un pli que l’autre programme Pyth ci-dessous.
Une copie naïve de l' algorithme de @ Sp3000 traduit en Pyth.
Vous pouvez l'essayer en ligne ici
Les utilisations réduisent (nom du python pour fold) pour émuler la boucle while. Il énumère ce
range(input, 2)
qui fonctionne en Pythrange(2, input)[::-1]
. Les autres liés Pyth-Golfs consiste à utiliser aunot
lieu de<2
et à l' aidey
est de doubler le mode caché la valeur des arguments numériques.la source
> <>,
5245 octetsPage Esolangs pour> <>
Il y a beaucoup d'éléments de copie et de déplacement, grâce aux nombreux modulo et multiplications nécessaires. La logique est exactement la même que ma solution Python .
Prend la saisie via un point de code à partir de STDIN, par exemple
"!" = 33 -> 75
.la source
-v
qu'ilPython 2, 58 octets
Comme la plupart des autres réponses, l’idée est de travailler en arrière.
Appelons step
k+1
stepi
pour quei
tous les multiples dei
soient échangés. Nous avons besoin de deux observations simples:n
dans le tableau n’est inversée à l’étape quei
sin
est divisible pari
,n/i mod 2
. Si ce chiffre est 1, vous êtes le nombre le plus bas (et sera échangé), sinon vous êtes le nombre le plus élevé (et échangé).Cela nous donne un algorithme pour travailler en arrière. Essayons avec 6, en partant de la dernière étape
i = 6
:Alors maintenant, nous savons que le nombre vient de la position 12. Ensuite:
Alors maintenant, nous savons que cela venait de 16 ans auparavant. Finalement:
Comme il s’agit de la première étape (rappelez-vous
k+1
), nous avons terminé et le numéro qui se termine en position 6 provenait de la position 14, c’est-à-dire que le 6e numéro du fusil de chasse est 14.Alors maintenant, l'explication Python:
la source
i-1
comme~-i
while
. Beau travail, Sp3000.u+G**H!%GHty%/GH2rhQ2Q
Haskell, 68 octets
Probablement plus golfable, en particulier la première rangée. Ceci définit une fonction
s
qui prendn
et retourne len
numéro du fusil de chasse.Explication
La fonction d'assistance
#
prend deux nombresn
etk
renvoie lek
nombre e dans la liste définie en appliquant l'opération d'échange de paires à chaquen
nombre. Par exemple, l'appliquer aux 20 premiers nombres avec lesn = 4
rendements suivants:Le résultat de
s n
est obtenu en réduisant ("pliage") la liste[2..n]
par la fonction de second ordre(.).(#)
, qui prend un nombrem
et une fonctionf
(initialement la fonction d'identitéid
), et renvoie une fonction qui prendk
et retournef (m # k)
. Par exemple, dans le cas oùn = 4
la liste[2,3,4]
est réduite à une fonction qui prendk
et retourneid (4 # (3 # (2 # k)))
. Leid
n'est nécessaire que pour le cas de basen = 1
, où la liste est vide. Enfin, nous donnons cette fonction à l’entréek = n
, en obtenant len
numéro du fusil de chasse.la source
CJam, 32 octets
Juste en suivant les spécifications au point. Exécuter les instructions sur un ensemble plus volumineux afin de ne pas affecter le nième nombre.
Essayez-le en ligne ici
la source
Ruby, 92 octets
Mon premier effort de golf de code. Pas basé sur une autre réponse.
Maintenant que j’ai jeté un coup d’œil aux autres, j’ai remarqué que la plupart ne définissaient qu’une fonction, et non un programme complet qui accepte les entrées et produisait des sorties. L'OP a demandé un programme complet avec entrée et sortie. Est-il d'usage d'ignorer de telles exigences?
84 octets
Après avoir examiné d'autres réponses et réalisé qu'une solution itérative est possible.
la source
ARGV
à la solution$*
magique globale. 2. Leto_s
est inutile. 3. Au lieu d’affecter àd
àn
sur une ligne séparée, il suffitd=n=...
de supprimer un personnage. Beau travail pour votre premier golf! :)n+=
ligne sont inutiles et vous==0
pouvez modifier les deux occurrences de en toute sécurité<1
.Python 2,
9779 caractèresIl détermine pour chaque index la valeur correcte en recherchant récursivement le nombre à l'envers. L'algorithme a été découvert indépendamment.
edit: Maintenant, il n’imprime que le
n
numéro th à la place des premiersn
numéros. Bien sûr, une approche itérative serait plus courte, mais je ne veux pas copier le code de Sp3000.la source
g(i,i)
partie particulièrement agaçante cependant ...print
déclaration.Haskell, 79 octets
Utilisation:
p 66
quelles sorties145
Pas grand chose à expliquer: la fonction
#
calcule de manière récursive le numéro du fusil de chasse à la positioni
du pass
.p n
renvoie le nombre à la positionn
du pasn
.la source
k, 41 octets
{{x+$[y!x;0;$[2!_x%y;y;-y]]}/[x;|2+!x-1]}
{...}
lambda, x et y sont les premier et deuxième arguments implicites$[b;t;f]
opérateur ternaire, évalue b suivi de t / f respectivementb!a
un modulo b_
étage, jette le résultat de la division sur un%
division{...}/[x;y]
prime {...} avec x et applique sur la liste y, est équivalent à f [f [.. f [f [x; y0]; y1]; .. yn-1]; yn]|
sens inverse!
Fonction iota, générer la liste 0 à n-1la source
Common Lisp,
11391(itératif: 91)
(original, récursif: 113)
Exemple
Avec la version récursive:
Des tests
Contrôles et mesures pour la version itérative:
la source
Mathematica,
5349 octetsJ'ai décidé de jouer au golf avec mon implémentation de référence. Le
∣
est le symbole Unicode pour "divise" et compte pour 3 octets. Sinon, cela utilise le même algorithme que tout le monde.Il définit une fonction non nommée qui prend
n
comme paramètre unique et renvoie len
numéro du fusil de chasse.la source
GolfScript, 27 caractères
Explication
Si
f(i, n)
est la valeur à la positionn
après lesi-1
transformations, on aoù
^
dénote bitwise xor; donné l'entréen
, nous voulons calculerf(n, n)
.La conversion d'une fonction récursive en une boucle est sans intérêt; ce qui est intéressant est la façon dont
peut être réécrit. L’approche la plus évidente consiste à dire qu’il doit être
pour certains
g
. Évidemmentg
alterne entre1
et-1
, puisque les positions changent alternativement de haut en bas; depuisg(1) = 1
(car1
swaps jusqu'à2
), nous avonsoù
**
dénote une exponentiation. Les économies finales proviennent de la réécriture de cetteDissection
la source
u-G*H^_!%GH/GHrhQ2Q
Si vous ne voulez pas poster cela vous-même, dites-le moi / ajoutez-le à la réponse CW.CJam, 24 octets
Démo en ligne
Ceci est un port de ma réponse GolfScript , empruntant la boucle de la réponse de Martin à CJam et exploitant l'
divmod
opérateur de CJam . ( J'ai dit que ce serait utile!).la source
Julia,
6157 octetsCela crée une fonction non nommée qui prend un seul argument
n
et renvoie len
numéro du fusil de chasse. Pour l'appeler, donnez-lui un nom, par exemplef=n->(...)
.Exemples:
Actuellement, ceci est basé sur la réponse en Python de @ Sp3000 . Je reviendrai bientôt sur ce point car il doit exister un moyen plus rapide de procéder de la sorte à Julia par rapport à ce que j'ai fait ici. Toute entrée est la bienvenue, comme toujours.
la source
GML, 76 octets
Informations sur le GML
la source
CJam,
2827 octetsC’est donc un peu gênant ... avant de poster ceci, j’ai essayé de jouer au golf moi-même et j’ai atteint 30 octets dans CJam. Aucune des réponses existantes n'a encore battu. Entre temps, j'ai également réussi à supprimer trois octets supplémentaires. Il y a une solution Pyth plus courte dans un commentaire, mais rien n’a été posté dans une réponse, alors la voici. Peut-être que cela inspire les personnes APL / J à essayer un peu plus fort (ou que quelqu'un publie réellement la solution Pyth) avant que je n'accepte ma propre réponse. ;)
Testez-le ici.
Explication
la source
J,
3432 octetsJe vais essayer de jouer au golf un peu plus et ajouter quelques explications plus tard.
Essayez-le en ligne ici.
la source
TI-Basic 83/84, 40 octets
Informations sur TI-Basic
la source
Ruby,
5747 octetsCeci est essentiellement SP3000 solution Python de (avec la suggestion de xnor ) traduit à Ruby. Je pourrais probablement jouer au golf dans quelques endroits cependant.
la source