En physique, comme les charges électriques repoussent, et contrairement aux charges s'attirent.
L'énergie potentielle entre deux charges unitaires séparées par une distance d
est 1/d
pour des charges similaires et -1/d
pour des charges différentes. L'énergie potentielle d'un système de charges est la somme des énergies potentielles entre toutes les paires de charges.
Défi
Déterminez l'énergie potentielle d'un système de charges unitaires représenté par une chaîne.
C'est le code-golf , donc la solution la plus courte en octets l'emporte.
Contribution
Une chaîne non vide multiligne, constitué de seulement +
, -
,
et les sauts de lignes, chaque ligne d'une largeur constante. Les +
et -
représentent des frais de +1 et -1 respectivement. Par exemple, la chaîne suivante:
+ -
+
(considérant que le coin supérieur gauche est l'origine) représente un système avec des charges positives à (4,0) et (1, -1) et une charge négative à (6,0).
Alternativement, vous pouvez prendre la saisie comme une liste de lignes.
Production
Un nombre réel signé représentant l'énergie potentielle du système de charges. La sortie doit être correcte à quatre chiffres significatifs ou 10 -4 , selon le plus lâche.
Cas de test:
-
Devrait sortir 0
. Il n'y a pas de paires de charges à repousser ou à attirer, et l'espace blanc ne change rien.
+
-
Il n'y a que deux charges; ils sont à 1 unité dans le sens vertical et à 2 unités dans le sens horizontal, leur distance est donc sqrt (5). La sortie doit être -1 / sqrt (5) = -0.447213595
.
+ -
- +
Devrait donner -2.001930531
.
- -- -+ - - -+-++-+
+-- + +-- + ++-++ -
---++-+-+- -+- - +-
-- - -++-+ --+ +
- + --+ ++-+ +-
-- ++- + + -+--+
+ +++-+--+ +--+++ +
-+- +-+-+-+ -+ +--+
- +-+- + ---+
- - ++ -+- --+--
Devrait donner -22.030557890
.
---+--- ++-+++- -+ +
-+ ---+++-+- +- + +
---+-+ - ---- +-- -
- + +--+ -++- - -
--+ - --- - -+---+ -
+---+----++ - + +
-+ - ++-- ++- -+++
+----+- ++-+-+ -
++- -+ -+---+ -- -+
+-+++ ++-+-+ -+- +-
Devrait donner 26.231088767
.
Réponses:
Pyth, 34 octets
Manifestation
Tout d'abord, nous convertissons chaque caractère en +1 pour
+
, -1 pour-
et 0 pour. Ensuite, chaque nombre est annoté avec sa position dans la matrice. À ce stade, nous avons une matrice qui ressemble à:
Le code qui atteint ce point est
.e+RkCUBxL" +"b.z
Ensuite, nous aplatissons cette matrice dans une liste et prenons toutes les paires possibles, avec
.cs ... 2
.Ensuite, il trouve la distance entre la paire avec
.atMd
et le signe du potentiel avec*FhMd
, divise et additionne.la source
CJam, 51 caractères
Compter toutes les paires, filtrer
Inf/NaN
et diviser par deux:Alternativement, en filtrant les coordonnées en premier, nous comptons chaque paire une fois et ne rencontrons pas
Inf/NaN
:Explication (ancienne)
la source
Haskell,
149144 octetsExemple d'utilisation:
f
est une liste de tous les triplets(x-coord, y-coord, unit charge)
.g
calcule l'énergie potentielle pour toutes les combinaisons de deux de ces triplets qui ne sont pas égaux, les additionne et divise le résultat par2
.la source
Rubis, 133
Conserve un tableau des charges précédentes sous forme de tuples
[charge, location(complex number)]
et compare chaque nouvelle charge avec cette liste, avant de l'ajouter à la liste.Tous les espaces dans l'entrée sont remplacés par des virgules. Cela permet l'affectation suivante en soustrayant 44 de leur code ascii:
Le fait que le programme considère
+
comme -1 et-
comme +1 ne fait aucune différence pour le résultat final. Le fait que le programme fasse l'effort de calculer l'influence des charges de 0 pour les espaces ne fait aucune différence, à part le ralentir un peu :-)Non testé dans le programme de test
la source
MATL , 39
42octetsFonctionne dans la version actuelle (5.1.0) . Le compilateur fonctionne sur Matlab ou Octave.
Chaque ligne est une entrée distincte. La fin est signalée en entrant une ligne vide.
Exemples
Explication
la source
Lua,
293255246228 octetsAïe, 228 octets ... Je peux probablement jouer au golf de manière significative, mais je vais le poster ici pour l'instant. Mettez-le probablement à jour plus tard ce soir avec quelques réflexions supplémentaires et (espérons-le) quelques améliorations de la longueur.
Non golfé
Mise à jour 255 octets: Suppression des deux derniers bas pour les boucles, le traitement est désormais effectué lorsque des chaînes sont ajoutées au tableau de chaînes.
Mise à jour 246 octets: remplacé
c=="+"or"-"==c
parc>" "
selon la suggestion de nimi. Excellente idée, merci!Mise à jour 228 octets: si l'instruction peut être supprimée complètement en insérant dans le tableau après la boucle for, en économisant pas mal d'octets.
la source
Mathematica 223 octets
Toujours jouer au golf.
Dernier cas de test:
la source