Il y a une question sur ce site qui est similaire à cette question, mais j'ai ajouté une touche.
Vous disposez de trois entrées, le nombre de personnes dans le cercle n , la k personne -ème compté à chaque étape, et la q personne -ème qui survit. Les personnes dans le cercle sont numérotées de 1 à n .
Par exemple, dans un cercle de 20 personnes, la 20e personne à survivre est la toute première personne enlevée, le 19e survivant est la deuxième personne enlevée et ainsi de suite. Normalement, le problème de Josephus est de déterminer la dernière personne enlevée, appelée ici le premier survivant.
Écrivez le programme ou la fonction la plus courte qui, avec ces trois entrées, renvoie le nombre de la q- ème personne à survivre.
S'il y a des problèmes de clarté, faites-le moi savoir.
Quelques exemples:
>>> josephus(20, 3, 9)
4
>>> josephus(4, 3, 1)
1
>>> josephus(100, 9, 12)
46
Modifier: Supposons que toutes les entrées sont valides. Autrement dit, personne ne demandera 0 ou aucun nombre négatif et personne ne demandera le 20e survivant dans un cercle de 5 personnes (c'est-à-dire 1 ≤ q ≤ n)
Edit: j'accepterai une réponse à minuit UTC + 7 début décembre 2.
q=1
c'est exactement la même chose que la question liée de Josephus, non?Réponses:
Pyth, 16 octets
Essayez-le en ligne: démonstration ou suite de tests
L'entrée est de la forme
k<newline>n<newline>q
.Explication:
la source
Piet,
280273 codelsEdit: J'ai encore joué au golf, et je pense que je peux le jouer encore plus loin, mais c'est encore à venir. Pour l'instant, je suis juste content que ça marche, et que j'avais de la place pour le signer dans le coin en bas à gauche. Deux idées que j'ai pour enregistrer plus de codels sont a) pour changer les instructions de fin
pop, push 1, add, out num
(pop n, sortie r + 1) et b) pour dupliquer à nouveau dans le coin inférieur gauche pour enregistrer les codels dans la manipulation de la pile plus tard dans la boucle.L'image ci-dessus est mon code à 8 pixels par codel. En général, c'est le même algorithme que ma réponse Python, mais avec les entrées dans l'ordre de k , q , n . En pratique, il y a aussi beaucoup de manipulation de pile. Vous pouvez l' essayer ici en ouvrant l'image là-bas et en exécutant le code avec.
Explication
Il s'agit d'un dégonflage étape par étape de la solution.
la source
CJam,
222019 octetsCela lit l'entrée comme
q k n
. Essayez-le en ligne dans l' interpréteur CJam .Comment ça marche
la source
Golfscript,
585655353130 octetsEn supposant que les trois entrées sont déjà dans la pile, dans l'ordre n , k , q
Cette solution suppose que je dois me débarrasser de tout sauf de la réponse finale.
Comment ça marche
Voir
j(n,k,q)
dans ma solution Python 3 pour plus de détails.Edit 1: Utilisé la suggestion de @ Doorknob (Ajout d'un + pour obtenir toutes les entrées dans le tableau)
Anciennement,
Edit 2: Ajouté ~, selon les règles du wiki, et raccourci le code. Merci @Dennis
Anciennement,
Edit 3: implémenté un algorithme plus court.
Anciennement,
Edit 4: Compris que je pouvais utiliser
%
comme carte.Anciennement,
Édition 5: Édition mineure. Changement
2$
de@
faire[0..q-1]
et3$
de2$
récupérerk
. Sauvé une bouchéeAnciennement,
la source
\;\;\;\;
peut être remplacé par])\;
(encapsuler dans un tableau, annuler le droit, swap et pop).JavaScript (ES6), 56 octets
Non golfé
Fondamentalement, une adaptation JavaScript de la réponse Python de @ Sherlock9 .
Tester
la source
Mathematica, 50 octets
Une fonction anonyme. Prend les entrées dans l'ordre
q,n,k
.la source
C,
8173 octetsBasé sur l' implémentation Javascript de @ user81655 de ma réponse Python.
Modifier: supprimé i
Tester
la source
int
avant les noms des paramètres.Python 3,
726662 octetsUne fonction de programmation dynamique en 62 octets. Adapté de l'algorithme sur Wikipedia. Il y avait auparavant une implémentation directe de cet algorithme lorsque q = 1 (c'est-à-dire i = 1, r = 0) sur cette page, mais je vois que cela a été supprimé maintenant.
Edit 1: j'ai supprimé
i
pour enregistrer 4 octets. L'explication reste inchangée.Édition 2: erreur de calcul dans le nombre d'octets. J'utilisais
\r\n
pour EOL et je n'ai pas remarqué quand cela a ajouté 3 octets. J'ai réduit mon nombre d'octets en conséquence.Comment ça marche
Merci à @Dennis de m'avoir rappelé que je devrais expliquer mon code (ne serait-ce qu'implicitement, car il en a inclus un dans sa réponse). Si quelque chose n'est pas clair, faites-le moi savoir.
Modifier:
Anciennement,
Une fonction itérative qui est adaptée de Concrete Mathematics par Graham, Knuth et Patashnik. Bien que cet algorithme soit plus long, il est plus rapide pour les grands n et les petits k .
la source
+
.PHP, 71 octets
Basé sur les réponses de @ Sherlock9. Voir sa réponse Python pour l'algorithme.
Alternativement, voici mon approche naïve originale sans l'algorithme. Cela utilise un tableau pour marquer les personnes trouvées.
91 octets
la source
Haskell,
484743 octetsBasé sur un algorithme Haskell sur la page Rosetta Code de la fonction Josephus avec deux entrées. Les suggestions de golf sont les bienvenues.
Edit: Mes remerciements à nimi pour son aide au golf du premier algorithme en suggérant une version sans point, et pour son aide au golf du deuxième algorithme en me faisant savoir que le
until
mot - clé existe.Une version de l'algorithme à la fin de ma réponse Python adaptée de Concrete Mathematics par Graham, Knuth et Patashnik. Bien que cet algorithme soit plus long à 62 octets, et qu'il n'ait pas été étudié autant que le premier, il est plus rapide pour les grands
n
et les petitsk
.Non golfé:
Premier algorithme
Deuxième algorithme
la source
until
pour un (plus ou moins) traduction directe de la version Python du 2ème algorithme:(n#k)q|m<-k-1=1+n*k-until(>n*m)(\z-> -div(-z*k)m)(q*k-mod m q)
.foldl
des listes infinies et toutes sortes de choses. Merci de votre aide!GameMaker Language (GML), 88 octets
Basé sur la réponse de @ user81655
la source
Gelée ,
1413 octetsTryItOnline!
Comment?
la source
Rubis,
5348 octetsUn lambda.
Comment ça marche
la source