Il y a N portes et K singes. Au départ, toutes les portes sont fermées.
Tour 1: Le 1er singe visite chaque porte et fait basculer la porte (si la porte est fermée, elle est ouverte; si elle est ouverte, elle se ferme).
Tour 2 : Le 1er singe visite chaque porte et bascule la porte. Ensuite, le 2ème singe visite toutes les 2 portes et fait basculer la porte.
. . .
. . .
Round k: Le 1er singe visite chaque porte et fait basculer la porte. . . . . . . . . . Le kième singe visite chaque kième porte et fait basculer la porte.
Entrée: NK (séparé par un seul espace)
Sortie: numéros de porte ouverts, séparés chacun par un seul espace.
Exemple :
Entrée: 3 3
Sortie: 1 2
Contraintes :
0 <N <101
0 <= K <= N
Remarque :
Supposons que N portes sont numérotées de 1 à N et K singes sont numérotés de 1 à K
Celui avec le code le plus court gagne. Afficher également la sortie pour N = 23, K = 21
la source
n=k=3
ne sortirait pas1 2
si mal ... et 5 sorties1 2 4
il y a un motif mais c'est beaucoup moins évident que ça.Réponses:
APL,
322826Explication
{+/0=⍺|⍨⍳⍵}
est une fonction qui renvoie le nombre de fois que la porte⍺
(argument de gauche) est basculée sur round⍵
(argument de droite), ce qui équivaut au nombre de facteurs⍺
qui est ≤⍵
:⍳⍵
Générer un tableau numérique de 1 à⍵
⍺|⍨
Calculer le⍺
module pour chaque élément de ce tableau0=
Passez à 1 où il y avait un 0 et un 0 pour tout le reste+/
Additionner le tableau résultantLa fonction extérieure:
(⍳⍺)
,⍳⍵
Générer des tableaux de 1 à N et 1 à K∘.{...}
Pour chaque paire d'éléments des deux tableaux, appliquez la fonction. Cela donne une matrice de nombre de basculements, chaque rangée représente une porte et chaque colonne représente un rond.+/
Additionnez les colonnes. Cela donne un tableau du nombre de fois que chaque porte est basculée sur tous les tours.2|
Module 2, donc si une porte est ouverte, c'est un 1; s'il est fermé, c'est un 0.(...)/⍳⍺
Enfin, générez un tableau de 1 à N et sélectionnez uniquement ceux où il y a un 1 dans le tableau à l'étape précédente./⎕
Enfin, insérez la fonction entre les nombres de l'entrée.ÉDITER
,↑⍳¨⍳⍵
Générez tous les "singes" (si K = 4, alors c'est1 0 0 0 1 2 0 0 1 2 3 0 1 2 3 4
)⍳⍵
Tableau de 1 à⍵
(K)⍳¨
Pour chacun d'entre eux, générez un tableau de 1 à ce nombre,↑
Convertissez le tableau imbriqué en matrice (↑
), puis démêlez-le en un tableau simple (,
)(,↑⍳¨⍳⍵)∘.|⍳⍺
Pour chaque nombre de 1 à⍺
(N), modifiez-le avec chaque singe.0=
Changez pour un 1 où il y avait un 0 et un 0 pour tout le reste. Cela donne une matrice de bascules: les lignes sont chaque singe à chaque tour, les colonnes sont des portes; 1 signifie une bascule, 0 signifie pas de bascule.+⌿
Additionnez les lignes pour obtenir un tableau de nombre de fois que chaque porte est basculéeLes autres pièces ne sont pas modifiées
ÉDITER
Utilisez XOR Reduce (
≠⌿
) au lieu de sum et mod 2 (2|+⌿
)la source
{}/
au lieu de simplement prendre N et K comme arguments pour le dfn?i←⍳⍺
GolfScript, 33 caractères
Si les portes étaient numérotées en commençant par zéro, cela économiserait 3 caractères.
Exemples (en ligne ):
la source
Mathematica, 104 caractères
Exemple:
la source
{n,k}=%~Read~{Number,Number}
.Rubis, 88
Basé sur la réponse de @ manatwork.
Ces globales louches cassent toujours la coloration syntaxique!
la source
count
bit pourrait être encore amélioré, je souhaite que ruby ait une#sum
méthode intégrée pour des choses comme ça:>Python 3,
9784Si un singe apparaît dans un nombre pair de tours, cela ne change pas du tout. Si un singe apparaît un nombre pair de fois, c'est la même chose qu'exactement un tour.
Ainsi, certains singes peuvent être laissés de côté, et les autres n'ont qu'à changer de porte une fois.
Sortie pour
23 21
:la source
range(2-K%2,K+1,2)
àrange(K,0,-2)
.for
boucle par unewhile
boucle:while K>0:r^=set(range(K,N+1,K));K-=2
R - 74
Simulation:
la source
javascript
148127voici une (minuscule) version lisible:
DEMO violon
je dois noter qu'il commence à compter à partir de 0 (techniquement, une erreur au coup par coup)
la source
b=Array(n);
Cela initialise votre tableau en tant que longueur n remplie d'indéfini. ! undefined est vrai, donc la première passe de singe va tout transformer en vérité.+1
JavaScript, 153
Sortie pour N = 23, K = 21:
Testé dans Chrome, mais n'utilise pas de nouvelles fonctionnalités ECMAScript de fantaisie donc devrait fonctionner dans n'importe quel navigateur!
Je sais que je ne gagnerai jamais contre les autres entrées et que @tryingToGetProgrammingStrainght a déjà soumis une entrée en JavaScript, mais je n'obtenais pas les mêmes résultats pour N = 23, K = 21 que tout le monde obtenait cela, alors j'ai pensé que je voudrais essayer ma propre version.
Edit : source annotée (en regardant à nouveau, j'ai repéré des endroits pour enregistrer encore 3 caractères, donc ça peut probablement être encore amélioré ...)
la source
+1
Ruby - 65 caractères
Voici le calcul, en pseudo-code:
Si vous n'êtes pas convaincu que l'expression de s (d) est correcte, regardez-la de cette façon:
la source
n
etk
viennent, cependant? Et la sortie semble être séparée par des sauts de ligne plutôt que par des espaces.PowerShell: 132
Code golf:
Code non golfé, commenté:
la source
Powershell, 66 octets
Script de test:
Production:
la source