Anexo , 80 bytes
V#Sum##{Chop[1-ToBase[22260446188,3],2][Sum@Ords=>MatchAll[_,/"[NS][WE]|."]%11]}
Experimente online!
Esta é uma função anônima que recebe um argumento de string.
Explicação
A primeira tarefa é implementar a fase de análise desta pergunta. Achei mais curto usar um Regex simples para analisar a entrada ( _
):
MatchAll[_,/"[NS][WE]|."]
Isso corresponde a todas as ocorrências da regex [NS][WE]|.
, como visto em muitas outras respostas. Isso produz avidamente as instruções solicitadas.
Agora, vamos aplicar uma função de hash a cada direção. Pegamos os pontos de código de cada direção e os somamos. Isso fornece o seguinte mapeamento:
Direction Ord-sum
E 69
N 78
S 83
W 87
NE 147
SE 152
NW 165
SW 170
Vamos tentar mapear esses valores para um domínio menor; módulo é útil para isso, e podemos demonstrar que o menor módulo que resulta em valores únicos para todas as entradas fornecidas é 11. Classificando pelos restantes, isso nos dá a seguinte tabela:
Direction Ord-sum % 11
NW 165 0
N 78 1
E 69 3
NE 147 4
SW 170 5
S 83 6
SE 152 9
W 87 10
Agora, temos uma correspondência de entrada, conforme codificada por Sum@Ords=>[...]%11
. Em seguida, temos que transformar esses restos em pontos. Vamos tentar derivar outro mapeamento, o que significa que a inserção de "valores de preenchimento esparso" em hashes que não correspondem a direções deve ser útil:
Direction Hash Coordinates
NW 0 [-1, 1]
N 1 [0, 1]
-- (2) [0, 0]
E 3 [1, 0]
NE 4 [1, 1]
SW 5 [-1, -1]
S 6 [0, -1]
-- (7) [0, 0]
-- (8) [0, 0]
SE 9 [1, -1]
W 10 [-1, 0]
Atualmente, temos uma série de pontos, o que pode fornecer uma lista indexável pelo hash:
[-1, 1] [0, 1] [0, 0] [1, 0] [1, 1] [-1, -1] [0, -1] [0, 0] [0, 0] [1, -1] [-1, 0]
Agora, vamos comprimir isto, vendo como seu único composto por -1
s, 0
s e 1
s. Como a lista representa pares, podemos achatar a lista sem perder dados. Então, se pegarmos cada número x
e calcularmos 1-x
, obteremos a seguinte lista:
2 0 1 0 1 1 0 1 0 0 2 2 1 2 1 1 1 1 0 2 2 1
Podemos converter isso em um número base 3:
20101101002212111102213
Convertendo para a base 10:
20101101002212111102213 ≡ 2226044618810
Para resumir, pegamos nossos pontos, desemparelhamos eles, pegamos cada elemento subtraído 1
e convertido da base 3
, fornecendo-nos 22260446188
. Podemos descomprimir como tal:
- Converter na base 3:
ToBase[22260446188,3]
- Tome cada número subtraído de um (auto-inverso):
1-ToBase[22260446188,3]
- Emparelhe a lista novamente:
Chop[1-ToBase[22260446188,3],2]
Isso nos dá o nosso conjunto original de pares. Em seguida, podemos executar a indexação acima mencionada da seguinte maneira:
(chopped value)[hashes]
Como no Attache, a indexação por uma matriz retorna todos os elementos correspondentes a esses índices. (Então [1,2,3,4][ [0,0,-1,1] ] = [1,1,4,2]
,.) Agora, temos as direções do caminho que o OP percorreu. O que resta é calcular a soma.
Então, capturamos esse resultado em um lambda {...}
e o colocamos como a primeira função em uma composição de função ( a##b
), com o segundo sendo V#Sum
. Esta é uma bifurcação que, dada a entrada x
, se expande para ser:
V[x, Sum[x]]
Sum
, quando recebe uma matriz 2D, soma todas as colunas da matriz (como resultado da soma vetorial). Então, isso emparelha as direções com o destino final e temos nosso resultado final.