Resistansi paralel di sirkuit listrik

20

Pengantar:

Dua resistor, R1dan R2, secara paralel (dilambangkan R1 || R2) memiliki resistensi gabungan yang Rpdiberikan sebagai:

RP2=R1R2R1+R2
atau seperti yang disarankan dalam komentar:

RP2=11R1+1R2

Tiga resistor, R1, R2dan R3secara paralel ( R1 || R2 || R3) memiliki ketahanan gabungan (R1 || R2) || R3 = Rp || R3:

RP3=R1R2R1+R2R3R1R2R1+R2+R3

atau, lagi seperti yang disarankan dalam komentar:

RP3=11R1+1R2+1R3

Formula-formula ini tentu saja dapat diperluas ke sejumlah resistor yang tidak terbatas.


Tantangan:

Ambil daftar nilai resistor positif sebagai input, dan hasilkan resistansi gabungan jika ditempatkan secara paralel di sirkuit listrik. Anda mungkin tidak mengasumsikan jumlah resistor maksimum (kecuali bahwa komputer Anda dapat mengatasinya tentu saja).

Kasus uji:

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  

Kode terpendek di setiap bahasa menang. Penjelasan sangat dianjurkan.

Stewie Griffin
sumber
6
Ada beberapa tantangan lain yang merujuk pada rata-rata harmonik ( 1 2 3 ) tetapi saya tidak berpikir ada duplikat. Sejalan dengan apa yang disarankan flawr, saya pikir badan penantang ini harus memiliki frase yang terdaftar di suatu tempat sehingga kita dapat menutup korban penipuan masa depan dengan lebih mudah.
FryAmTheEggman

Jawaban:

13

05AB1E , 5 3 byte

zOz

Cobalah online!


Penjelasan

z                     # compute 1/x for each x in input 
 O                    # sum input 
  z                   # compute 1/sum
Data Kedaluwarsa
sumber
4
Kecuali built-in, ini mungkin serendah yang kita bisa!
9

Haskell , 18 16 byte

(1/).sum.map(1/)

Cobalah online!

cacat
sumber
3
Itu terlihat indah.
Eric Duminil
Solusi sepanjang garis rekursif OP akan 22 chars: foldr1(\r s->r*s/(r+s)).
Berhenti menghidupkan counterclockw
9

MATLAB , 14 byte

Dalam MATLAB norm(...,p)menghitung p-norm vektor. Ini biasanya didefinisikan untuk hal1 sebagai

vhal=(saya|vsaya|hal)1hal.

Tapi untungnya bagi kita, itu juga bekerja untuk hal=-1 . (Perhatikan bahwa itu tidak berfungsi dalam Oktaf.)

@(x)norm(x,-1)

Jangan coba online!

cacat
sumber
4
Ini mengerikan dan indah secara bersamaan!
Berhenti menghidupkan counterclockw
1
Terima kasih, ini adalah pujian terbaik :)
flawr
7

Jelly ,  5  3 byte

İSİ

Cobalah online!

Bagaimana?

Awalnya saya lupa formulir ini dari hari-hari teknik elektronik saya ... betapa mudahnya kita lupa.

İ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)
Jonathan Allan
sumber
4
Saya berasumsi İdiucapkan dengan cara yang sama idiucapkan dalam list. Apakah ini cara mengatakan tantangan itu mudah?
Stewie Griffin
4

PowerShell , 22 byte

$args|%{$y+=1/$_};1/$y

Cobalah online!

Mengambil input melalui splatting dan menggunakan 1 / jumlah trik terbalik yang sama seperti yang dilakukan banyak orang lain

Veskah
sumber
4

Oktaf , 15 byte

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

Cobalah online!

Berarti harmonik, dibagi dengan n. Peasy mudah.

Giuseppe
sumber
Oh, kau tahu, kurasa aku tidak pernah memperhatikan itu. Saya kira itu hampir rata -rata harmonik ...
Giuseppe
4

APL (Dyalog Unicode) , 4 byte

÷1⊥÷

Cobalah online!

-1 terima kasih kepada Adám .

