El desafío es implementar un programa de trazado de rayos bidimensional, basado en texto.
Las fuentes de luz blanca son @
símbolos. R
, G
y B
son filtros de luz. /
y \
son espejos con 80% de reflectividad. ?
Es un sensor de luz. >
, <
, ^
Y V
combinar la luz en la dirección apropiada (por ejemplo, si uno rojo y otro verde entró en una >
la luz se emite hacia la derecha y sería amarillo). Otros personajes que no son espacios en blanco absorben toda la luz. Los @
símbolos emiten luz en cuatro direcciones.
Cuando se ejecuta el programa, debe producir una salida igual que la entrada, pero con rayos trazados. Debido a que esto es bidimensional, y garantizo que en la entrada no se cruzarán nunca los rayos, no habrá ningún problema con eso. Cada rayo debe estar representado por una letra; r = rojo, g = verde, b = azul, c = cian, m = magenta, y = amarillo, w = blanco. No habrá colores ternarios, nunca. La carcasa es importante para diferenciarla de la entrada. Después de esa salida, los valores de luz capturados por los signos de interrogación (en orden de su aparición, de izquierda a derecha de arriba a abajo) se deben generar como porcentajes y colores. Por ejemplo, esta entrada:
/ @
-
\R> ?
@B/
Debería dar la salida:
/wwwwwwwwwwwwwwwwww@w
w -
w\R>mmmmmmmmmmmmmmmmm?
w b
@B/
#1: 72% Magenta
Otro punto importante a tener en cuenta: cuando se combinan dos colores usando un "prisma" (las flechas), la fuerza de la luz combinada se convierte en la fuerza promedio de los dos. La salida debe ser exactamente como se especifica (p. Ej. #X: [x] [x] x% Color ).
Si su idioma no puede leer desde STDIN y escribir en STDOUT, cree una función (anónima o lambda cuando esté disponible) que acepte la entrada como argumento y devuelva el resultado.
Se pueden omitir las directivas para el compilador, las estructuras requeridas o recomendadas para todos o la mayoría de los programas creados en el lenguaje, etc. Por ejemplo, #include
y las using
directivas (pero no #define
) pueden eliminarse en lenguajes de estilo C, #/usr/bin/perl -options
en Perl y
Module Module1
Sub Main()
End Sub
End Module
en VB.NET, por ejemplo. Si importa espacios de nombres o agrega directivas de inclusión, anótelas en su respuesta.
¿Ya es bastante difícil? :)
>
está capturando la luz que pasa directamente. Y si law
de arriba pasa por esoR
, también lab
de abajo. Finalmente (creo), te equivocas con los rayos que no se cruzan. Para dar un ejemplo de una línea, ¿para qué sería la salida correcta@R> B@
?@
en la parte inferior izquierda emite luz en las cuatro direcciones, ¿no? Entonces, en particular, emite esow
. Y no he roto ningún espacio, al menos como se muestra en Chromium. En cuanto a pasar directamente, mi edición puede aclarar eso.Respuestas:
Python,
602559614 caracteresEditar: corregido para que no necesite espacios finales.
fuente
F#
fuente