Застосовуйте закон Кірхгофа


15

Закон Кірхгофа говорить, що коли ви підсумуєте всі струми (позитивні для струмів, що йдуть на перехід, і негативні для струму, що виходять з переходу), ви завжди отримаєте результат 0.

Подивіться на наступну схему:

введіть тут опис зображення

Використовуючи закон Кірхгофа, ви бачите, що i1 + i4 - i2 - i3 = 0, тому i1 + i4 = i2 + i3.

Дано два списки: один із усіма струмами, що надходять на перехід, і один із усіма струмами, що виходять із вузла, крім одного, виводять останній.

Тести:

[1, 2, 3], [1, 2] = 3
[4, 5, 6], [7, 8] = 0
[5, 7, 3, 4, 5, 2], [8, 4, 5, 2, 1] = 6

У другому списку завжди є на один пункт менше, ніж у першому. Вихід не може бути негативним. Найменша програма виграє.


1
Головоломка була б кращою, якби ви фактично дали значення резистору та струму. Цей Q здається, що ви запровадили закон просто як тезка. (Питання можна було легко заявити без закону)
ghosts_in_the_code

5
Кирхгофа ток закон
Луїс Mendo


Чи можете ви вказати, що ми можемо просто створити функцію, яка повертає результат або фактично друкує / повертає результат.
tpvasconcelos

Відповіді:


14

Желе, 2 байти

_S

Спробуйте тут!

Приймає вхідні струми в перший аргумент, а вихідні струми в другий аргумент. _віднімає їх попарно, залишаючи єдиний елемент з більш тривалого списку таким, як є, і Sпідсумовує результат.


9

Хаскелл, 14 байт

(.sum).(-).sum

Приклад використання: ( (.sum).(-).sum ) [5,7,3,4,5,2] [8,4,5,2,1]-> 6.

Підсумовуйте кожен список і приймайте різницю.


5

CJam, 8 6 байт

q~.-:+

Вхід використовує два масиви у стилі CJam.

Запустити всі тестові справи. (Це читає декілька тестових випадків одночасно і включає рамку для обробки кожного рядка окремо, відкидаючи очікуваний результат від введення даних.)

Пояснення

q~  e# Read and evaluate input.
.-  e# Elementwise difference.
:+  e# Get sum.

.-працює надійно, оскільки ми гарантуємо, що перший список завжди довший, ніж другий. (В іншому випадку сторонні елементи другого списку будуть додані до результату, що додасть їх до суми, а не віднімає їх.)


1
Поздравляю рівно 80 к!
ETHproductions

4

MATL , 3 4,0 байт

_hs

Вхідні дані: спочатку залишають струми, потім вводять струми.

Спробуйте в Інтернеті!

_     % implicitly input array with leaving currents (except one). Negate
h     % implicitly input array with entering currents. Concatenate  
s     % sum of all elements in concatenated array

Точно таке ж рішення, як і моє, але з різними літерами ха-ха, +1
Аднан

@Adnan Я бачив! (+1 уже)
Луїс Мендо

@Adnan Я скоротив до 3-х байт, змінюючи порядок введення та об'єднуючи обидва масиви. Може, це можна застосувати і до вашої відповіді?
Луїс Мендо

А-а-а, я справді повинен реалізувати сполучену функцію: с. Дуже приємна відповідь! :)
Аднан

3

Javascript, 36 байт

(a,b)=>eval(a.join`+`+'-'+b.join`-`)


3

05AB1E , 4 байти

Код:

OEO-

Пояснення:

O     # Take the sum of the input list
 E    # Evaluate input
  O   # Take the sum of the input list
   -  # Substract from each other

Дякую Луїсу Мендо за те, що він нагадав мені, що мені потрібно реалізувати об'єднану функцію. Якби я раніше його реалізував, це було б 3 байти:

Неконкурентна версія (3 байти):

Перший список є поточним поточним списком, другий - поточним списком. Код:

(«O

Пояснення:

(    # Negate the list, e.g. [3, 4, 5] would become [-3, -4, -5]
 «   # Concatenate the second list to the first
  O  # Take the sum and implicitly output it

Використовує кодування CP-1252.




2

Perl 6 , 11 байт

*.sum-*.sum

Використання:

# give it a lexical name
my &code = *.sum-*.sum;

say code [1, 2, 3], [1, 2]; # 3
say code [4, 5, 6], [7, 8]; # 0
say code [5, 7, 3, 4, 5, 2], [8, 4, 5, 2, 1]; # 6

2

Python 3, 24 байти

lambda a,b:sum(a)-sum(b)

або

Python 2, 19 байт

print sum(a)-sum(b)

залежно від того, чи потрібно мені надрукувати результат або просто створити функцію, яка його повертає.


1

ES6, 39 байт

(i,o)=>i.reduceRight((r,a,j)=>r+a-o[j])

Тому що я хотів використовувати reduceRight.




1

К5, 5 байт

-/+/'

Різниця над ( -/) сумою над ( +/) кожним ( ').

Дія:

  (-/+/')'((1 2 3;1 2);(4 5 6;7 8);(5 7 3 4 5 2;8 4 5 2 1))
3 0 6



0

Звичайний Lisp REPL, SBCL 28 24 байт

запишіть це в REPL:

#.`(-(+ #1=,@(read))#1#)

потім запишіть такі вхідні списки:

(2 3 4)
(2 3)

Я сподіваюся, що добре використовувати такий формат списку (замість наприклад '(2 3 4)), який я використовував відповідь coredump як формулу свого рішення, а потім домігся його ефекту обчислення по-іншому.

Пояснення

Дозволяти e_1,...,e_nбути елементами першого списку та f_1,...,f_{n-1}бути елементами другого списку. Ми хочемо оцінити вираз(-(+ e_1 e_2 ... e_n)f_1 f_2 ...f_{n-1}) Це означатиме віднімання елементів другого списку із суми елементів першого списку. Необхідний вираз будується так:

backqoute зупиняє оцінку

#1= економить трохи писання, запам'ятовування ,@(read)

,@ зупиняє ефекти зворотного котирування (щоб оцінити (читати)) та виводити елементи зі списку.

(read) запитує введення

#1# "завантажує" об'єкт Lisp, збережений #1=

#. робить оцінку друкованого зображення об’єкта Lisp

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.