Dada a arte ASCII de dois vetores, encontre a magnitude e o grau do vetor resultante.
Entrada
Isso pode ser recebido via STDIN, lido de um arquivo local ou fornecido através de uma chamada de função. Aqui está um exemplo de uma entrada de dois vetores:
^------>
|
|
|
x
Isso representa uma mudança de 4 unidades ao norte e 7 unidades a leste. O ponto inicial de cada entrada será representado por um x
(decimal120
).
Todos os vetores são linhas horizontais ou verticais.
Cada vetor possui um desses quatro pontos finais:
^v<>
e é composto de um traço (-
decimal 45) ou uma barra vertical (|
decimal 124).Os pontos vazios no plano são preenchidos com espaços (
, decimal 32).
A entrada pode ser única
x
.Os vetores adjacentes são sempre perpendiculares entre si.
Todos os vetores são tip-to-tail.
Resultado
Esse será o deslocamento do ponto resultante (distância do ponto inicial) e o grau em que ele foi movido, em relação ao ponto inicial.
Para a entrada acima, a saída deve ser 8.06
unidades e 60.3
graus. Cada um deve ter exatamente 3 números significativos. Aqui estão alguns exemplos de números com três dígitos significativos:
- 1,00
- 60,1
- 453
- 7.08
- 4.50
- 349
Todas as medidas da unidade serão <= 999
.
Esses números devem ser impressos no formato abaixo. Isso está usando os números acima.
8.06 units @ 60.3 degrees
Isso pode ser seguido por um único espaço à direita ou nova linha.
Se a entrada for única x
, sem deslocamento e, portanto, sem ângulo de deslocamento, a saída deverá ser uma linha vazia (um único caractere de nova linha) ou no seguinte formato:
0 units @ - degrees
Se você está tentando se qualificar para o bônus, a direção também deve ser -
.
Caso os bônus 2, 3 ou ambos sejam concluídos, a saída deve seguir o modelo abaixo e obedecer às mesmas restrições que as anteriores.
8.06 units @ 60.3 degrees NE
Os graus devem ser medidos de acordo com o plano padrão.
90
135 | 45
\|/
180 ---x---- 0
/|\
225 | 315
270
0
graus é leste, 1 - 89
graus é nordeste, 90
é norte, etc.
Bónus
A seguir, vale um total de -50%.
Receba um bônus de -10% para cada vetor adicional que puder ser manuseado. Este bônus pode ser aplicado até 3 vezes. Os vetores nunca se sobrepõem ou se cruzam.
Receba um bônus de -10% se sua saída incluir a direção cardinal do ângulo (norte, sul, leste, oeste).
Receba um bônus de -10% se sua saída incluir as direções intermediárias do ângulo (nordeste, noroeste, sudeste, sudoeste).
Exemplos
Dentro:
x---->
|
v
Fora:
5.39 units @ 338 degrees
Opcionalmente SE
Dentro:
<--------------^
|
|
x
Fora:
15.3 units @ 169 degrees
Opcionalmente NW
Dentro:
x
|
|<-----^
| |
v------>
Fora:
2.24 units @ 297 degrees
Opcionalmente SE
Exemplos (vários vetores)
Dentro:
x--->
|
|
v----------->
Fora:
16.3 units @ 349 degrees
Opcionalmente SE
Dentro:
<-------^
| |
| |
v |
|
|
x
Fora:
8.54 units @ 159 degrees
Opcionalmente NW
Dentro:
^-->
| |
| v
|
<--------x
Fora:
6.32 units @ 162 degrees
Opcionalmente NW
x
? Qual é o limite entre o Norte e o Noroeste?x-->
. Os vetores podem se cruzar?x
. Pode haver mais de dois (se tentar completar o bônus), mas não menos. Estou trabalhando em exemplos para várias entradas de vetor. Em nenhuma entrada os vetores cruzarão. @ThomasKwaRespostas:
JavaScript (ES6), 305 bytes - bônus de 50% = pontuação 152,5
Explicação
A entrada deve ser preenchida com espaços. Usa todos os bônus.
Teste
Mostrar snippet de código
fonte
Python 2, 238,5 (
594562482477-50%) bytesExplicação
Localiza as posições inicial e final observando cada caractere na entrada.
Iniciar é
x
O fim é encontrado olhando cada flecha (
<>^v
) e seus vizinhos. Se os vizinhos continuarem vetores, ignore. Senão, este é o fim.Olhe para os vizinhos perpendiculares à direção da seta.
Se eles contêm uma linha perpendicular, então é um vetor contínuo.
Exemplos (
_
indica espaço):Como o ponto final é encontrado, pode haver qualquer número de vetores ( bônus de 30% ).
fonte
\n
como quebras de linha ...input()
e o empacotamento correspondente da entrada com "", mas não parece haver uma regra contra isso!