¡Mi robot ha hecho un cortocircuito de alguna manera y se alejó al azar de mi laboratorio!
Afortunadamente, cada vez que hace esto, se inicia su secuencia de apagado, dándole el tiempo suficiente para girar al azar y correr en la dirección que enfrenta durante cinco rondas antes de que se apague. Sus funciones de giroscopio y acelerómetro aún transmiten los datos al laboratorio mientras aún está encendido.
Los datos siempre vendrán en forma de cinco conjuntos de dos números, por ejemplo.
12:234,-135:47,-68:230,140:324,127,87
Su misión, los golfistas, es a) simular la frenética carrera y la secuencia de giro del robot mostrando cinco conjuntos de números en forma de a1:d1,a2:d2,a3:d3,a4:d4,a5:d5
donde a
(n) es el ángulo en el sentido de las agujas del reloj (en grados) de modo -179<=a<=+180
que el robot gire desde su rumbo actual ( inicialmente está en rumbo cero antes de que se vuelva loco y gire por primera vez), y d
(n) es la distancia en pies que ha corrido antes del siguiente cambio de rumbo que es tal que 0<=d<=500
pies; y b) un rumbo calculado del laboratorio (que también enfrenta un rumbo de cero), la distancia en pies (se recomienda una precisión de hasta 3 decimales, -5 bytes si lo hace) y el rumbo de orientación (en grados) de dónde está mi robot cuando se apaga.
Ejemplo fácil:
Data: 0:1,45:1,90:1,90:1,90:1
Heading: 0
Distance: 1
Orientation: -45
Los giros y distancias al azar son solo eso, al azar. No se deben codificar los valores establecidos, debemos ver la aleatoriedad en acción dentro del código.
Restricciones a la aleatoriedad: sin referencias basadas en reloj o fecha, necesitamos ver una random
referencia nativa dentro del código. Cada vez que ejecute este código, la aleatoriedad debe presentarse con la posibilidad de mostrar 1 de 360 ángulos posibles de giro con cada vuelta. Entonces, el robot puede girar -36 grados en una vuelta y puede girar +157 grados en la siguiente, seguido de otra vuelta de +2 grados por otra vuelta de -116 grados y una vuelta final de +42 grados en la vuelta final. Deben ser posibles al menos 360 valores distintos (entre -179 y +180 grados inclusive) con cada generación de ángulo aleatorio.
Restricciones a la carrera de distancia: de manera similar, hay 501 distancias posibles que el robot puede correr (entre 0 y 500 pies inclusive), por lo que espero que la aleatoriedad también esté disponible al determinar la distancia de carrera del robot. El robot podría correr teóricamente 45, 117, 364, 27 y 6 pies con cada una de sus rondas respectivas ...
Los datos que se le proporcionen siempre estarán en valores enteros ... el robot girará en rangos enteros de grados y se ejecutará en rangos enteros de distancia. Sin embargo, los valores de salida serán flotantes ...
Este es el código de golf. El código más corto gana ... ¡Ahora ve a buscar mi robot!
PD: En referencia a mi "Precisión de hasta 3 lugares decimales", si puede proporcionar el rumbo (en grados, a un MÍNIMO de 3 lugares decimales) y una distancia en pies (también precisa también a un mínimo de 3 lugares decimales) obtendrá un bono de -5 bytes).
-180 < a <= +180
como el<
signo por sí solo significa menos pero no incluye AFAIK ...Respuestas:
Perl 6:
188184 caracteres - 5 = 180 puntosGolf con espacios en blanco:
Sin golf:
Esto convierte los datos en números complejos con
unpolar
, pone la suma de ellos$complex
y luego obtiene las coordenadas polares como$dist
,$ang
.El ángulo acumulativo
$cum-angle
se recopila porque los ángulos son relativos al robot a medida que se mueve a través del laboratorio y porque necesitamos el ángulo final del robot en nuestra salida.Salida de muestra:
El único truco real que usa el golf es que (mal) usa las 3 variables especiales de Perl 6 con buenos resultados:
$!
se usa para radianes ↔ grados$_
contiene los datos, y cualquier cosa que parezca un solitario.method()
realmente significa$_.method()
(excepto dentro delmap {…}
bloque, donde$_
realmente toma el valor de los pares de números que componen los datos)$/
contiene lo que hay en la versión sin golf($dist, $ang)
.$0
y en$1
realidad significa$/[0]
, es decir$dist
, y$/[1]
, es decir,$ang
fuente
$_=((-179..180).pick=>(^501).pick)xx 5;my$o;$/=([+] .map:{unpolar .value,$o+=.key/($!=180/pi)}).polar;say "Data: {.fmt("%d:%d",",")} Heading: {$1*$!} Distance: $0 Orientation: {$o*$!}"
.map:
es obligatorioRubí,
274252249245214211207204202 caracteres (-5 = 197)¿Cómo PHP venció a Ruby en el recuento de char? >: O Debo encontrar alguna manera de jugar al golf más ...
Editar: superé la respuesta de PHP, ¡pero el usuario que la escribió me ayudó a hacerlo! Ve a votarlo; se lo merece :-P
Otra edición: Gah! ¡Me pasó de nuevo! Eres un oponente muy digno, @MathieuRodic; felicidades, tengo que dejarte ganar ;-)
Código no protegido (y versión
ligeramentemás antigua):Salida de muestra:
fuente
Orientation
sección.% 360
?M=Math
yP=M::PI
reemplazando el código en consecuencia, y un carácter más al deshacerse del espacio después del segundoputs
.PHP -
238232221212203199 caracteres(pruébelo aquí: http://ideone.com/dNZnKX )
Versión sin golf:
(pruébelo aquí: http://ideone.com/1HzWH7 )
fuente
Python -
264259256258 - 5 = 253 caracteres(pruébelo en http://ideone.com/FicW6e )
Versión sin golf:
(pruébelo en http://ideone.com/O3PP7T )
NB: muchas respuestas incluyen -5 en su título, mientras que su programa no representa la distancia con precisión de hasta 3 decimales ...
fuente
Python 301-5 = 296
Nada demasiado elegante aquí, más bien detallado. Este es un problema para el que no estoy contento de que las funciones trigonométricas de Python funcionen en radianes.
fuente
Python 2 =
376319 caracteres (-5 para distancia = 314)salida de muestra
fuente