Na física, como cargas elétricas se repelem, e cargas diferentes se atraem.
A energia potencial entre duas cargas unitárias separadas por uma distância d
é 1/d
para cargas iguais e -1/d
para cargas diferentes. A energia potencial de um sistema de cargas é a soma das energias potenciais entre todos os pares de cargas.
Desafio
Determine a energia potencial de um sistema de cargas unitárias representado por uma corda.
Isso é código-golfe , então a solução mais curta em bytes vence.
Entrada
Uma cadeia não vazio de várias linhas, que consiste em apenas +
, -
,
e mudanças de linha, com cada linha de uma largura constante. As taxas +
e -
representam +1 e -1, respectivamente. Por exemplo, a seguinte sequência:
+ -
+
(considerando que a parte superior esquerda é a origem) representa um sistema com cargas positivas em (4,0) e (1, -1) e uma carga negativa em (6,0).
Como alternativa, você pode receber a entrada como uma lista de linhas.
Saída
Um número real assinado que representa a energia potencial do sistema de cobranças. A saída deve estar correta para quatro algarismos significativos ou 10 -4 , o que for mais fraco.
Casos de teste:
-
Deve saída 0
. Não há pares de encargos para repelir ou atrair, e o espaço em branco não muda nada.
+
-
Existem apenas duas cobranças; eles estão a 1 unidade de distância na direção vertical e a 2 unidades de distância na direção horizontal; portanto, a distância é de sqrt (5). A saída deve ser -1 / sqrt (5) = -0.447213595
.
+ -
- +
Deveria dar -2.001930531
.
- -- -+ - - -+-++-+
+-- + +-- + ++-++ -
---++-+-+- -+- - +-
-- - -++-+ --+ +
- + --+ ++-+ +-
-- ++- + + -+--+
+ +++-+--+ +--+++ +
-+- +-+-+-+ -+ +--+
- +-+- + ---+
- - ++ -+- --+--
Deveria dar -22.030557890
.
---+--- ++-+++- -+ +
-+ ---+++-+- +- + +
---+-+ - ---- +-- -
- + +--+ -++- - -
--+ - --- - -+---+ -
+---+----++ - + +
-+ - ++-- ++- -+++
+----+- ++-+-+ -
++- -+ -+---+ -- -+
+-+++ ++-+-+ -+- +-
Deveria dar 26.231088767
.
Respostas:
Pitão, 34 bytes
Demonstração
Primeiro, convertemos cada caractere em +1 para
+
, -1 para-
e 0 para. Então, cada número é anotado com sua posição na matriz. Neste ponto, temos uma matriz que se parece com:
O código que atinge esse ponto é
.e+RkCUBxL" +"b.z
Em seguida, achatamos essa matriz em uma lista e pegamos todos os pares possíveis, com
.cs ... 2
.Então, ele encontra a distância entre o par
.atMd
e o sinal do potencial com*FhMd
, dividir e somar.fonte
CJam, 51 caracteres
Contando todos os pares, filtrando
Inf/NaN
e dividindo por dois:Como alternativa, filtrar as coordenadas primeiro, para contarmos cada par uma vez e não encontrarmos
Inf/NaN
:Explicação (antiga)
fonte
Haskell,
149144 bytesExemplo de uso:
f
é uma lista de todos os triplos(x-coord, y-coord, unit charge)
.g
calcula a energia potencial para todas as combinações de duas dessas triplas que não são iguais, as soma e divide o resultado por2
.fonte
Ruby, 133
Mantém uma matriz de cobranças anteriores na forma de tuplas
[charge, location(complex number)]
e compara cada nova cobrança com esta lista, antes de anexá-la à lista.Todos os espaços na entrada são substituídos por vírgulas. Isso permite a seguinte atribuição subtraindo 44 do código ascii:
O fato de o programa considerar
+
-1 e-
+1 não faz diferença para o resultado final. O fato de o programa se esforçar para calcular a influência das cargas de 0 para os espaços não faz diferença, além de diminuir um pouco a velocidade :-)Ungolfed in program program
fonte
MATL , 39
42bytesFunciona na versão atual (5.1.0) . O compilador é executado no Matlab ou Octave.
Cada linha é uma entrada separada. O fim é sinalizado inserindo uma linha vazia.
Exemplos
Explicação
fonte
Lua,
293255246228 BytesOuch, 228 bytes ... Eu provavelmente posso jogar isso significativamente, mas vou postá-lo aqui por enquanto. Provavelmente atualize-o mais tarde esta noite com mais algumas reflexões e (espero) algumas melhorias no comprimento.
Ungolfed
Atualização 255 bytes: Removida a parte inferior antiga dos dois loops, o processamento agora é feito à medida que as cadeias são adicionadas à matriz.
Atualize 246 Bytes: Substituído
c=="+"or"-"==c
comc>" "
como por sugestão de nimi. Ótima idéia, obrigado!Atualização 228 bytes: se a instrução puder ser removida completamente, inserindo a tabela após o loop for, economizando alguns bytes.
fonte
Mathematica 223 bytes
Ainda golfe para fazer.
Último caso de teste:
fonte