Паралельний опір в електричних колах


20

Вступ:

Два резистори R1і R2паралельно (позначаються R1 || R2) мають комбінований опір, Rpзаданий у вигляді:

RP2=R1R2R1+R2
або як запропоновано в коментарях:

RP2=11R1+1R2

Три резисторів, R1, R2і R3паралельно ( R1 || R2 || R3) мають сумарний опір (R1 || R2) || R3 = Rp || R3:

RP3=R1R2R1+R2R3R1R2R1+R2+R3

або, знову ж таки, як запропоновано в коментарях:

RP3=11R1+1R2+1R3

Ці формули можна, звичайно, поширити на невизначене число резисторів.


Виклик:

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

Тестові приклади:

1, 1
0.5

1, 1, 1
0.3333333

4, 6, 3
1.3333333

20, 14, 18, 8, 2, 12
1.1295

10, 10, 20, 30, 40, 50, 60, 70, 80, 90
2.6117  

Виграє найкоротший код у кожній мові. Пояснення настійно заохочуються.


6
Є кілька інших проблем, які стосуються гармонійного середнього ( 1 2 3 ), але я не думаю, що існує дублікат. Відповідно до запропонованих недоліків, я думаю, що цей орган, який має виклики, повинен мати десь вказану фразу, щоб ми могли легше закрити майбутню дупу.
FryAmTheEggman

Відповіді:




9

MATLAB , 14 байт

У MATLAB norm(...,p)обчислює p-норму вектора. Зазвичай це визначено для p1 як

vp=(i|vi|p)1p.

Але, на щастя, для нас також трапляється робота при p=1 . (Зверніть увагу, що це не працює в Octave.)

@(x)norm(x,-1)

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


4
Це жахливо і красиво одночасно!
перестали повертати проти годинника,

1
Дякую, це найкращі компліменти :)
недолік

7

Желе ,  5  3 байти

İSİ

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

Як?

Спочатку я забув цю форму з моїх електронних інженерних днів ... як легко ми забуваємо.

İSİ - Link: list of numbers, R   e.g. [r1, r2, ..., rn]
İ   - inverse (vectorises)            [1/r1, 1/r2, ..., 1/rn]
 S  - sum                             1/r1 + 1/r2 + ... + 1/rn
  İ - inverse                         1/(1/r1 + 1/r2 + ... + 1/rn)

4
Я припускаю İ, що вимовляється так само, iяк вимовляється в list. Це легкий спосіб сказати виклик?
Стюі Гріффін



4

1
APL - оригінальна мова для гольфу!

@YiminRong Це не мова про гольф ...: P
Ерік Аутгольфер

Я знаю, але його кількість байтів збігається з сучасними мовами для гольфу!


@ Adám О так, звичайно, 1∘⊥це те саме, що і +/для векторів ...
Ерік Переможник




3

Perl 6 , 14 байт

