In der Physik stoßen sich elektrische Ladungen ab und ziehen sich anders als Ladungen an.
Die potentielle Energie zwischen zwei Einheitsladungen, die durch eine Entfernung voneinander getrennt sind, d
gilt 1/d
für gleiche Ladungen und -1/d
für ungleiche Ladungen. Die potentielle Energie eines Ladungssystems ist die Summe der potentiellen Energien zwischen allen Ladungspaaren.
Herausforderung
Bestimmen Sie die potenzielle Energie eines Systems von Einheitsgebühren, die durch eine Zeichenfolge dargestellt werden.
Das ist Code-Golf , also gewinnt die kürzeste Lösung in Bytes.
Eingang
Ein nicht - leerer mehrzeilige Zeichenfolge, die nur aus +
, -
,
und neue Zeilen, wobei jede Zeile mit einer konstanten Breite. Die +
und -
repräsentieren Ladungen von +1 bzw. -1. Zum Beispiel die folgende Zeichenfolge:
+ -
+
(unter Berücksichtigung des Ursprungs von links oben) repräsentiert ein System mit positiven Ladungen bei (4,0) und (1, -1) und einer negativen Ladung bei (6,0).
Alternativ können Sie Eingaben als Zeilenliste übernehmen.
Ausgabe
Eine vorzeichenbehaftete reelle Zahl, die die potenzielle Energie des Ladesystems darstellt. Die Ausgabe sollte auf vier signifikante Stellen oder 10 -4 (je nachdem, welcher Wert niedriger ist) korrekt sein .
Testfälle:
-
Sollte ausgeben 0
. Es gibt keine Ladungspaare, die sich abstoßen oder anziehen lassen, und das Leerzeichen ändert nichts.
+
-
Es gibt nur zwei Gebühren; Sie sind 1 Einheit in vertikaler Richtung und 2 Einheiten in horizontaler Richtung entfernt, sodass ihr Abstand sqrt (5) beträgt. Die Ausgabe sollte -1 / sqrt (5) = sein -0.447213595
.
+ -
- +
Sollte geben -2.001930531
.
- -- -+ - - -+-++-+
+-- + +-- + ++-++ -
---++-+-+- -+- - +-
-- - -++-+ --+ +
- + --+ ++-+ +-
-- ++- + + -+--+
+ +++-+--+ +--+++ +
-+- +-+-+-+ -+ +--+
- +-+- + ---+
- - ++ -+- --+--
Sollte geben -22.030557890
.
---+--- ++-+++- -+ +
-+ ---+++-+- +- + +
---+-+ - ---- +-- -
- + +--+ -++- - -
--+ - --- - -+---+ -
+---+----++ - + +
-+ - ++-- ++- -+++
+----+- ++-+-+ -
++- -+ -+---+ -- -+
+-+++ ++-+-+ -+- +-
Sollte geben 26.231088767
.
Antworten:
Pyth, 34 Bytes
Demonstration
Zuerst konvertieren wir jedes Zeichen in +1 für
+
, -1 für-
und 0 für. Dann wird jede Zahl mit ihrer Position in der Matrix beschriftet. An dieser Stelle haben wir eine Matrix, die so aussieht:
Der Code, der diesen Punkt erreicht, ist
.e+RkCUBxL" +"b.z
Dann reduzieren wir diese Matrix in eine Liste und nehmen alle möglichen Paare mit
.cs ... 2
.Dann findet er den Abstand zwischen dem Paar mit
.atMd
und dem Vorzeichen des Potentials mit*FhMd
, dividieren und summieren.quelle
CJam, 51 Zeichen
Alle Paare zählen,
Inf/NaN
herausfiltern und durch zwei teilen:Alternativ können Sie die Koordinaten zuerst filtern, damit wir jedes Paar einmal zählen und nicht auf Folgendes stoßen
Inf/NaN
:Erklärung (alt)
quelle
Haskell,
149144 BytesAnwendungsbeispiel:
f
ist eine Liste aller Tripel(x-coord, y-coord, unit charge)
.g
berechnet die potentielle Energie für alle Kombinationen von zwei solchen Dreifachen, die nicht gleich sind, summiert sie und dividiert das Ergebnis durch2
.quelle
Ruby, 133
Verwaltet eine Reihe früherer Gebühren in Form von Tupeln
[charge, location(complex number)]
und vergleicht jede neue Gebühr mit dieser Liste, bevor sie an die Liste angehängt wird.Alle Leerzeichen in der Eingabe werden durch Kommas ersetzt. Dies ermöglicht die folgende Zuordnung durch Subtrahieren von 44 von ihrem ASCII-Code:
Die Tatsache, dass das Programm
+
-1 und-
+1 betrachtet, hat keinen Einfluss auf das Endergebnis. Die Tatsache, dass das Programm sich bemüht, den Einfluss der Ladungen von 0 auf die Leerzeichen zu berechnen, macht keinen Unterschied, abgesehen davon, dass es etwas langsamer wird :-)Ungolfed im Testprogramm
quelle
MATL , 39
42BytesFunktioniert in der aktuellen Version (5.1.0) . Der Compiler läuft auf Matlab oder Octave.
Jede Zeile ist ein separater Eingang. Das Ende wird durch Eingabe einer Leerzeile signalisiert.
Beispiele
Erläuterung
quelle
Lua,
293255246228 BytesAutsch, 228 Bytes ... Ich kann das wahrscheinlich bedeutend Golf spielen, aber ich werde es vorerst hier posten. Aktualisiere es wahrscheinlich später heute Abend mit ein paar weiteren Überlegungen und (hoffentlich) einigen Verbesserungen der Länge.
Ungolfed
Update 255 Bytes: Die alten unteren zwei für Schleifen wurden entfernt. Die Verarbeitung erfolgt nun, wenn Zeichenfolgen zum Zeichenfolgenarray hinzugefügt werden.
Update 246 Bytes: Ersetzt
c=="+"or"-"==c
durchc>" "
den Vorschlag von Nimi. Tolle Idee, danke!Update 228 Bytes: Wenn die Anweisung durch Einfügen in die Tabelle nach der for-Schleife vollständig entfernt werden konnte, werden einige Bytes gespart.
quelle
Mathematica 223 Bytes
Immer noch Golf zu spielen.
Letzter Testfall:
quelle