Dado um conjunto de contornos 2d fechados e não sobrepostos (separados por pelo menos um espaço, mesmo nas diagonais) com setas orientadas consistentemente na mesma direção no sentido horário ou anti-horário (cada contorno tem sua própria direção) e um número positivo n
, mova as setas n
passos ao longo dos contornos na respectiva direção. As setas são representadas por > v < ^
respectivamente para as direções direita, baixo, esquerda e cima. Lá, os outros caracteres são -
(horizontal), |
(vertical) e +
(canto). Quando uma flecha está em um canto, ela mantém sua direção atual e a altera somente após a virada.
Sempre haverá um segmento reto (ou um espaço) entre dois cantos (como +-+
na horizontal e similar na vertical) - em outras palavras, as U
curvas acentuadas são proibidas. Os segmentos entre os cantos são verticais ou horizontais e a dobra em um canto é sempre 90 graus.
Entrada:
- um número inteiro positivo -
n
- número de etapas - uma representação ASCII dos contornos - pode ser uma cadeia de linhas múltiplas, uma lista de cadeias, uma lista de caracteres e assim por diante.
Saída:
Os mesmos contornos com todas as setas mudaram as n
etapas na direção geral de cada contorno.
Casos de teste:
1
Entrada:
n
= 1
+----->->
| |
| v---+
| |
+---<-------+
Saída:
+------>+
| v
| +>--+
| |
+--<--------+
2)
Entrada:
n
= 2
+-----+ +---+
| | | |
+-->--+ | v
| |
+--->---+ |
| |
+------<<---+
Saída:
+-----+ +---+
| | | |
+---->+ | |
| |
+----->-+ v
| |
+----<<-----+
3)
Entrada:
n
= 3
+---+ +---+ +-------+
| | | v | |
^ | | | +-<-+ |
| | ^ | | v
| +---+ +-->----+ |
| |
| +-------+ +---+ |
| | | v | |
+---+ +---+ +---+
Saída:
+>--+ ^---+ +-------+
| | | | ^ |
| | | | +---+ |
| | | | | |
| +---+ v----->-+ |
| |
| +-------+ +---+ v
| | | | | |
+---+ +-<-+ +---+
4)
Entrada:
n
= 1
+--+
| |
| +---+
| |
+----+ |
| |
+-+
Saída:
+--+
| |
| +---+
| |
+----+ |
| |
+-+
5)
Entrada
n
= 4
^>>>>
^ v
^ v>>>>
^ v
<<<<<<<<v
Saída:
^>>>>
^ v
^ v>>>>
^ v
<<<<<<<<v
6
Entrada:
n
= 1
^->
^ v
<<v
Saída:
^>+
^ v
<<v
Escreva uma função ou um programa que resolva a tarefa acima. O código mais curto em bytes em todos os idiomas vence. Não desanime pelas línguas do golfe. A explicação do algoritmo e do código é altamente apreciada.
There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
Respostas:
JavaScript (ES6),
210 ... 182180 bytes(m)(n)
Experimente online!
Quão?
Você pode seguir este link para ver uma versão formatada da fonte.
Embrulho
Atualizar método
Não podemos mover com segurança cada flecha uma de cada vez, porque correríamos o risco de sobrescrever flechas não atualizadas por flechas atualizadas. Em vez disso, primeiro removemos todas as setas e calculamos suas novas posições. Aplicamos as novas posições pela segunda vez.
As novas posições são aplicadas apenas fazendo
eval(n)
.instruções
$
Cantos
+
-
|
$
"$"
"$"
"$"
Versão animada
Mostrar snippet de código
fonte
K (ngn / k) ,
183 161157 bytesExperimente online!
{
}/
quando chamado com um argumento à esquerda int n, isso aplicará a função em{
}
n vezes ao argumento à direitaA:"^>v<"
Setas; flechasD,:-D:(-1 0;!2)
Y, x para as 4 direções cardeaiss:(#x;#*x)
forma da entrada: altura, largurac:~^x
countours - matriz booleana mostrando onde estão os não-espaçosr:" -+|"c*+/'3'0,c,0
recrie a matriz de caracteres com um countour, mas sem setas, contando self + upper + lower para cada célulac
e substituindo 1->-
, 2->+
, 3->|
t:A?,/x
tipos de setas: 0 1 2 3 para^>v<
, todas as outras células são representadas como0N
(nulas)p:+s\&~^t
coordenadas das setas$[#p
;;:r]
se não houver flechas, retorner
q:+p+/:D@4!(t^0N)+/:0 1 3
todas as 3 novas posições possíveis para cada seta - se continuar avançando, se virar à esquerda e se virar à direitaq:q@'*'&'~^x ./:/:q
para cada flecha, escolha a primeira opção que caia no contorno@[,/r;s/+q;:;A@D?q-p]
achatarr
e colocar as setas em suas novas posições e com suas novas direçõess#
remodelar para a forma originalfonte
Carvão , 105 bytes
Experimente online! Link é a versão detalhada do código. Inclui 22 bytes usados para evitar a necessidade de um formato de entrada complicado. Explicação:
Insira convenientemente os contornos e o número de etapas.
Os caracteres de direção são usados várias vezes para que a string seja armazenada em cache aqui. O índice de um caractere de direção nessa sequência é conhecido como sua direção.
Imprima os contornos originais sem mover o cursor.
Faça um loop sobre os caracteres no contorno.
Se os caracteres atuais são um caractere de direção ...
... salve a direção e a posição em uma lista ...
... e substitua o caractere pelo caractere de linha apropriado.
Caso contrário, imprima o caractere e passe para o próximo caractere.
Faça um loop sobre as posições salvas.
Salte para a posição salva.
Extraia a direção salva.
Faça um loop sobre o número apropriado de etapas.
Encontre a direção do próximo passo, que é qualquer direção que não seja inversa nem vazia.
Dê um passo nessa direção. (Os índices de direção do carvão para o
Move
comando são duas vezes o valor da minha direção.)Imprima o caractere de direção apropriado.
fonte
APL (Dyalog Unicode) , SBCS de 111 bytes
Experimente online!
semelhante à minha resposta k
fonte