TL; DR: Dada uma matriz de caracteres e um robô na posição inicial da matriz, escreva um algoritmo que possa ler uma sequência com movimentos (
F
para "avançar",R
"girar 90 graus à direita" eL
"girar 90 graus" esquerda ") e calcule a posição final do robô. Mais detalhes no texto completo.
Temos em casa um dispositivo programável muito simples para crianças: um pequeno veículo com botões para fazer o veículo avançar, virar 90 graus à esquerda ou virar 90 graus à direita. Algo semelhante a isso:
Também temos um tapete de espuma com letras como esta:
O objetivo de tudo isso é ensinar às crianças o alfabeto e os rudimentos da programação, todos de uma vez.
O desafio
Suponha que organizamos aleatoriamente nosso tapete de espuma assim:
+---+---+---+---+---+---+---+
| E | R | L | B | I | X | N |
+---+---+---+---+---+---+---+
| O | A | Q | Y | C | T | G |
+---+---+---+---+---+---+---+
| F | W | H | P | D | Z | S |
+---+---+---+---+---+---+---+
| K | V | U | M | J |
+---+---+---+---+---+
| |
+---+
Suponhamos também que modificamos o veículo para que, quando programamos um comando "avançar", o veículo avance exatamente o tamanho de um quadrado no tapete. Portanto, se o veículo estiver na U
praça e for para o norte, ele para exatamente na P
praça.
Todas as instruções são fornecidas ao veículo antes de começar a se mover e são elas:
F
: O veículo avança para a próxima praça.R
: O veículo gira 90 graus no lugar certo (sem movimento adicional).L
: O veículo vira 90 graus à esquerda em seu lugar (sem movimento adicional).
Uma vez que as instruções são dadas, você pode pressionar o botão "GO" e enviar o veículo para uma determinada posição, pois seguirá todas as instruções na ordem especificada. Assim, você pode pedir ao garoto para inserir as instruções necessárias para que o veículo vá para uma determinada carta.
Você deve escrever o programa / função mais curto que processa um string
(parâmetro de entrada) com um conjunto de instruções e calcula a letra em que o veículo para (saída string
).
Detalhes:
- O veículo sempre começa no quadrado em branco na parte inferior e voltado para o norte (em direção ao
U
quadrado). - A cadeia de entrada irá conter apenas as letras
F
,R
,L
eG
(para o botão "Go"). Você pode usar letras minúsculas para o tapete e as instruções, se preferir. - O algoritmo deve obedecer a todas as instruções na string antes da primeira
G
(todas as instruções depois disso são ignoradas quando o veículo começa a se mover). - Se o veículo sair do tapete a qualquer momento (mesmo que a sequência de entrada não tenha sido completamente processada), o algoritmo deverá retornar a sequência
Out of mat
. - Caso contrário, o algoritmo deve retornar a carta em que o veículo parou. O ponto de partida conta como um
caractere (ou uma sequência vazia).
Exemplos:
Input: FFG
Output: P
Input: FRFRFG
Output: Out of mat
Input: RRFFG
Output: Out of mat
Input: FFFRFFLFG
Output: X
Input: FFFRFFLF
Output: <-- Nothing or a whitespace (the robot has not started moving)
Input: FFFRRFFFG
Output: <-- Nothing or a whitespace (the robot has returned to the starting point)
Input: RRRRRLFFFLFFRFRFGFFRRGRFF
Output: L (Everything after the first G is ignored)
Este é o código-golfe , por isso pode ganhar o programa mais curto para cada idioma!
fonte
@
sendo a posição inicial e espaços que são fora do tapete, então esta configuração seriaERLBIXN\nOAQYCTG\nFWHPDZS\n KVUMJ \n @
(com espaçamento diferente, SE estraguei tudo)Respostas:
JavaScript (ES6),
194176169163 bytesSalvou alguns bytes graças a @Luke e @Arnauld.
Ungolfed:
fonte
false
por!1
every
método lida com isso.(s,p=35,d=3,t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11')=>[...s].every(i=>i=='L'?d--:i=='R'?d++:i=='F'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:1:0)?'':t[p]||'Out of mat'
[1,8,-1,-8]
matriz, obrigado!Python 2 , 235 bytes
Experimente online!
fonte
Python 3 ,
226231241 bytesSegunda edição; deve funcionar agora. Novamente, muita otimização a ser feita.
Experimente online!
fonte
Wolfram Language / Mathematica, 300 bytes
Ungolfed:
fonte