En física, las cargas eléctricas repelen y, a diferencia, las cargas se atraen.
La energía potencial entre dos cargas unitarias separadas por una distancia d
es 1/d
para cargas similares y -1/d
para cargas diferentes. La energía potencial de un sistema de cargas es la suma de las energías potenciales entre todos los pares de cargas.
Reto
Determine la energía potencial de un sistema de cargas unitarias representadas por una cadena.
Este es el código de golf , por lo que gana la solución más corta en bytes.
Entrada
Una cadena no vacío de varias líneas, que consta de sólo +
, -
,
y saltos de línea, con cada línea de una anchura constante. Los +
y -
representan cargos de +1 y -1 respectivamente. Por ejemplo, la siguiente cadena:
+ -
+
(considerando que la parte superior izquierda es el origen) representa un sistema con cargas positivas en (4,0) y (1, -1) y una carga negativa en (6,0).
Alternativamente, puede tomar la entrada como una lista de líneas.
Salida
Un número real firmado que representa la energía potencial del sistema de cargas. La salida debe ser correcta para cuatro cifras significativas o 10 -4 , lo que sea más flojo.
Casos de prueba:
-
Debería salir 0
. No hay pares de cargas para repeler o atraer, y el espacio en blanco no cambia nada.
+
-
Solo hay dos cargos; están a 1 unidad de distancia en la dirección vertical y a 2 unidades de distancia en la dirección horizontal, por lo que su distancia es sqrt (5). La salida debe ser -1 / sqrt (5) = -0.447213595
.
+ -
- +
Debería dar -2.001930531
.
- -- -+ - - -+-++-+
+-- + +-- + ++-++ -
---++-+-+- -+- - +-
-- - -++-+ --+ +
- + --+ ++-+ +-
-- ++- + + -+--+
+ +++-+--+ +--+++ +
-+- +-+-+-+ -+ +--+
- +-+- + ---+
- - ++ -+- --+--
Debería dar -22.030557890
.
---+--- ++-+++- -+ +
-+ ---+++-+- +- + +
---+-+ - ---- +-- -
- + +--+ -++- - -
--+ - --- - -+---+ -
+---+----++ - + +
-+ - ++-- ++- -+++
+----+- ++-+-+ -
++- -+ -+---+ -- -+
+-+++ ++-+-+ -+- +-
Debería dar 26.231088767
.
Respuestas:
Pyth, 34 bytes
Demostración
Primero, convertimos cada carácter a +1 para
+
, -1 para-
y 0 para. Luego, cada número se anota con su posición en la matriz. En este punto, tenemos una matriz que se ve así:
El código que llega a este punto es
.e+RkCUBxL" +"b.z
Luego, aplanamos esta matriz en una lista y tomamos todos los pares posibles, con
.cs ... 2
.Luego, encuentra la distancia entre el par con
.atMd
y el signo del potencial con*FhMd
, divide y suma.fuente
CJam, 51 caracteres
Contando todos los pares, filtrando
Inf/NaN
y dividiendo entre dos:Alternativamente, filtrar las coordenadas primero para contar cada par una vez y no encontrarnos con
Inf/NaN
:Explicación (antigua)
fuente
Haskell,
149144 bytesEjemplo de uso:
f
es una lista de todos los triples(x-coord, y-coord, unit charge)
.g
calcula la energía potencial para todas las combinaciones de dos triples que no son iguales, las suma y divide el resultado por2
.fuente
Rubí, 133
Mantiene una serie de cargos anteriores en forma de tuplas
[charge, location(complex number)]
y compara cada nuevo cargo con esta lista, antes de agregarlo a la lista.Todos los espacios en la entrada se reemplazan con comas. Esto permite la siguiente asignación restando 44 de su código ASCII:
El hecho de que el programa considere
+
-1 y-
+1 no hace ninguna diferencia en el resultado final. El hecho de que el programa se esfuerce por calcular la influencia de las cargas de 0 para los espacios no hace ninguna diferencia, aparte de ralentizarlo un poco :-)Sin golf en el programa de prueba
fuente
MATL , 39
42bytesFunciona en la versión actual (5.1.0) . El compilador se ejecuta en Matlab u Octave.
Cada línea es una entrada separada. El final se señala ingresando una línea vacía.
Ejemplos
Explicación
fuente
Lua,
293255246228 BytesAy, 228 bytes ... Probablemente pueda jugar golf significativamente, pero lo publicaré aquí por ahora. Probablemente lo actualice más tarde esta noche con algunas reflexiones más y (con suerte) algunas mejoras en la duración.
Sin golf
Actualización de 255 bytes: se eliminaron los dos últimos inferiores para los bucles, el procesamiento ahora se realiza a medida que se agregan cadenas a la matriz de cadenas.
Actualización de 246 Bytes: Sustituido
c=="+"or"-"==c
conc>" "
según la sugerencia del Nombre del modelo. Gran idea, gracias!Actualización de 228 bytes: si la declaración se puede eliminar por completo insertando en la tabla después del ciclo for, ahorrando bastantes bytes.
fuente
Mathematica 223 bytes
Todavía jugando al golf.
Último caso de prueba:
fuente