Je construis un robot lego géant et j'ai besoin de générer des rapports de vitesse particuliers en utilisant un ensemble d'engrenages. J'ai beaucoup de vitesses avec les tailles d'engrenages lego courantes: 8, 16, 24 ou 40 dents. Écrivez un programme que je peux utiliser où je saisis un rapport d'engrenage et le programme me dit quelle combinaison de vitesses je dois utiliser pour obtenir le rapport demandé.
Le rapport d'entrée sera spécifié sur l'entrée standard (ou l'équivalent de votre langue) avec deux entiers séparés par deux points. Un ratio a:b
signifie que l'arbre de sortie doit tourner des a/b
temps aussi rapides que l'arbre d'entrée.
La sortie vers la sortie standard doit être une seule ligne contenant une liste séparée par des espaces des rapports d'engrenage, sous la forme x:y
où x
est la taille de l'engrenage sur l'arbre d'entrée et y
est la taille de l'engrenage sur l'arbre de sortie. Vous devez utiliser le nombre minimum de vitesses possible pour le rapport donné. Chacun x
et y
doit être l'un des 8,16,24,40
.
exemples:
1:5 -> 8:40
10:1 -> 40:8 16:8
9:4 -> 24:16 24:16
7:1 -> IMPOSSIBLE
7:7 ->
6:15 -> 16:40
Si le rapport de vitesse souhaité est impossible, imprimez "IMPOSSIBLE". Si aucun engrenage n'est requis, imprimez la chaîne vide.
C'est le golf de code, la réponse la plus courte l'emporte.
1:5 -> 8:40
et10:1 -> 40:8
logique, mais pas les autres.1:5
signifie que l'arbre de sortie tourne 5 fois plus lentement, et un engrenage à 8 dents sur l'entrée et un engrenage à 40 dents sur la sortie rendent cela possible.10:1 -> 40:8 16:8
pas ce que vous avez dit. Et les autres vous déroutent?9:4
est implémenté en faisant3:2
deux fois.3:2
est implémenté à l'aide de24:16
.7:7
est identique à1:1
, il ne nécessite donc aucun engrenage à implémenter.Réponses:
Python - 204
Ok, je vais commencer:
modifier:Pour «optimiser» la sortie, cela peut être ajouté avant la
print
déclaration,ce qui porte le total à 266 caractères , je crois.
la source
<1
peut remplacer==0
. , Aussiif b:a=...return a
peut êtrereturn b and...or a
.23:12
.elif i!=1:return[]
à l'original résout le problème mais en introduit un autre.$ python gears.py <<< 21:28
=>24:16
.. Je vais y jeter un œil. On dirait que le problème n'était pas si simple après tout: DI Je pense que le code doit être encore plus long, ou j'ai besoin d'une autre approche.6:15
peut être fait avec16:40
mais votre code revient24:40 16:24
.Perl -
310 306 294 288272Je suis un peu rouillé avec Perl et je n'ai jamais fait de golf de code ... mais pas d'excuses. Le nombre de caractères est sans saut de ligne. Utilisation de perl v5.14.2.
J'ai hâte de recevoir des critiques et des indices. Ce n'est pas si facile de trouver des trucs et astuces pour le code-golf (en perl).
la source
$1:$2 ->
, ils ne sont pas requis dans la sortie.$a[$_]=8 if!$a[$_];
à$a[$_]||=8;
($v,$n)=split/:|\s/,<>;
(non testé).swi-prolog,
324250248204 octetsProlog réussit assez bien à résoudre un problème comme celui-ci.
L'entrée est transmise en tant que paramètre de terme au prédicat
m
. La sortie est écrite sur stdout. Désolé pour le «vrai» qui suit. c'est juste la façon dont l'interprète m'a fait savoir que tout allait bien.la source
C,
246216213 octetsDans une tentative (futile) de battre ma propre solution Prolog, j'ai complètement réécrit la solution C.
Ma solution C d'origine (246 octets):
C'était un bon exercice pour prouver que cela peut se faire sans construire de listes.
la source
Pyth, 101 octets
(Presque certainement pas en compétition car il utilise une langue plus récente que sep / 2012)
Une implémentation de la réponse python de @daniero mais semi-optimisée pour Pyth.
Essayez-le ici
Ou testez chaque cas
la source
ES6, 230 octets
Un de mes golfs les plus longs, donc j'ai dû faire quelque chose de mal ... Ungolfed:
la source