Erik the Outgolfer
sumber
1
APL adalah bahasa golf asli!
@YiminRong Ini bukan bahasa golf ...: P
Erik the Outgolfer
Saya tahu, tetapi jumlah byte-nya setara dengan bahasa golf modern!
-1 byte: ÷1⊥÷ Coba online!
Adám
@ Adám Oh ya tentu saja 1∘⊥sama dengan +/untuk vektor ...
Erik the Outgolfer
3

R , 15 byte

1/sum(1/scan())

Cobalah online!

Mengikuti prinsip Harmonic Mean yang sama seperti yang terlihat pada jawaban lain.

Sumner18
sumber
3

Perl 6 , 14 byte

1/*.sum o 1/**

Cobalah online!

1 / **adalah fungsi anonim yang mengembalikan daftar kebalikan dari argumennya. 1 / *.sumadalah fungsi anonim lain yang mengembalikan timbal balik dari jumlah elemen argumen daftar. The oOperator menyusun dua fungsi.

Sean
sumber
Sangat bagus. Saya tidak melihat HyperWhatevers cukup sering digunakan dalam bermain golf karena mereka tidak dapat digunakan dalam ekspresi yang lebih kompleks. Jika mereka lebih dekat dengan Whatevers normal, saya berharap penjumlahan seperti ini berfungsi, tapi sayang ...
Jo King
Ya, ini mungkin pertama kalinya saya berpikir untuk menggunakan satu untuk bermain golf, dan saya kecewa menemukan keterbatasannya.
Sean
3

bash + coreutils, 25 byte

bc -l<<<"1/(0${@/#/+1/})"

TIO

Nahuel Fouilleul
sumber
3

Bahasa Wolfram (Mathematica) , 10 byte

1/Tr[1/#]&

Cobalah online!

attinat
sumber
Apakah tidak ada rata-rata harmonik bawaan, atau lebih lama untuk mengetik?
Eric Duminil
@Eric AFAIK secara intuitif dinamai HarmonicMeandan lebih panjang.
kata ganti saya adalah monicareinstate
3

MathGolf , 3 byte

∩Σ∩

Sama dengan jawaban lain, menggunakan bawaan (1n) dan Σ(jumlah):

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

Cobalah online.

Kevin Cruijssen
sumber
2

PHP , 51 byte

Timbal balik dari jumlah timbal balik. Masukan adalah $a.

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

Cobalah online!


sumber
Dengan PHP7.4, saya pikir Anda bisa melakukan ini: 1/array_reduce($a,fn($c,$i)=>$c+1/$i);(38 byte). Baca selengkapnya di wiki.php.net/rfc/arrow_functions
Ismael Miguel
Saya pikir kamu benar! Tapi tidak ada tempat untuk demo?
Anda harus mengunduhnya sendiri. Namun, karena PHP 7.4.0RC1 dirilis pada tanggal 5 bulan ini ( php.net/archive/2019.php#2019-09-05-1 ), Anda mungkin aman menggunakannya. Jika Anda memiliki keraguan, Anda dapat bertanya dalam meta.
Ismael Miguel
2

JavaScript (ES6), 29 byte

a=>a.reduce((p,c)=>p*c/(p+c))

Cobalah online!

atau:

a=>1/a.reduce((p,c)=>p+1/c,0)

Cobalah online!

Tetapi dengan pendekatan ini, menggunakan map()(seperti yang dilakukan Shaggy ) adalah 1 byte lebih pendek.

Arnauld
sumber
2

x86-64 Kode mesin - 20 18 byte

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 - Konvensi pemanggilan Windows. Parameter pertama adalah jumlah resistor di RCX. Pointer ke resistor ada di RDX. *psinstruksi digunakan karena lebih kecil satu byte. Secara teknis, Anda hanya dapat memiliki sekitar 2 ^ 61 resistor tetapi Anda akan kehabisan RAM jauh sebelum itu. Presisi juga tidak bagus, karena kami menggunakan rcpps.

saya'
sumber
"Hanya 2⁶¹ resistor" mungkin akan mengisi alam semesta yang dapat diamati (berkali-kali lipat)!
Sebenarnya, 2 ^ 61 hanya 2,305843e + 18 dan alam semesta yang dapat diamati berdiameter 8,8 × 10 ^ 26 m.
me '14
Ya, perkiraan terlalu tinggi! Besarnya sebenarnya sekitar ukuran dan massa Deimos, bulan Mars yang lebih kecil.
2

Java 8, 24 byte

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

Saya perhatikan belum ada jawaban Java, jadi saya pikir saya akan menambahkannya.

Cobalah online.

Penjelasan:

Menggunakan pendekatan Harmonic Mean yang sama dengan jawaban lain:

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
Kevin Cruijssen
sumber
2

MATL , 5 byte

,1w/s

Cobalah online!

Saya tidak yakin apakah "lakukan dua kali" ( ,) dianggap sebagai satu lingkaran, tetapi ini hanya rata-rata harmonik, dibagi dengann .

Bergantian, ,-1^slima byte juga.

Giuseppe
sumber
2

Kode mesin Intel 8087 FPU, 19 byte

 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]

Ini menggunakan instruksi floating point berbasis stack dalam IBM PC 8087 FPU asli.

Input adalah pointer ke nilai resistor dalam [SI], jumlah resistor dalam CX. Output adalah nilai presisi tunggal (DD) di [DI].

640KB
sumber
1

Dart , 42 byte

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

Cobalah online!

Harus secara eksplisit menentukan numjenisnya agak sial, mencegah tipe menyimpulkan, karena itu akan menyimpulkan (dynamic, dynamic) => dynamicyang tidak dapat menghasilkan dua kali lipat untuk beberapa alasan

Elcan
sumber
1

Python 3, 58 44 byte

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

Fungsi rekursif. Membutuhkan argumen untuk dilewati tanpa dibongkar, seperti:

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

atau

f(10, 10, 20)

Penjelasan:

# 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
Triggernometri
sumber
1

Arang , 7 byte

I∕¹Σ∕¹A

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Bekerja dengan menghitung arus yang ditarik oleh masing-masing resistor ketika 1V diterapkan, mengambil total, dan menghitung hambatan yang akan menarik arus itu ketika 1V diterapkan. Penjelasan:

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

J , 6 byte

1%1#.%

Cobalah online!

Galen Ivanov
sumber
2
Sayang sekali "jumlah di bawah kebalikan" adalah jumlah byte yang sama:+/&.:%
ngn
@ ngn Ya, tetapi solusi Anda terlihat lebih idiomatis untuk J.
Galen Ivanov
1

[MATLAB], 15 byte

Satu byte lebih dari jawaban sempurna flawr , tapi saya harus menggunakan fungsi lain jadi begini:

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

Ini agak eksplisit, ini menjumlahkan kebalikan dari resistensi, kemudian membalikkan jumlah untuk menghasilkan resistensi paralel yang setara.

Hoki
sumber
1

Keempat (gforth) , 49 byte

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

Cobalah online!

Input adalah alamat memori dan panjang array (digunakan sebagai array dadakan, karena Forth tidak memiliki konstruk array bawaan)

Menggunakan metode jumlah terbalik karena sebagian besar jawaban lainnya

Penjelasan Kode

: 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
reffu
sumber
1

expl3 (lapisan pemrograman LaTeX3), 65 byte

Berikut ini mendefinisikan fungsi yang mencetak hasil ke terminal (sayangnya expl3memiliki nama fungsi yang sangat verbose):

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

Script lengkap yang dapat dijalankan dari terminal termasuk semua case uji serta pengaturan untuk masuk 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

Jika dijalankan dengan pdflatex <filename>yang berikut ini adalah output konsol:

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.

Penjelasan

\fp_show:n : mengevaluasi argumennya sebagai ekspresi titik mengambang dan mencetak hasilnya pada terminal, setiap makro yang dapat diperluas diperluas selama proses itu.

\clist_map_function:nN : mengambil dua argumen, daftar yang dipisahkan koma dan fungsi / makro, jika dipanggil like \clist_map_function:nN { l1, l2, l3 } \fooitu diperluas ke sesuatu seperti \foo{l1}\foo{l2}\foo{l3}. Dalam kasus kami, bukan \foomakro \2yang digunakan, yang diperluas +1/sehingga ekspresi diperluas ke+1/{l1}+1/{l2}+1/{l3}

Skillmon
sumber