Parallelwiderstand in Stromkreisen

20

Einführung:

Zwei Widerstände R1und R2parallel (bezeichnet R1 || R2) haben einen kombinierten Widerstandswert Rp, der wie folgt angegeben wird:

RP2=R1R2R1+R2
oder wie in den Kommentaren vorgeschlagen:

RP2=11R1+1R2

Drei Widerstände R1, R2und R3parallel ( R1 || R2 || R3) einen kombinierten Widerstand (R1 || R2) || R3 = Rp || R3:

RP3=R1R2R1+R2R3R1R2R1+R2+R3

oder, wie in den Kommentaren vorgeschlagen:

RP3=11R1+1R2+1R3

Diese Formeln können natürlich auf eine unbestimmte Anzahl von Widerständen erweitert werden.


Herausforderung:

Nehmen Sie eine Liste positiver Widerstandswerte als Eingang und geben Sie den kombinierten Widerstand aus, wenn diese in einem Stromkreis parallel geschaltet wurden. Sie dürfen nicht von einer maximalen Anzahl von Widerständen ausgehen (außer dass Ihr Computer dies natürlich kann).

Testfälle:

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  

Der kürzeste Code in jeder Sprache gewinnt. Erklärungen sind ausdrücklich erwünscht.

Stewie Griffin
quelle
6
Es gibt einige andere Herausforderungen, die sich auf das harmonische Mittel beziehen ( 1 2 3 ), aber ich glaube nicht, dass es ein Duplikat gibt. Entsprechend dem, was Flawr vorschlug, sollte dieser Herausforderungsgremium diesen Satz irgendwo aufführen, damit wir einen zukünftigen Betrüger leichter schließen können.
FryAmTheEggman

Antworten:

13

05AB1E , 5 3 Bytes

zOz

Probieren Sie es online!


Erläuterung

z                     # compute 1/x for each x in input 
 O                    # sum input 
  z                   # compute 1/sum
Abgelaufene Daten
quelle
4
Abgesehen von den eingebauten Funktionen ist dies wahrscheinlich so niedrig wie möglich.
9

Haskell , 18 16 Bytes

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

Probieren Sie es online!

fehlerhaft
quelle
3
Es sieht schön aus.
Eric Duminil
Lösung entlang der rekursiven Linien des OP würde 22 Zeichen sein: foldr1(\r s->r*s/(r+s)).
drehte sich
9

MATLAB , 14 Bytes

In MATLAB wird norm(...,p)die p-Norm eines Vektors berechnet . Dies wird normalerweise für p1 als definiert

vp=(ich|vich|p)1p.

Aber zum Glück funktioniert es auch für p=-1 . (Beachten Sie, dass es in Octave nicht funktioniert.)

@(x)norm(x,-1)

Versuchen Sie es nicht online!

fehlerhaft
quelle
4
Das ist schrecklich und schön zugleich!
hörte
1
Danke, das sind die besten Komplimente :)
Fehler
7

Gelee ,  5  3 Bytes

İSİ

Probieren Sie es online!

Wie?

Anfangs habe ich dieses Formular aus meiner Zeit als Elektroniker vergessen ... wie leicht wir es vergessen.

İ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
quelle
4
Ich gehe davon aus, dass İes genauso iausgesprochen wird wie in list. Ist dies eine Art zu sagen, dass die Herausforderung einfach war?
Stewie Griffin
4

Oktave , 15 Bytes

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

Probieren Sie es online!

Harmonischer Mittelwert, geteilt durch n. Kinderleicht.

Giuseppe
quelle
@tsh du weißt, ich glaube nicht, dass ich das jemals bemerkt habe. Ich denke, es ist fast das harmonische Mittel ...
Giuseppe
4

APL (Dyalog Unicode) , 4 Bytes

÷1⊥÷

Probieren Sie es online!

-1 danke an Adám .

