Параллельное сопротивление в электрических цепях


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 ), но я не думаю, что есть дубликат. В соответствии с тем, что предложил flawr, я думаю, что в этом теле вызова должна быть указана эта фраза, чтобы мы могли легче закрыть будущий обман.
FryAmTheEggman

Ответы:




9

MATLAB , 14 байтов

В MATLAB norm(...,p)вычисляет p-норму вектора. Это обычно определяется для p1 как

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

Но, к счастью для нас, это также работает для p=1 . (Обратите внимание, что это не работает в Octave.)

@(x)norm(x,-1)

Не пытайтесь сделать это онлайн!


4
Это ужасно и красиво одновременно!
перестал поворачиваться против часовой стрелки

1
Спасибо, это лучшие комплименты :)
flawr

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 , как это работает, но увы ...
Джо Кинг

Да, это, наверное, первый раз, когда я даже думал об использовании одного для игры в гольф, и я был разочарован, обнаружив его ограничения.
Шон



3

MathGolf , 3 байта

∩Σ∩

Же , как и другие ответы, используя встроенные команды (1N) и Σ(сумма):

M(x1,...,xn)=11x1+1x2+...+1xn

Try it online.


2

PHP, 51 bytes

Reciprocal of sum of reciprocals. Input is $a.

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

Try it online!


With PHP7.4, I think you can do this: 1/array_reduce($a,fn($c,$i)=>$c+1/$i); (38 bytes). Read more in wiki.php.net/rfc/arrow_functions
Ismael Miguel

I think you're right! But nowhere to demo?

You have to download it yourself. However, since PHP 7.4.0RC1 was released on the 5th of this month (php.net/archive/2019.php#2019-09-05-1), you probably are safe using it. If you have doubts, you can ask in the meta.
Ismael Miguel




2

x86-64 Machine code - 20 18 bytes

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  

Input - Windows calling convention. First parameter is the number of resistors in RCX. A pointer to the resistors is in RDX. *ps instructions are used since they are one byte smaller. Technically, you can only have around 2^61 resistors but you will be out of RAM long before then. The precision isn't great either, since we are using rcpps.


“Only 2⁶¹ resistors” would probably fill the observable universe (many times over)!

Actually, 2^61 is only 2.305843e+18 and the observable universe is 8.8 × 10^26 m in diameter.
me'

Yeah, serious overestimation! Actual magnitude would be around the size and mass of Deimos, smaller moon of Mars.

2

Java 8, 24 bytes

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

I noticed there wasn't a Java answer yet, so figured I'd add one.

Try it online.

Explanation:

Uses the same Harmonic Mean approach as other answers:

M(x1,...,xn)=11x1+1x2+...+1xn

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

MATL, 5 bytes

,1w/s

Try it online!

I'm not sure if "do twice" (,) counts as a loop, but this is just the harmonic mean, divided by n.

С другой стороны, ,-1^sэто также пять байтов.


2

Машинный код Intel 8087 FPU, 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]

This uses the stack-based floating point instructions in the original IBM PC's 8087 FPU.

Вход указатель на значения резисторов в [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 байт

Еще один байт, чем flawr отличный ответ, но мне пришлось использовать другие функции, так что здесь идет:

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

Это довольно явно, он суммирует обратное сопротивление, а затем инвертирует сумму, чтобы вывести эквивалентное параллельное сопротивление.


1

Forth (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.