Recentemente, houve uma neve grande e minha entrada de automóveis precisa de neve. Se o soprador de neve passar por alguma área que já tenha soprado, essa área terá soprado neve e precisará ser soprado novamente. E, é claro, o soprador de neve não pode começar no meio da entrada da garagem, ele precisa começar na minha garagem, onde está guardado.
Mais formalmente:
Seu programa usa uma forma padrão de entrada como uma string ou matriz multidimensional que se parece com o seguinte:
XXXXOOOOXXXX
X X
X X
XXXXXXXXXXXX
X
representa uma área que não pode ser explodido-neve, O
representa uma área, onde o ventilador de neve pode ser implantado, e espaços vazios representam áreas onde há neve. Você pode escolher valores diferentes, se desejar.
Seu programa deve gerar algo como o seguinte:
XXXX*%OOXXXX
Xv<<<^<<<<<X
X>>>>>>>>>^X
XXXXXXXXXXXX
O soprador de neve começa no *
. O *
sempre aponta para o espaço não-garagem mais próximo. A <
, >
, v
, e ^
todos representam indicações de onde a próxima instrução é. Eles apontam o soprador de neve para onde ir. Quando um ponteiro aponta para o %
, o ventilador voltou à garagem e toda a entrada de automóveis deve estar limpa.
O soprador de neve deve passar por toda a entrada de automóveis. O caminho do soprador de neve nunca pode se sobrepor. Entrada impossível não deve ser fornecida.
Como eu não quero ficar fora mais do que preciso e não preciso gastar muito tempo digitando, o programa deve ser o mais curto possível. O código mais curto vence!
Casos de teste:
Esses casos de teste podem ter várias respostas corretas. Forneci soluções possíveis abaixo de cada caso de teste.
Caso de teste 1: aquele fornecido no exemplo.
Caso de teste 2:
XOOOOOX
X X
X X
X XXXXXXXX
X X
X X
XXXXXXXXXXXXXX
X*OOO%X
Xv>>>^X
Xv^<<<X
Xv>>>^XXXXXXXX
Xv^<<<<<<<<<<X
X>>>>>>>>>>>^X
XXXXXXXXXXXXXX
Caso de teste 3:
XOOOOX
X X
X X
X XXX
X X
X X
XXXXXX
XOO%*X
X>>^vX
X^v<<X
X^vXXX
X^>>vX
X^<<<X
XXXXXX
Caso de teste 4:
XXXXXXXXXXXXX
O X
O X X
O X X
O X
XXXXXXXXXXXXX
XXXXXXXXXXXXX
*>>>>>>>>>>vX
Ov<v<Xv<<<<<X
Ov^v^X>>>>>vX
%<^<^<<<<<<<X
XXXXXXXXXXXXX
O
sempre estarão em uma linha contínua reta? 2) que osO
s sempre estarão na borda do array? 3) que não haverá espaços à esquerda? 4) que não haverá espaços à direita (ou seja, no caso de teste 2, algumas linhas são mais curtas que outras)?Respostas:
JavaScript (ES6),
346310299298297296283 bytesMuito hacky em alguns lugares, mas eu queria divulgar o código. Entrada como uma matriz de caracteres 2D, saída modificando a referida matriz.
Versão ungolfed
Este é o mesmo algoritmo exato, exceto por alguns truthy / magic Falsas com
+' '
estarNaN
sendo Falsas (e mais alguns), algumas variáveis golfe e usandoif
s, em vez de?:
,||
e&&
.fonte