Inspiré des rapports de démultiplication Lego défi des de Keith Randall.
Moi aussi, je prévois de construire un robot lego géant qui sera éventuellement en mesure de détruire les autres robots dans la compétition sans précédent. * Dans le processus de construction du robot, j'utiliserai beaucoup de trains d'engrenages pour me connecter différentes parties du robot. Je veux que vous m'écriviez le programme le plus court qui m'aidera à construire les trains d'engrenages complexes qui sont nécessaires pour une tâche aussi complexe. Bien sûr, je n'utiliserai que des engrenages avec des rayons 1, 2, 3 et 5 unités lego arbitraires.
Chaque engrenage du train d'engrenages a une coordonnée entière spécifique sur une grille 2D. Le premier engrenage est situé à (0,0) et l'engrenage final sera situé à des coordonnées non négatives. L'emplacement et la taille des premier et dernier engrenages seront fournis en entrée, votre programme doit indiquer quels engrenages vont où combler les lacunes.
De plus, votre programme doit utiliser le nombre minimum de vitesses possible dans le train d'engrenages. Moins de vitesses / train = plus de trains ** = robot de destruction plus grand et meilleur.
L'entrée consistera en une ligne:
X,Y,B,A
X et Y sont les coordonnées de l'engrenage final. La première vitesse est toujours située à (0,0). B et A sont respectivement les rayons des vitesses finale et initiale. Pour ajouter une certaine difficulté, vous devez vous assurer que le pignon de sortie tourne dans le bon sens.Si A et B ont le même signe, alors le pignon de sortie doit tourner dans le même sens, et un nombre impair de vitesses doit être utilisé. S'ils ont des signes opposés, alors un nombre pair de vitesses doit être utilisé.
La sortie doit être une liste de l'emplacement X, de l'emplacement Y et des rayons de chaque engrenage supplémentaire, un engrenage par ligne. S'il existe plusieurs solutions à vitesse minimale, n'imprimez qu'une seule de votre choix. L'ordre des vitesses dans la sortie n'a pas d'importance.
Exemples (des solutions plus équivalentes peuvent être possibles):
in
4,0,1,1
out
2,0,1
in
7,7,-2,-2
out
4,3,3
OR
0,7,5
OR
the above reflected over y=x line
in
7,8,-1,2
out
7,0,5
7,6,1
OR
7,0,5
1,8,5
in
7,7,2,-2
out
4,-3,3
7,1,2
12,1,3
12,7,3
OR
any permutation of the above, or reflected over y=x line
Now you're thinking with gear trains!
Voici les solutions aux exemples ci-dessus, visualisées:
Pour autant que je sache, aucun problème n'est impossible à moins que les deux vitesses d'entrée se chevauchent ou se connectent directement. Vous n'aurez pas à vous en occuper.
C'est le golf de code, la réponse la plus courte l'emporte.
* Un futur KOTH, quelqu'un?
** CHOO CHOO !!
Réponses:
C #, 660 octets
Essayez-le en ligne
C'était très amusant !! Programme complet, accepte les entrées de STDIN, les sorties vers STDOUT. La sortie est les engrenages dans l'ordre de la fin au début. Usage:
Effectue une simple recherche de largeur, qui résout un problème à 4 vitesses en moins d'une seconde. Le facteur de branchement n'est pas vraiment grand, donc il devrait être bon pour beaucoup plus (pas vraiment testé). Malheureusement, il utilise Linq.
La
Q
chaîne est un tableau de toutes les connexions d'engrenages autorisées (c'est-à-dire unr=3
et se connecter à unr=1
sidx=4
etdy=0
) dans un quadrant, qui est ensuite tourné pour trouver les autres. Chaque ensemble de 3 octets estdx
,dy
et de l' information de rayon pour un lien juridique. Le choix d'(
un décalage était très délibéré: c'était amusant pour une fois de choisir un caractère ASCII pour de belles propriétés, plutôt que d'essayer désespérément de trouver de belles propriétés pour des caractères ASCII imposés.Je peux probablement faire un meilleur travail de lecture de l'entrée, mais je n'ai pas encore eu de chance, notamment parce que le Linq est payé par le besoin d'une liste. Je suis également très déçu par le code de rotation, j'ai l'impression que cela pourrait être fait en beaucoup moins d'octets.
Code formaté et commenté avec
Q
générateur:la source