Erik der Outgolfer
quelle
1
APL ist die ursprüngliche Golfsprache!
@YiminRong Es ist keine Golfsprache ...: P
Erik the Outgolfer
Ich weiß, aber die Anzahl der Bytes ist den modernen Golfsprachen ebenbürtig!
-1 Byte: ÷1⊥÷ Probieren Sie es online!
Adám,
@ Adám Oh duh natürlich 1∘⊥ist das gleiche wie +/für Vektoren ...
Erik der Outgolfer
3

R , 15 Bytes

1/sum(1/scan())

Probieren Sie es online!

Folgt dem gleichen harmonischen Mittelwertprinzip wie in anderen Antworten.

Sumner18
quelle
3

Perl 6 , 14 Bytes

1/*.sum o 1/**

Probieren Sie es online!

1 / **ist eine anonyme Funktion, die eine Liste der Kehrwerte ihrer Argumente zurückgibt. 1 / *.sumist eine weitere anonyme Funktion, die den Kehrwert der Summe der Elemente ihres Listenarguments zurückgibt. Der oBediener stellt diese beiden Funktionen zusammen.

Sean
quelle
Sehr schön. Ich sehe HyperWhatevers nicht oft genug beim Golfen, da sie nicht in komplexeren Ausdrücken verwendet werden können. Wenn sie in dem normalen Was immer näher wären, würde ich sumething wie erwarte dies funktioniert, aber leider ...
Jo König
Ja, dies ist wahrscheinlich das erste Mal, dass ich überhaupt daran gedacht habe, einen für das Golfen zu verwenden, und ich war enttäuscht, seine Grenzen zu entdecken.
Sean,
3

Bash + Coreutils, 25 Bytes

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

TIO

Nahuel Fouilleul
quelle
3

MathGolf , 3 Bytes

∩Σ∩

1nΣ

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

Probieren Sie es online aus.

Kevin Cruijssen
quelle
2

PHP , 51 Bytes

Kehrwert der Summe der Kehrwerte. Eingabe ist $a.

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

Probieren Sie es online!


quelle
Ich denke, mit PHP7.4 können Sie dies tun: 1/array_reduce($a,fn($c,$i)=>$c+1/$i);(38 Bytes). Lesen Sie mehr in wiki.php.net/rfc/arrow_functions
Ismael Miguel
Ich denke, du hast recht! Aber nirgendwo Demo?
Sie müssen es selbst herunterladen. Da PHP 7.4.0RC1 jedoch am 5. dieses Monats veröffentlicht wurde ( php.net/archive/2019.php#2019-09-05-1 ), können Sie es wahrscheinlich sicher verwenden. Wenn Sie Zweifel haben, können Sie im Meta nachfragen.
Ismael Miguel
2

x86-64 Maschinencode - 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  

Eingabe - Windows-Aufrufkonvention. Erster Parameter ist die Anzahl der Widerstände in RCX. Ein Zeiger auf die Widerstände ist in RDX. *psAnweisungen werden verwendet, da sie ein Byte kleiner sind. Technisch gesehen können Sie nur ungefähr 2 ^ 61 Widerstände haben, aber lange vorher haben Sie keinen RAM mehr. Die Präzision ist auch nicht großartig, da wir verwenden rcpps.

mich'
quelle
"Nur 2⁶¹ Widerstände" würden wahrscheinlich das beobachtbare Universum (um ein Vielfaches) füllen!
Tatsächlich ist 2 ^ 61 nur 2,305843e + 18 und das beobachtbare Universum hat einen Durchmesser von 8,8 × 10 ^ 26 m.
Ich
Ja, ernsthafte Überschätzung! Die tatsächliche Größe würde in etwa der Größe und Masse von Deimos, dem kleineren Marsmond, entsprechen.
2

Java 8, 24 Bytes

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

Ich bemerkte, dass es noch keine Java-Antwort gab, also dachte ich mir, ich würde eine hinzufügen.

Probieren Sie es online aus.

Erläuterung:

Verwendet den gleichen harmonischen Mittelwertansatz wie andere Antworten:

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
quelle
2

MATL , 5 Bytes

,1w/s

Probieren Sie es online!

Ich bin mir nicht sicher, ob "do two" ( ,) als Schleife zählt, aber dies ist nur das harmonische Mittel, geteilt durch n.

Alternativ sind ,-1^ses auch fünf Bytes.

Giuseppe
quelle
2

Intel 8087 FPU-Maschinencode, 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]

Hierbei werden die stapelbasierten Gleitkommaanweisungen in der 8087-FPU des ursprünglichen IBM-PCs verwendet.

Eingang ist Zeiger auf Widerstandswerte in [SI], Anzahl der Widerstände in CX. Die Ausgabe erfolgt auf einen Wert mit einfacher Genauigkeit (DD) bei [DI].

640 KB
quelle
1

Dart , 42 Bytes

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

Probieren Sie es online!

Wenn Sie den numTyp explizit angeben müssen, ist dies ein bisschen unsinnig. Dies verhindert das Ableiten von Typen, da daraus abgeleitet werden würde, dass (dynamic, dynamic) => dynamicaus irgendeinem Grund keine Double- Werte erzielt werden können

Elcan
quelle
1

Python 3, 58 44 Bytes

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

Eine rekursive Funktion. Erfordert, dass Argumente wie folgt entpackt übergeben werden:

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

oder

f(10, 10, 20)

Erläuterung:

# 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
Triggernometrie
quelle
1

Kohle , 7 Bytes

I∕¹Σ∕¹A

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Berechnet den von jedem Widerstand gezogenen Strom bei Anlegen von 1 V, berechnet die Summe und berechnet den Widerstand, der diesen Strom bei Anlegen von 1 V ziehen würde. Erläuterung:

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

J , 6 Bytes

1%1#.%

Probieren Sie es online!

Galen Ivanov
quelle
2
Es ist schade, dass "Summe unter Gegenseitigkeit" die gleiche Anzahl von Bytes hat:+/&.:%
ngn
@ngn Ja, aber Ihre Lösung sieht für J.
Galen Ivanov
1

[MATLAB], 15 Bytes

Ein Byte mehr als flawr ausgezeichnete Antwort, aber ich musste andere Funktionen verwenden, also hier geht:

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

Es ist ziemlich explizit, es summiert die Inverse der Widerstände und invertiert dann die Summe, um den äquivalenten Parallelwiderstand auszugeben.

Hoki
quelle
1

Viertens (gviertens) , 49 Bytes

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

Probieren Sie es online!

Die Eingabe ist eine Speicheradresse und eine Arraylänge (wird als spontanes Array verwendet, da Forth kein eingebautes Array-Konstrukt hat).

Verwendet die Methode der inversen Summe wie die meisten anderen Antworten

Code Erklärung

: 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
quelle
1

expl3 (LaTeX3-Programmierschicht), 65 Bytes

Im Folgenden wird eine Funktion definiert, die das Ergebnis auf dem Terminal expl3ausgibt (leider mit sehr ausführlichen Funktionsnamen):

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

Ein vollständiges Skript, das vom Terminal aus ausgeführt werden kann, einschließlich aller Testfälle sowie des Setups, um Folgendes einzugeben 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

Wenn mit pdflatex <filename>dem folgenden Befehl ausgeführt wird, wird die Konsolenausgabe angezeigt:

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.

Erläuterung

\fp_show:n : wertet sein Argument als Gleitkommaausdruck aus und gibt das Ergebnis auf dem Terminal aus. Dabei wird jedes erweiterbare Makro erweitert.

\clist_map_function:nN : benötigt zwei Argumente, eine durch Kommas getrennte Liste und eine Funktion / ein Makro, wenn sie so aufgerufen wird, als würde \clist_map_function:nN { l1, l2, l3 } \foosie zu so etwas erweitert \foo{l1}\foo{l2}\foo{l3}. In unserem Fall wird statt des \fooMakros \2das verwendet, das sich zu erweitert, +1/so dass sich der Ausdruck zu erweitert+1/{l1}+1/{l2}+1/{l3}

Skillmon
quelle