Objetivo
Nesta competição, você recebe uma sala aleatória com uma vela dentro. O objetivo é escrever o programa mais curto (isto é, golfe) que determina quais partes da sala são iluminadas pela vela, substituindo as manchas escuras por @
s. O programa deve ocupar um espaço do STDIN, com a saída impressa em STDOUT.
Exemplo de Entrada / Sala
+------+
| C |
| +--+
| \ |
+---------+
A vela é representado com um C
, e as paredes / espelhos são representados com |
, -
, /
, ou \
. As próprias paredes são espelhos. Os cantos da sala são representados com a +
.
Os quartos nunca terão paredes diagonais e a luz nunca poderá escapar da sala.
Além disso, o primeiro caractere de uma linha sempre fará parte do muro da sala. O último caractere absoluto em cada linha será a parede oposta da sala. Nenhum personagem entre esses dois estará fora da sala.
Luz e Reflexão
A vela emite oito feixes de luz (do tipo laser) em oito direções básicas: N, S, E, W, NE, SE, SW e NW. Esses raios de luz refletem nos espelhos, conforme descrito abaixo:
Old Direction of Travel | Mirror | New Direction
N S E W NE SE SW NW / E W N S -- -- -- --
N S E W NE SE SW NW \ W E S N -- -- -- --
N S E W NE SE SW NW | - - - - NW SW NE SW
N S E W NE SE SW NW - - - - - SE NE SW NE
A -
representa a luz que está sendo absorvida. A luz é sempre absorvida pelos C ou + 's. É importante observar que as luzes refletem-se no espelho somente quando ele ocupa o mesmo espaço que o espelho. Essas regras são muito mais fáceis de entender quando você desenha a reflexão no papel.
Saída de exemplo
Como saída, o programa deve imprimir uma imagem da sala iluminada, com pontos escuros escritos como @
, pontos claros deixados em branco e espelhos não afetados. Para o exemplo acima, a saída seria:
+------+
| C |
|@ @ +--+
| @\ |
+---------+
Isso significa que, se você extrair os raios de luz, eles nunca alcançarão os espaços marcados com @
.
Mais exemplos
Input:
+-----+
| |
| |
| C |
| |
| |
+-----+
Output:
+-----+
| @ @ |
|@ @|
| C |
|@ @|
| @ @ |
+-----+
Input:
+-----+
| \ |
|/ C \+-+
| |
| \ - ++
+------+
Output:
+-----+
| \ @|
|/ C \+-+
| @|
| @\ -@++
+------+
@
também não deveria ser ?