Điện trở song song trong mạch điện


20

Giới thiệu:

Hai điện trở R1R2song song (ký hiệu R1 || R2) có điện trở kết hợp Rpđược cho là:

RP2=R1R2R1+R2
hoặc như được đề xuất trong các nhận xét:

RP2=11R1+1R2

Ba điện trở, R1, R2R3song song ( R1 || R2 || R3) có một sức đề kháng kết hợp (R1 || R2) || R3 = Rp || R3:

RP3=R1R2R1+R2R3R1R2R1+R2+R3

hoặc, một lần nữa như được đề xuất trong các ý kiến:

RP3=11R1+1R2+1R3

Những công thức này tất nhiên có thể được mở rộng đến một số lượng điện trở không xác định.


Thử thách:

Lấy danh sách các giá trị điện trở dương làm đầu vào và xuất điện trở kết hợp nếu chúng được đặt song song trong một mạch điện. Bạn có thể không giả sử số lượng điện trở tối đa (ngoại trừ việc máy tính của bạn có thể xử lý nó).

Các trường hợp thử nghiệm:

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  

Mã ngắn nhất trong mỗi ngôn ngữ sẽ thắng. Giải thích rất được khuyến khích.


6
Có một vài thách thức khác liên quan đến ý nghĩa điều hòa ( 1 2 3 ) nhưng tôi không nghĩ có một bản sao. Theo như những gì flawr đề xuất, tôi nghĩ rằng cơ thể thách thức này nên có cụm từ đó được liệt kê ở đâu đó để chúng ta có thể đóng một bản dupe trong tương lai dễ dàng hơn.
FryAmTheEggman

Câu trả lời:




9

MATLAB , 14 byte

Trong MATLAB norm(...,p)tính toán p-norm của một vectơ. Điều này thường được định nghĩa cho p1 như

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

Nhưng may mắn cho chúng tôi, nó cũng xảy ra để làm việc với p=1 . (Lưu ý rằng nó không hoạt động trong Octave.)

@(x)norm(x,-1)

Đừng thử trực tuyến!


4
Điều này thật kinh khủng và đẹp đẽ cùng một lúc!
đã ngừng quay ngược chiều

1
Cảm ơn, đây là những lời khen tốt nhất :)
flawr

7

Thạch ,  5  3 byte

İSİ

Hãy thử trực tuyến!

Làm sao?

Ban đầu tôi đã quên mẫu này từ những ngày kỹ thuật điện tử của mình ... chúng ta dễ quên như thế nào.

İ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
Tôi giả sử İđược phát âm theo cách tương tự iđược phát âm trong list. Đây có phải là một cách để nói thách thức là dễ dàng?
Stewie Griffin


4

Octave , 15 byte

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

Hãy thử trực tuyến!

Điều hòa có nghĩa, chia cho n. Dễ như ăn bánh.


@tsh bạn biết đấy, tôi không nghĩ rằng tôi đã nhận thấy điều đó. Tôi đoán nó gần như là ý nghĩa hài hòa ...
Giuseppe

4

1
APL là ngôn ngữ chơi golf ban đầu!

@YiminRong Đây không phải là ngôn ngữ chơi gôn ...: P
Erik the Outgolfer

Tôi biết, nhưng số byte của nó ngang bằng với các ngôn ngữ chơi gôn hiện đại!


@ Adám Oh duh tất nhiên 1∘⊥giống như +/đối với vectơ ...
Erik the Outgolfer




3

Perl 6 , 14 byte

1/*.sum o 1/**

Hãy thử trực tuyến!

1 / **là một hàm ẩn danh trả về một danh sách các đối ứng của các đối số của nó. 1 / *.sumlà một hàm ẩn danh khác trả về nghịch đảo của tổng các phần tử của đối số danh sách của nó. Các onhà điều hành soạn những hai chức năng.


Rất đẹp. Tôi không thấy HyperWhatevers được sử dụng thường xuyên trong việc chơi golf vì chúng không thể được sử dụng trong các biểu thức phức tạp hơn. Nếu họ gần gũi hơn với những người Whatevers bình thường, tôi sẽ mong muốn việc tổng hợp như thế này hoạt động, nhưng than ôi ...
Jo King

Vâng, đây có lẽ là lần đầu tiên tôi nghĩ đến việc sử dụng một chiếc để chơi gôn và tôi đã thất vọng khi phát hiện ra những hạn chế của nó.
Sean



3

MathGolf , 3 byte

∩Σ∩

Giống như các câu trả lời khác, sử dụng các nội trang (1n) và Σ(tổng hợp):

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

Hãy thử trực tuyến.


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.

Alternately, ,-1^s is five bytes as well.


2

Intel 8087 FPU machine code, 19 bytes

 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.

Input is pointer to resistor values in [SI], number of resistors in CX. Output is to a single precision (DD) value at [DI].


1

Dart, 42 bytes

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

Try it online!

Having to explicitly specify the num type is kinda sucky, prevents type infering, because it would infer to (dynamic, dynamic) => dynamic which can't yield doubles for some reason



1

Python 3, 58 44 bytes

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

A recursive function. Requires arguments to be passed unpacked, like so:

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

or

f(10, 10, 20)

Explanation:

# 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

Charcoal, 7 bytes

I∕¹Σ∕¹A

Try it online! Link is to verbose version of code. Works by calculating the current drawn by each resistor when 1V is applied, taking the total, and calculating the resistance that would draw that current when 1V is applied. Explanation:

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


1

[MATLAB], 15 bytes

One more byte than flawr excellent answer, but I had to use other functions so here goes:

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

It's rather explicit, it sums the inverse of the resistances, then invert the sum to output the equivalent parallel resistance.


1

Forth (gforth), 49 bytes

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

Try it online!

Input is a memory address and array length (used as an impromptu array, since Forth doesn't have a built-in array construct)

Sử dụng phương pháp tổng hợp nghịch đảo vì hầu hết các câu trả lời khác là

Giải thích mã

: 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 (lớp lập trình LaTeX3), 65 byte

Sau đây định nghĩa một hàm in kết quả đến thiết bị đầu cuối (không may expl3có tên hàm rất dài):

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

Một tập lệnh hoàn chỉnh có thể được chạy từ thiết bị đầu cuối bao gồm tất cả các trường hợp thử nghiệm cũng như thiết lập để nhập 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

Nếu chạy với pdflatex <filename>sau đây là đầu ra giao diện điều khiển:

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.

Giải trình

\fp_show:n : đánh giá đối số của nó dưới dạng biểu thức dấu phẩy động và in kết quả trên thiết bị đầu cuối, mọi macro có thể mở rộng được mở rộng trong quá trình đó.

\clist_map_function:nN : lấy hai đối số, một danh sách được phân tách bằng dấu phẩy và hàm / macro, nếu được gọi như \clist_map_function:nN { l1, l2, l3 } \foonó sẽ mở rộng thành một cái gì đó như \foo{l1}\foo{l2}\foo{l3}. Trong trường hợp của chúng tôi thay vì \foomacro \2được sử dụng, nó sẽ mở rộng để +1/biểu thức mở rộng thành+1/{l1}+1/{l2}+1/{l3}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.