Estoy construyendo un robot lego gigante y necesito generar algunas relaciones de engranaje particulares usando un conjunto de engranajes. Tengo muchos engranajes con los tamaños de engranajes de lego comunes: 8, 16, 24 o 40 dientes. Escriba un programa que pueda usar donde ingrese una relación de engranaje y el programa me dice qué combinación de engranajes debo usar para obtener la relación solicitada.
La relación de entrada se especificará en la entrada estándar (o el equivalente de su idioma) con dos enteros separados por dos puntos. Una relación de a:b
significa que el eje de salida debe girar a/b
veces más rápido que el eje de entrada.
La salida a la salida estándar debe ser una sola línea que contenga una lista de relaciones de engranajes separadas por espacios, en forma de x:y
dónde x
está el tamaño del engranaje en el eje de entrada y y
el tamaño del engranaje en el eje de salida. Debe usar el mínimo número posible de engranajes para la relación dada. Cada uno x
y y
debe ser uno de 8,16,24,40
.
ejemplos:
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 la relación de transmisión deseada es imposible, imprima "IMPOSIBLE". Si no se requieren engranajes, imprima la cadena vacía.
Este es el código de golf, gana la respuesta más corta.
1:5 -> 8:40
y10:1 -> 40:8
tiene sentido pero los demás no tanto.1:5
significa que el eje de salida gira 5 veces más lento, y un engranaje de 8 dientes en la entrada y un engranaje de 40 dientes en la salida hacen que eso suceda.10:1 -> 40:8 16:8
no es lo que dijiste. ¿Qué hay de los demás que te confunde?9:4
Se implementa haciendo3:2
dos veces.3:2
se implementa usando24:16
.7:7
es lo mismo que1:1
, por lo que no requiere engranajes para implementar.Respuestas:
Python - 204
Ok, iré primero:
editar:Para 'optimizar' la salida, esto se puede agregar antes de la
print
declaración,trayendo el total hasta 266 caracteres , creo.
fuente
<1
puede reemplazar==0
. Además,if b:a=...return a
puede serreturn b and...or a
.23:12
.elif i!=1:return[]
al original resuelve el problema pero presenta otro.$ python gears.py <<< 21:28
=>24:16
.. Voy a investigarlo. Parece que el problema no fue tan simple después de todo: DI Creo que el código tiene que ser aún más largo, o necesito otro enfoque.6:15
puede hacerse con16:40
pero su código vuelve24:40 16:24
.Perl -
310 306 294 288272Estoy un poco oxidado con Perl y nunca hice un código de golf ... pero no tengo excusas. El recuento de caracteres no tiene saltos de línea. Usando perl v5.14.2.
Espero con interés las críticas y sugerencias. No es tan fácil encontrar consejos y trucos para code-golf (en perl).
fuente
$1:$2 ->
, no es necesario en la salida.$a[$_]=8 if!$a[$_];
a$a[$_]||=8;
($v,$n)=split/:|\s/,<>;
(sin probar).swi-prolog,
324250248204 bytesProlog hace bastante bien en resolver un problema como este.
La entrada se pasa como un parámetro de término para predicar
m
. La salida se escribe en stdout. Perdón por el "verdadero" final; esa es solo la forma en que el intérprete me hizo saber que todo estaba bien.fuente
C,
246216213 bytesEn un intento (inútil) de superar mi propia solución Prolog, reescribí completamente la solución C.
Mi solución C original (246 bytes):
Fue un buen ejercicio demostrar que se puede hacer sin crear listas.
fuente
Pyth, 101 bytes
(Es casi seguro que no compite en el concurso ya que usa un idioma más reciente que septiembre / 2012)
Una implementación de @daniero 'python answer pero semi-optimizada para Pyth.
Pruébalo aquí
O prueba cada caso
fuente
ES6, 230 bytes
Uno de mis campos de golf más largos, así que debo haber hecho algo mal ...
fuente