Le défi
Écrivez une fonction qui prend deux entiers positifs n et k comme arguments et retourne le numéro de la dernière personne restante sur n après avoir compté chaque k -ième personne.
C'est un défi de code-golf, donc le code le plus court l'emporte.
Le problème
n personnes (numérotées de 1 à n ) sont debout dans un cercle et chaque k - ième est compté jusqu'à ce qu'une seule personne est disponible (voir le correspondant article wikipedia ). Déterminez le nombre de cette dernière personne.
Par exemple, pour k = 3, deux personnes seront ignorées et la troisième sera décomptée. C'est-à-dire que pour n = 7, les nombres seront comptés dans l'ordre 3 6 2 7 5 1 (en détail 1 2 3 4 5 6 7 1 2 4 5 7 1 4 5 1 4 1 4 ) et donc la réponse est 4 .
Exemples
J(7,1) = 7 // people are counted out in order 1 2 3 4 5 6 [7]
J(7,2) = 7 // people are counted out in order 2 4 6 1 5 3 [7]
J(7,3) = 4 // see above
J(7,11) = 1
J(77,8) = 1
J(123,12) = 21
{k block}
sur[0..n-1]
vous obtenirg(0,k) 0 k
pour commencer? Désolé, si je poste ces questions au mauvais endroit.0 1 block
. Très commodément, cela se trouve êtreg(1, k) (2-1) block
. Donc ça commenceg(1,k) 1
plutôt queg(0,k) 0
. Ensuite, après avoir exécuté le bloc, il pousse l'élément suivant du tableau (2
) et exécute à nouveau le bloc, etc.Minsky Register Machine (25 états sans interruption)
Pas techniquement une fonction, mais c'est dans un paradigme informatique qui n'a pas de fonctions en soi ...
Il s'agit d'une légère variation par rapport au scénario de test principal de mon premier défi d'interprétation MRM :
Entrée dans les registres
n
etk
; sortie dans le registrer
; on suppose quer=i=t=0
lors de l'entrée. Les deux premières instructions d'arrêt sont des cas d'erreur.la source
k=1
alorsr=0
. Hmm, je dois y penser à nouveau ...i
suffit de compter de2
àn
tandis que ser
trouve le registre qui accumule le résultat.Python, 36
J'ai également utilisé la formule de wikipedia:
Exemples:
la source
Mathematica,
3836 octetsMême formule Wikipédia:
la source
If[#<2,1,Mod[#0[#-1,#2]+#2,#,1]]&
C, 40 caractères
C'est à peu près la formule que l'article wikipedia lié ci-dessus donne:
Pour plus de variété, voici une implémentation qui exécute réellement la simulation (99 caractères):
la source
j(n,k){return--n?(j(n,k)+k-1)%-~n+1:1;}
.dc, 27 octets
Utilise la récurrence de l'article Wikipedia. Explication:
la source
J, 45 caractères
Exécute la simulation.
Alternativement, en utilisant la formule (31 caractères):
J'espère que cela ne dérange pas Howard d'avoir ajusté légèrement le format d'entrée pour l'adapter à un verbe dyadique en J.
Usage:
la source
GolfScript,
3224 octetsUtilisation: attend les deux paramètres n et k dans la pile et laisse la valeur de sortie.
(merci à Peter Taylor d'avoir suggéré une approche itérative et de nombreux autres conseils)
L'ancienne approche (récursive) de 32 caractères:
Ceci est mon premier GolfScript, alors faites-moi part de vos critiques.
la source
1-
a un opcode spécial(
. De même1+
est)
. Vous n'avez pas à utiliser de caractères alphabétiques pour le stockage, vous pouvez donc utiliser par exemple^
au lieu deJ
et pas besoin d'espace après. Vous avez beaucoup plus de$
s que d'habitude dans un programme bien joué: demandez-vous si vous pouvez les réduire en utilisant une combinaison de\@.
.$
références.g
de l'article Wikipedia, et utilisez,
et/
.{,{\2$+\)%}*)\;}:f;
Assurez-vous de comprendre pourquoi cela fonctionne;)k
à l'intérieur de la boucle, puis 2 autres pour la supprimer à la fin, nous pouvons le tirer à l'intérieur en utilisant+
pour descendre à 17 caractères:{{@+\)%}+\,*)}:f;
je doute que cela puisse être amélioré.R, 48
Version en cours d'exécution avec des exemples: http://ideone.com/i7wae
la source
Groovy, 36 octets
la source
Haskell, 68
Fait la simulation réelle. Manifestation:
la source
Scala, 53 octets
la source
C, 88 caractères
Fait la simulation, ne calcule pas la formule.
Beaucoup plus longue que la formule, mais plus courte que l'autre simulation C.
Remarques:
1. Alloue de la mémoire et ne libère jamais.
2. Alloue
n*8
au lieu den*4
, car j'utilisep[n]
. Pourrait allouer(n+1)*4
, mais c'est plus de caractères.la source
C ++, 166 octets
Golfé:
Non golfé:
la source
J
fonction, en utilisant l'opérateur ternaire.intn
dans votre version golfée ne compilera pas#include <list>
J, 8 octets
la source
Rubis, 39 octets
Version en cours d'exécution avec cas de test: http://ideone.com/pXOUc
la source
Q, 34 octets
Usage:
la source
Rubis, 34 octets
la source
Haskell, 29
En utilisant la formule de wikipedia.
la source
JavaScript (ECMAScript 5), 48 octets
Utilisation d'ECMAScript 5 car il s'agissait de la dernière version de JavaScript au moment où cette question a été posée.
Version ES6 (non concurrente), 33 octets
Explication
Pas grand chose à dire ici. J'implémente juste la fonction que l'article Wikipedia me donne.
la source
05AB1E , 11 octets
Essayez-le en ligne!
la source
8ème , 82 octets
Code
SED (Stack Effect Diagram) est:
n k -- m
Utilisation et explication
L'algorithme utilise un tableau d'entiers comme celui-ci: si la valeur des personnes est 5 alors le tableau sera [1,2,3,4,5]
la source
J , 24 octets
Essayez-le en ligne!
Une approche itérative basée sur la solution de programmation dynamique.
Explication
la source
J , 19 octets
Essayez-le en ligne!
Comment ça marche
la source
Fléchette , 33 octets
Essayez-le en ligne!
la source
Japt , 15 octets
Essayez-le en ligne!
Un octet pourrait être enregistré par l' indexation 0 k , mais ce n'est pas un index, j'ai donc décidé de ne pas le faire.
Explication:
la source
Japt
-h
, 10 octetsEssayez-le
la source
Powershell, 56 octets
Important! Le script s'appelle récursivement. Enregistrez donc le script en tant que
f.ps1
fichier dans le répertoire courant. Vous pouvez également appeler une variable de bloc de script à la place d'un fichier de script (voir le script de test ci-dessous). Ces appels ont la même durée.Script de test:
Sortie:
la source