В физике вроде электрические заряды отталкиваются, а в отличие от зарядов притягиваются.
Потенциальная энергия между двумя единичными зарядами, разделенными расстоянием, d
предназначена 1/d
для одинаковых зарядов и -1/d
для разных зарядов. Потенциальная энергия системы зарядов является суммой потенциальных энергий между всеми парами зарядов.
Вызов
Определить потенциальную энергию системы единичных зарядов, представленных строкой.
Это код-гольф , поэтому выигрывает самое короткое решение в байтах.
вход
Непустая многострочная строка, состоящая только +
, -
,
и переводов строк, с каждой линией постоянной шириной. +
И -
представляют собой заряды +1 и -1 соответственно. Например, следующая строка:
+ -
+
(рассматривая источник слева вверху) представляет систему с положительными зарядами в (4,0) и (1, -1) и отрицательным зарядом в (6,0).
В качестве альтернативы, вы можете принять ввод как список строк.
Выход
Подписанное действительное число, представляющее потенциальную энергию системы зарядов. Вывод должен быть правильным до четырех значащих цифр или 10 -4 , в зависимости от того, что меньше.
Тестовые случаи:
-
Должен выходной 0
. Нет пар зарядов, которые можно отбить или привлечь, и пробел ничего не меняет.
+
-
Есть только два обвинения; они на расстоянии в 1 единицу в вертикальном направлении и в 2 единицах в горизонтальном направлении, поэтому их расстояние равно квадратному (5). Выход должен быть -1 / sqrt (5) = -0.447213595
.
+ -
- +
Должен дать -2.001930531
.
- -- -+ - - -+-++-+
+-- + +-- + ++-++ -
---++-+-+- -+- - +-
-- - -++-+ --+ +
- + --+ ++-+ +-
-- ++- + + -+--+
+ +++-+--+ +--+++ +
-+- +-+-+-+ -+ +--+
- +-+- + ---+
- - ++ -+- --+--
Должен дать -22.030557890
.
---+--- ++-+++- -+ +
-+ ---+++-+- +- + +
---+-+ - ---- +-- -
- + +--+ -++- - -
--+ - --- - -+---+ -
+---+----++ - + +
-+ - ++-- ++- -+++
+----+- ++-+-+ -
++- -+ -+---+ -- -+
+-+++ ++-+-+ -+- +-
Должен дать 26.231088767
.
Ответы:
Pyth, 34 байта
демонстрация
Сначала мы конвертируем каждый символ в +1 для
+
, -1 для-
и 0 для. Затем каждое число помечается своей позицией в матрице. На данный момент у нас есть матрица, которая выглядит следующим образом:
Код, который достигает этой точки:
.e+RkCUBxL" +"b.z
Затем мы сливаем эту матрицу в список и берем все возможные пары, с
.cs ... 2
.Затем он находит расстояние между парой с
.atMd
и знаком потенциала с*FhMd
делением и суммой.источник
CJam, 51 символ
Считаем все пары, отфильтровываем
Inf/NaN
и делим на две:Кроме того , фильтрация координаты первой , так мы считаем каждую пару раз и не впадать в
Inf/NaN
:Пояснение (старое)
источник
Haskell,
149144 байтаПример использования:
f
это список всех троек(x-coord, y-coord, unit charge)
.g
вычисляет потенциальную энергию для всех комбинаций двух таких троек, которые не равны, суммирует их и делит результат на2
.источник
Рубин, 133
Поддерживает массив предыдущих сборов в виде кортежей
[charge, location(complex number)]
и сравнивает каждый новый сбор с этим списком перед добавлением его в список.Все пробелы на входе заменяются запятыми. Это позволяет следующее назначение, вычитая 44 из их кода ASCII:
Тот факт, что программа считает
+
-1 и-
+1, не имеет никакого значения для конечного результата. Тот факт, что программа делает все возможное, чтобы вычислить влияние зарядов на 0 для пробелов, не имеет никакого значения, за исключением небольшого замедления :-)Неуправляемый в тестовой программе
источник
MATL , 39
42байтаРаботает в текущей версии (5.1.0) . Компилятор работает на Matlab или Octave.
Каждая строка является отдельным входом. Конец сигнализируется путем ввода пустой строки.
Примеры
объяснение
источник
Луа,
293255246228 байтОй, 228 байт ... Я, вероятно, могу сыграть в эту игру значительно, но пока выложу здесь. Вероятно, обновлю это позже сегодня вечером с несколькими размышлениями и (надеюсь) некоторыми улучшениями длины.
Ungolfed
Обновление 255 байт: удалены старые два нижних цикла, обработка теперь выполняется, так как строки добавляются в массив строк.
Обновление 246 байт: Заменены
c=="+"or"-"==c
сc>" "
согласно предложению Ними в. Отличная идея, спасибо!Обновление 228 байт: если оператор можно полностью удалить, вставив в таблицу после цикла for, сохранив немало байтов.
источник
Mathematica 223 байта
Все еще играю в гольф.
Последний тестовый пример:
источник