Oh não, estou perdido no caminho de encontrar os grandes tesouros de Marakov! E tudo o que tenho são essas instruções inúteis que parecem S10R10D30
... Não faço ideia do que elas significam! Pode me ajudar?
Desafio
Dadas as direções consistindo em N E S W U D L R 1 2 3 4 5 6 7 8 9 0
, indica a que distância estarei de onde comecei quando sigo essas instruções (ou seja, Distância Euclidiana).
N E S W
refira-me a virar para o norte, leste, sul e oeste;
U D L R
refira-me a girar para cima, para baixo, para a esquerda e para a direita (assim NR
é o mesmo que E
e assim é SL
; SLL
é o mesmo que N
). Up significa seguir em frente; Para baixo significa virar.
Após cada direção da letra, haverá um número, que é o quão longe eu irei nessa direção. N10E20
significa ir para o norte 10 unidades, depois virar para o leste e ir para o leste 20 unidades.
Detalhes da entrada
- A entrada sempre começará com uma das
NESW
opções (portanto, as entradas em branco não precisam ser contabilizadas). - São permitidas instruções de duas letras seguidas.
NE
deve ser interpretado: "Vire para o norte e depois imediatamente para o leste". É o mesmo que apenasE
.SLL
é "Vire para o sul e, imediatamente, vire à esquerda duas vezes". É o mesmo queN
. - Todos os números serão inteiros (observe como
.
não está no conjunto de caracteres) - A entrada será composta apenas por
NESWUDLR1234567890
(se precisar de algo mais, como '\ 0' em C; ou se as funções de entrada do seu idioma tiverem uma nova linha à direita, ou algo assim, tudo bem.)
Resultado
- A norma.
- Se estiver usando uma função, deve gerar um tipo de dados numérico ou uma string.
- Deve ter precisão de 3 casas decimais.
Casos de teste
N10
:10
N10E10
:14.1421
N10S10
:0
NSEWUDLR10
:10
N100RR20E300D40L12
:268.7452
ERR10LL20UN30D100
:70.71067
O programa Python sem imaginação que eu costumava fazer isso.
Ganhando
Isso é codegolf, então os bytes mais baixos depois de uma semana vencem!
NESWUDLR1234567890
?Respostas:
(Go) Ruby , 111 bytes
Experimente online!
Recebe entrada em STDIN e em STDOUT.
Basicamente, essa abordagem usa números complexos para armazenar a posição atual, bem como uma pilha (
c
), contendo deslocamentos para cada direção. Se houver uma direçãoURDL
, a pilha é girada pelo índice da direção nessa sequência; se a direção estiverNESW
, ela será girada pelo índice da direção nessa sequência, mais o índice da1
pilha. Isso transforma uma rotação relativa à posição atual em uma rotação relativa à posição de 1. De qualquer forma, a parte superior da pilha é multiplicada pelo número de etapas na direção e adicionada à posição atual.fonte
Python 3 , 137 bytes
Experimente online!
-9 bytes graças a Jonathan Allan
fonte
else:v+=d*n;n=0;h='NUERSDW'.find(i);d=d**(h%2)*1j**(~-h/2)
- observe queL
pode ser cortado no final da cadeia de caracteres de busca aqui porque-1%2
iguais7%2
e1j**(-1)
iguais1j**3
.for i in input()+'U':x="NUERSDW0123456789".find(i);c=x<7;v+=d*n*c;n=[n*10+x-7,0][c];d=[d,d**(x%2)*1j**(~-x/2)][c]
JavaScript (ES6),
148142140138137134 134 bytesMostrar snippet de código
-2 bytes: use em
.search()
vez de.indexOf()
( @Shaggy )-1 byte: Reorganize o programa para remover os parênteses ( @Shaggy )
-3 bytes: use em
.replace()
vez de.match().map()
( @ThePirateBay )fonte
search
vez deindexOf
?a
- se para omap
, substituindo o,
anteriorMath
por&&
e removendo os parênteses.Perl 5 , 149 + 1 (-p) = 150 bytes
Experimente online!
Explicado:
fonte