O objetivo deste desafio é encontrar a direção e a área delimitada por um loop.
Entrada:
Uma grade retangular consistindo inteiramente desses caracteres: ^v<>
(Opcionalmente, você também pode receber as dimensões da grade antes da própria grade em decimal com um prefixo, sufixo e caractere separador de sua escolha.)
Um loop na grade é um conjunto dos caracteres acima mencionados, de modo que um aponte para o próximo, aponte para o próximo e, eventualmente, aponte para o primeiro caractere. Por exemplo:
<>>v> >>v
^^<>v ^ >v
>^<<< ^<<<
>^<v>
A grade esquerda é a entrada de amostra; a grade direita é o loop isolado.
A grade de entrada não conterá loops ou um loop; você não precisa se preocupar com nenhum caso em que a grade contenha mais de um loop.
Saída:
Se a grade não contiver loop, produza X
.
Se a grade contiver duas setas apontando uma para a outra, produza 0
.
Se a grade contiver um loop no sentido anti-horário, conte os caracteres delimitados pelo loop, incluindo a borda. Saída esse número.
Se a grade contiver um loop no sentido horário, siga o mesmo processo para o loop no sentido anti-horário, mas emita o negativo desse número. Por exemplo, a grade de entrada acima teria uma saída de -11
: 10 provenientes do próprio loop e 1 do caractere incluído pelo loop.
Isso é código-golfe . O menor código vence.
Casos de teste:
<<^
^>v
^v<
Saída X
.
<<<<
><<<
>>^>
Saída 0
.
<>^^<
>>>v>
<^^>v
<^>>v
>^<<<
Saída -15
.
v<<<<
>v>>^
v<^<<
>>>>^
Saída 20
.
Respostas:
C #, 604 bytes
Programa completo, aceita entrada (layout delimitado por linha, sem dimensões) de STDIN, sai para STDOUT.
O programa funciona primeiro lendo o layout, escusado será dizer, e depois iterando sobre cada célula. Em seguida, corremos uma 'cobra' de cada célula, que segue as setas até que ela escapa da borda ou se infiltra. Se ele se infiltrar, sabemos que encontramos um loop (ou uma daquelas "> <" coisas)) e também sabemos quanto da cobra está no loop.
Quando sabemos que temos um loop, sabemos quais células estão no loop e criamos um mapa de cada célula (+1, por razões) para ele próprio
-1
(significa que está no loop) ouW
(toda a largura) se estiver no limite (ou no +1 (que está no índiceW
) para simplificar ainda mais).Enquanto fazemos isso, também encontramos a direção que o 'último' elemento do loop possui (ou seja, o último elemento do loop na última linha que possui elementos do loop). Este elemento deve ser um "<" ou um "^", e isso nos diz a velocidade (CW / CCW) do loop (traduzido para -1 / + 1).
Em seguida, executamos um passe de conjunto separado, que atribui todos os elementos que estão fora do loop ao
W
conjunto. Subtraímos então quantos deles existem deW
para obter o número contido no loop e no loop. Se esse número for menor que 3, substituí-lo por 0. Multiplicamos isso pela velocidade do relógio, definimos como resultado e, de alguma forma, escapamos dos loops for, onde o resultado é gerado.Se, no entanto, a maioria dos itens acima nunca acontece (porque nenhuma cobra se encontra), o resultado permanece como "X" e é gerado.
fonte