Cette question trouve son origine dans ce fil reddit par l'utilisateur taho_teg de reddit mais elle est étendue à un «puzzle» plus général.
Vous disposez d'une centrifugeuse à 24 trous pour les flacons uniformément répartis dans un cercle autour de l'axe central. Si vous avez maintenant un certain nombre de flacons et que vous souhaitez démarrer la centrifugeuse, vous devez vous assurer qu'ils sont placés de manière équilibrée. Les seuls nombres de flacons que vous ne pouvez pas équilibrer sont 1 et 23. Vous pouvez par exemple équilibrer 4 évidemment, mais vous pouvez également équilibrer 5 en faisant un «triangle» avec 3 flacons et en plaçant les deux autres sur deux sites opposés.
Objectif
Vous devez écrire un programme qui accepte le nombre de trous (qui sont uniformément répartis dans un cercle autour de l'axe de rotation) de votre centrifugeuse en entrée, et qui génère une liste de nombres de flacons qui ne peuvent pas être équilibrés dans la centrifugeuse.
Vous devez faire le calcul et ne pouvez pas simplement coder en dur les solutions précalculées.
L'entrée et la sortie doivent être implémentées de manière à ce que le code de programme ne doive pas être modifié pour appeler le programme pour différentes entrées. Il est également acceptable d'écrire une fonction (ou une construction similaire dans votre langage) qui peut être appelée via une console.
Sachez également que si vous avez 6 trous dans votre centrifugeuse, vous pouvez centrifuger 2 et 3 flacons, mais vous ne pouvez pas équilibrer 5 car le «triangle» et les deux opposés se chevauchent à un moment donné. Un autre exemple serait pour n = 15 vous ne pouvez pas équilibrer 11 flacons, vous pouvez équilibrer 6 et 5 flacons, mais la combinaison de ces solutions se chevauchent (ce n'est bien sûr pas encore le critère qu'il est impossible de le faire).
Mise à jour
Il semble que certaines personnes n'aient pas compris l'exemple donné, j'ai donc fait un graphique ici. VEUILLEZ rédiger une brève description du fonctionnement de votre algorithme ainsi que quelques exemples de sorties pour vérification. Veuillez inclure les exemples suivants:
n = 1, 6, 10, 24, 63, 100 = 10^2, 163 (prime), 40320 = 8!, 65536=2^2^2^2^2, 105953 (prime)
Notez que 40320 et 65536 produiront d'énormes listes, ce sera peut-être une bonne idée d'indiquer uniquement la longueur de ces listes.
Si vous connaissez des chiffres intéressants à ajouter à cette liste, faites-le moi savoir! L'algorithme devrait fonctionner au moins jusqu'à n = 1'000'000.
Exemples de sorties:
Ce sont des exemples de sorties, mais peut-être défectueux car je viens de les calculer manuellement.
1: 1
2: 1
3: 1,2
4: 1,3
5: 1,2,3,4
6: 1,5
7: 1,2,3,4,5,6
8: 1,3,5,7
9: 1,2,4,5,7,8
10:1,3,7,9
11:1,2,3,4,5,6,7,8,9,10
12:1,11
13:1,2,3,4,5,6,7,8,9,10,11,12
14:1,3,5,9,11,13
15:1,2,4,7,8,11,13,14
Allusion
Si vous avez une centrifugeuse à n trous, et que vous ne pouvez pas équilibrer par exemple 6 flacons, vous ne pourrez pas non plus équilibrer n-6 flacons - c'est essentiellement la même tâche d'équilibrer m flacons sur une centrifugeuse vide ou d'équilibrer une centrifugeuse remplie en enlevant m flacons. Donc, si vous avez le numéro m dans votre liste, vous devrez également inclure nm .
7 spoke wheel
et regardez.Réponses:
Sage -
102104/115Pourquoi utiliser la théorie des nombres, quand il y a force brute?
Pour un nombre donné de flacons, cela va dans tous les sens pour positionner les flacons et calculer leur centre de masse à l'aide d'arithmétiques complexes. Si le centre de masse est nul pour aucune de ces manières, le nombre est renvoyé.
Malheureusement, cela ne fonctionne pas dans certains cas (10,14), car Sage ne parvient pas à simplifier certaines expressions à zéro (ce qui peut être lié à ce bogue ). On pourrait considérer cela comme une faille de l'interprète et non du programme et dire quand même que l'algorithme et le programme sont bien.
L'alternative suivante de 113 caractères repose sur des flottants au lieu de symboles et ne souffre pas de ces problèmes:
Sortie test de la version 113 caractères (
for n in range(14): print n,v(n)
):Je ne voulais pas attendre le temps d'exécution pour plus
n
.Cela provient de la solution Python suivante. L'arithmétique exacte et ne pas avoir à importer certains modules est quelque chose.
Python -
173 154156Sortie test de cette variante (
for n in range(24): print n,v(n)
):Je ne voulais pas attendre le temps d'exécution pour plus
n
.la source
Lua - 197
Méthode non brutale, elle crée une liste de facteurs et les exclut. Il exclut également les nombres qui peuvent être obtenus avec l'ajout de ces facteurs tant que le plus grand facteur utilisé est inférieur à la quantité de trous non remplis. L'un est toujours imprimé et n'est pas utilisé dans l'algorithme.
Exemple de sortie: (certains sont mis sous forme de plages afin que je ne dépasse pas la limite de caractères)
la source
Pyth -
3937 octetsUne traduction directe de la réponse python de @ Wrzlprmft.
Explication et probablement plus de golf bientôt.
Essayez-le en ligne ici .
la source