1/*.sum o 1/**

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

1 / **це анонімна функція, яка повертає список зворотних аргументів. 1 / *.sum- це ще одна анонімна функція, яка повертає зворотну суму елементів аргументу списку. oОператор складає ці дві функції.


Дуже хороша. Я не бачу HyperWhatevers, що використовується досить часто в гольфі, оскільки їх не можна використовувати в більш складних виразах. Якби вони були ближче до нормальних Whatevers, я б очікувати sumething , як це працює, але на жаль ...
Джо Кінг

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




2

PHP , 51 байт

Зворотна сума зворотних. Введення є $a.

1/array_reduce($a,function($c,$i){return$c+1/$i;});

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


З PHP7.4, я думаю, ви можете це зробити: 1/array_reduce($a,fn($c,$i)=>$c+1/$i);(38 байт). Детальніше читайте на wiki.php.net/rfc/arrow_functions
Ісмаель Мігель

Я думаю, ти маєш рацію! Але ніде не демонструвати?

Ви повинні завантажити його самостійно. Однак, оскільки PHP 7.4.0RC1 був випущений 5 цього місяця ( php.net/archive/2019.php#2019-09-05-1 ), ви, ймовірно, користуєтеся ним безпечно. Якщо у вас є сумніви, можете запитати в мета.
Ісмаїл Мігель




2

x86-64 Код машини - 20 18 байт

0F 57 C0             xorps       xmm0,xmm0  
loopHead
F3 0F 53 4C 8A FC    rcpss       xmm1,dword ptr [rdx+rcx*4-4]
0F 58 C1             addps       xmm0,xmm1  
E2 F6                loop        loopHead
0F 53 C0             rcpps       xmm0,xmm0  
C3                   ret  

Вхід - умова виклику Windows. Перший параметр - кількість резисторів в RCX. Вказівник на резистори RDX. *psінструкції використовуються, оскільки вони на один байт менші. Технічно у вас може бути лише близько 2 ^ 61 резисторів, але ви будете поза оперативної пам'яті задовго до цього. Точність теж не велика, оскільки ми використовуємо rcpps.


"Тільки 2⁶¹ резистори", ймовірно, наповнили спостережуваний Всесвіт (багато разів)!

Власне, 2 ^ 61 - це лише 2,305843е + 18, а спостерігається Всесвіт - 8,8 × 10 ^ 26 м в діаметрі.
мені '14

Так, серйозна завищення! Фактична величина була б приблизно розміром і масою Деймоса, меншого місяця Марса.

2

Java 8, 24 байти

a->1/a.map(d->1/d).sum()

Я помітив, що відповіді на Java ще не було, тому подумав, що я додам її.

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

Пояснення:

Використовується той самий підхід гармонійного середнього, що й інші відповіді:

М(х1,...,хн)=11х1+1х2+...+1хн

a->                       // Method with DoubleStream parameter and double return-type
     a.map(d->1/d)        //  Calculate 1/d for each value `d` in the input-stream
                  .sum()  //  Then take the sum of the mapped list
   1/                     //  And return 1/sum as result


2

Машинний код FPU Intel 8087, 19 байт

 D9 E8      FLD1                    ; push 1 for top numerator on stack
 D9 EE      FLDZ                    ; push 0 for running sum 
        R_LOOP: 
 D9 E8      FLD1                    ; push 1 numerator for resistor
 DF 04      FILD WORD PTR[SI]       ; push resistor value onto stack 
 DE F9      FDIV                    ; divide 1 / value 
 DE C1      FADD                    ; add to running sum 
 AD         LODSW                   ; increment SI by 2 bytes 
 E2 F4      LOOP R_LOOP             ; keep looping 
 DE F9      FDIV                    ; divide 1 / result                  
 D9 1D      FSTP WORD PTR[DI]       ; store result as float in [DI]

Для цього використовуються інструкції з плаваючою точкою на основі стека в оригінальному FPU 8087 IBM PC.

Вхід - вказівник на значення резистора в [SI], кількість резисторів в CX. Вихід - це значення однієї точності (DD) при [DI].


1

Дартс , 42 байти

f(List<num>a)=>a.reduce((p,e)=>p*e/(p+e));

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

Необхідно чітко вказати numтип начебто задихається, запобігає підведенню типу, оскільки це може зробити висновок, до (dynamic, dynamic) => dynamicякого з якихось причин не можна отримати подвійний



1

Python 3, 58 44 байти

f=lambda x,y=0,*i:f(x*y/(x+y),*i)if y else x

Рекурсивна функція. Вимагає, щоб аргументи були розпаковані, наприклад:

i=[10, 10, 20]
f(*i)

або

f(10, 10, 20)

Пояснення:

# lambda function with three arguments. *i will take any unpacked arguments past x and y,
# so a call like f(10, 20) is also valid and i will be an empty tuple
# since y has a default value, f(10) is also valid
f=lambda x,y=0,*i: \

# a if case else b
# determine parallel resistance of x and y and use it as variable x
# since i is passed unpacked, the first item in the remaining list will be y and
# the rest of the items will be stored in i
# in the case where there were no items in the list, y will have the default value of 0
f(x*y/(x+y),*i) \

# if y does not exist or is zero, return x
if y else x

1

Вугілля деревне , 7 байт

I∕¹Σ∕¹A

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Працює шляхом обчислення струму, проведеного кожним резистором при застосуванні 1В, взяття загального та обчислення опору, який би притягував цей струм при застосуванні 1В. Пояснення:

      A Input array
    ∕¹  Reciprocal (vectorised)
   Σ    Sum
 ∕¹     Reciprocal
I       Cast to string for implicit print


1

[MATLAB], 15 байт

Ще один байт, ніж недосконала відмінна відповідь, але мені довелося використовувати інші функції, тож ось:

@(x)1/sum(1./x)

Це досить явно, він підсумовує зворотний опір, потім обертає суму, щоб вивести еквівалентний паралельний опір.


1

Четвертий (gforth) , 49 байт

: f 0e 0 do dup i cells + @ s>f 1/f f+ loop 1/f ;

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

Вхід - це пам'ять і довжина масиву (використовується як імпровізований масив, оскільки Forth не має вбудованої конструкції масиву)

Використовує метод сумарного зворотного, як і більшість інших відповідей

Пояснення коду

: f           \ start a new word definition
  0e          \ stick an accumulator on the floating point stack
  0 do        \ start a loop from 0 to array-length -1
    dup       \ copy the array address
    i cells + \ get the address of the current array value
    @ s>f     \ get the value and convert it to a float
    1/f f+    \ invert and add to accumulator
  loop        \ end the loop definition
  1/f         \ invert the resulting sum
;             \ end the word definition

1

expl3 (рівень програмування LaTeX3), 65 байт

Далі визначається функція, яка друкує результат в термінал (на жаль, expl3має дуже багатослівні назви функцій):

\def\1#1{\fp_show:n{1/(\clist_map_function:nN{#1}\2)}}\def\2{+1/}

Повний сценарій, який можна запустити з терміналу, включаючи всі тестові випадки, а також налаштування для введення expl3:

\RequirePackage{expl3}\ExplSyntaxOn
\def\1#1{\fp_show:n{1/(\clist_map_function:nN{#1}\2)}}\def\2{+1/}
\1{1, 1}
\1{1, 1, 1}
\1{4, 6, 3}
\1{20, 14, 18, 8, 2, 12}
\1{10, 10, 20, 30, 40, 50, 60, 70, 80, 90}
\stop

Якщо pdflatex <filename>на консолі працює наступний:

This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./cg_resistance.tex
LaTeX2e <2018-12-01>
(/usr/local/texlive/2019/texmf-dist/tex/latex/unravel/unravel.sty
(/usr/local/texlive/2019/texmf-dist/tex/latex/l3kernel/expl3.sty
(/usr/local/texlive/2019/texmf-dist/tex/latex/l3kernel/expl3-code.tex)
(/usr/local/texlive/2019/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def))
 (/usr/local/texlive/2019/texmf-dist/tex/latex/l3packages/xparse/xparse.sty)
(/usr/local/texlive/2019/texmf-dist/tex/generic/gtl/gtl.sty))
> 1/(\clist_map_function:nN {1,1}\2)=0.5.
<recently read> }

l.3 \1{1, 1}

?
> 1/(\clist_map_function:nN {1,1,1}\2)=0.3333333333333333.
<recently read> }

l.4 \1{1, 1, 1}

?
> 1/(\clist_map_function:nN {4,6,3}\2)=1.333333333333333.
<recently read> }

l.5 \1{4, 6, 3}

?
> 1/(\clist_map_function:nN {20,14,18,8,2,12}\2)=1.129538323621694.
<recently read> }

l.6 \1{20, 14, 18, 8, 2, 12}

?
> 1/(\clist_map_function:nN
{10,10,20,30,40,50,60,70,80,90}\2)=2.611669603067675.
<recently read> }

l.7 \1{10, 10, 20, 30, 40, 50, 60, 70, 80, 90}

?
 )
No pages of output.
Transcript written on cg_resistance.log.

Пояснення

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

\clist_map_function:nN : приймає два аргументи, список, розділений комами, і функцію / макрос, якщо він викликається так, що \clist_map_function:nN { l1, l2, l3 } \fooвін розширюється на щось подібне \foo{l1}\foo{l2}\foo{l3}. У нашому випадку замість \fooмакроса \2використовується макрос , який розширюється +1/так, щоб вираз розширювався на+1/{l1}+1/{l2}+1/{l3}

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