Inspirado en el desafío de relaciones de engranajes de Lego de Keith Randall.
Yo también planeo construir un robot gigante de lego que eventualmente pueda destruir a los otros robots en la competencia nunca antes mencionada. * En el proceso de construcción del robot, usaré muchos trenes de engranajes para conectar diferentes partes del robot Quiero que me escribas el programa más corto que me ayudará a construir los trenes de engranajes complejos que se requieren para una tarea tan compleja. Por supuesto, solo usaré engranajes con radios 1, 2, 3 y 5 unidades arbitrarias de lego.
Cada engranaje en el tren de engranajes tiene una coordenada entera específica en una cuadrícula 2D. La primera marcha se encuentra en (0,0) y la marcha final se ubicará en coordenadas no negativas. La ubicación y el tamaño del primer y último engranaje se proporcionarán como entrada, su programa debe indicar qué engranajes van a dónde rellenar los huecos.
Además, su programa debe usar el mínimo número posible de engranajes en el tren de engranajes. Menos engranajes / tren = más trenes ** = robot de destrucción más grande y mejor.
La entrada consistirá en una línea:
X,Y,B,A
X e Y son las coordenadas de la marcha final. La primera marcha siempre se encuentra en (0,0). B y A son los radios de los engranajes final e inicial, respectivamente. Para agregar alguna dificultad, debe asegurarse de que el engranaje de salida gire en la dirección correcta. Si A y B tienen el mismo signo, entonces el engranaje de salida debe girar en la misma dirección, y se debe usar un número impar de engranajes. Si tienen signos opuestos, entonces se debe usar un número par de engranajes.
La salida debe ser una lista de la ubicación X, la ubicación Y y los radios de cada marcha adicional, una marcha por línea. Si hay varias soluciones de engranaje mínimo, imprima solo una de su elección. El orden de los engranajes en la salida no importa.
Ejemplos (pueden ser posibles soluciones más equivalentes):
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!
Aquí están las soluciones a los ejemplos anteriores, visualizadas:
Hasta donde yo sé, ningún problema es imposible a menos que los dos engranajes de entrada se superpongan o se conecten directamente. No tendrás que lidiar con esto.
Este es el código de golf, gana la respuesta más corta.
* Un futuro KOTH, alguien?
**¡¡CHÚ CHÚ!!
Respuestas:
C #, 660 bytes
Pruébalo en línea
¡Esto fue muy divertido! Programa completo, acepta entrada de STDIN, salida a STDOUT. La salida son los engranajes en orden desde el final hasta el comienzo. Uso:
Realiza una simple búsqueda de Breadth First, que resuelve un problema de 4 velocidades en menos de un segundo. El factor de ramificación no es realmente tan grande, por lo que debería ser bueno para considerablemente más (no lo probé realmente). Lamentablemente utiliza Linq.
La
Q
cadena es una tabla de todas las conexiones de engranajes permitidas (es decir, anr=3
y se conectan a unr=1
ifdx=4
ydy=0
) en un cuadrante, que luego se gira para encontrar los otros. Cada conjunto de 3 bytes es eldx
,dy
y la información de radio para una conexión legal. La elección de(
un desplazamiento fue muy deliberada: por una vez fue divertido elegir un personaje ASCII para buenas propiedades, en lugar de tratar desesperadamente de encontrar buenas propiedades para los caracteres ASCII impuestos.Probablemente pueda leer mejor la entrada, pero todavía no he tenido suerte, sobre todo porque el Linq se paga por la necesidad de una lista. También estoy muy decepcionado por el código de rotación, siento que eso podría hacerse en una cantidad considerablemente menor de bytes.
Código formateado y comentado con
Q
generador:fuente