Równoległa rezystancja w obwodach elektrycznych

20

Wprowadzenie:

Dwa rezystory R1i R2równolegle (oznaczone R1 || R2) mają połączony opór Rppodany jako:

RP2=R1R2R1+R2
lub zgodnie z sugestiami w komentarzach:

RP2=11R1+1R2

Trzy Rezystory R1, R2i R3(równolegle R1 || R2 || R3) mają łączną odporność (R1 || R2) || R3 = Rp || R3:

RP3=R1R2R1+R2R3R1R2R1+R2+R3

lub ponownie, zgodnie z sugestiami w komentarzach:

RP3=11R1+1R2+1R3

Wzory te można oczywiście rozszerzyć na nieokreśloną liczbę rezystorów.


Wyzwanie:

Weź listę dodatnich wartości rezystorów jako dane wejściowe i wyślij połączony opór, jeśli zostały umieszczone równolegle w obwodzie elektrycznym. Nie możesz założyć maksymalnej liczby rezystorów (z wyjątkiem tego, że komputer oczywiście może to obsłużyć).

Przypadki testowe:

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  

Wygrywa najkrótszy kod w każdym języku. Wyjaśnienia są bardzo zalecane.

Stewie Griffin
źródło
6
Istnieje kilka innych wyzwań, które odnoszą się do średniej harmonicznej ( 1 2 3 ), ale nie sądzę, aby istniała kopia. Zgodnie z tym, co sugeruje flawr, uważam, że to wyzwanie powinno mieć gdzieś to zdanie na liście, abyśmy mogli łatwiej zamknąć przyszłe dupe.
FryAmTheEggman

Odpowiedzi:

13

05AB1E , 5 3 bajty

zOz

Wypróbuj online!


Wyjaśnienie

z                     # compute 1/x for each x in input 
 O                    # sum input 
  z                   # compute 1/sum
Wygasły dane
źródło
4
Z wyjątkiem wbudowanych, jest to prawdopodobnie tak niskie, jak to możliwe!
9

Haskell , 18 16 bajtów

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

Wypróbuj online!

wada
źródło
3
To wygląda pięknie.
Eric Duminil
Rozwiązanie wzdłuż linii rekurencyjnych PO byłaby 22 znaków: foldr1(\r s->r*s/(r+s)).
przestał się obracać w lewo o
9

MATLAB , 14 bajtów

W MATLAB norm(...,p)oblicza p-norm wektora. Zwykle jest to definiowane dla p1 jako

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

Ale na szczęście dla nas to też działa p=1 . (Pamiętaj, że nie działa w Octave).

@(x)norm(x,-1)

Nie próbuj online!

wada
źródło
4
To jednocześnie okropne i piękne!
przestał się obracać przeciwnie do zegara
1
Dzięki, to są najlepsze komplementy :)
flawr
7

Galaretka ,  5  3 bajtów

İSİ

Wypróbuj online!

W jaki sposób?

Początkowo zapomniałem tego formularza z moich dni inżynierii elektronicznej ... jak łatwo możemy zapomnieć.

İ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
źródło
4
Zakładam, że İwymawia się w taki sam sposób, jak iwymawia się w list. Czy to sposób na stwierdzenie, że wyzwanie było łatwe?
Stewie Griffin
4

PowerShell , 22 bajty

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

Wypróbuj online!

Pobiera dane wejściowe poprzez rozpryskiwanie i używa tej samej 1 / sumy odwrotnej lewy, co robi wielu innych

Veskah
źródło
4

Oktawa , 15 bajtów

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

Wypróbuj online!

Średnia harmoniczna podzielona przez n. Bułka z masłem.

Giuseppe
źródło
@ wiesz, nie sądzę, żebym to kiedykolwiek zauważył. Myślę, że to prawie harmoniczny środek ...
Giuseppe
4

APL (Dyalog Unicode) , 4 bajty

÷1⊥÷

Wypróbuj online!

-1 dzięki Adámowi .

Erik the Outgolfer
źródło
1
APL to oryginalny język golfa!
@YiminRong To nie jest język golfowy ...: P
Erik the Outgolfer
Wiem, ale liczba bajtów jest na równi z nowoczesnymi językami golfa!
-1 bajt: ÷1⊥÷ Wypróbuj online!
Adám
@ Adám Oh duh oczywiście 1∘⊥jest taki sam jak +/dla wektorów ...
Erik the Outgolfer
3

R , 15 bajtów

1/sum(1/scan())

Wypróbuj online!

Przestrzega tej samej zasady średniej harmonicznej, co w innych odpowiedziach.

Sumner18
źródło
3

Perl 6 , 14 bajtów

1/*.sum o 1/**

Wypróbuj online!

1 / **jest anonimową funkcją, która zwraca listę wzajemności swoich argumentów. 1 / *.sumto kolejna anonimowa funkcja, która zwraca odwrotność sumy elementów argumentu listy. oOperatora tworzy te dwie funkcje.

Sean
źródło
Bardzo dobrze. Nie widzę, że HyperWhatevers są wystarczająco często używane w golfie, ponieważ nie można ich używać w bardziej złożonych wyrażeniach. Gdyby byli bliżej normalnych whatevers, będę oczekiwać sumething jak to do pracy, ale niestety ...
Jo Król
Tak, to chyba pierwszy raz, kiedy pomyślałem o użyciu jednego do gry w golfa, i byłem rozczarowany odkryciem jego ograniczeń.
Sean
3

bash + coreutils, 25 bajtów

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

TIO

Nahuel Fouilleul
źródło
3

MathGolf , 3 bajty

∩Σ∩

To samo co inne odpowiedzi, używając wbudowanych (1n) i Σ(suma):

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

Wypróbuj online.

Kevin Cruijssen
źródło
2

PHP , 51 bajtów

Wzajemność sumy wzajemności. Dane wejściowe to $a.

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

Wypróbuj online!


źródło
W PHP7.4 myślę, że możesz to zrobić: 1/array_reduce($a,fn($c,$i)=>$c+1/$i);(38 bajtów). Czytaj więcej na wiki.php.net/rfc/arrow_functions
Ismael Miguel
Myślę, że masz rację! Ale nie masz gdzie demo?
Musisz pobrać go sam. Ponieważ jednak PHP 7.4.0RC1 zostało wydane 5 tego miesiąca ( php.net/archive/2019.php#2019-09-05-1 ), prawdopodobnie możesz go bezpiecznie używać. Jeśli masz wątpliwości, możesz zapytać w meta.
Ismael Miguel
2

JavaScript (ES6), 29 bajtów

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

Wypróbuj online!

lub:

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

Wypróbuj online!

Ale przy takim podejściu użycie map()(tak jak Shaggy ) jest o 1 bajt krótsze.

Arnauld
źródło
2

x86-64 Kod maszynowy - 20 18 bajtów

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  

Wejście - konwencja wywoływania systemu Windows. Pierwszy parametr to liczba rezystorów w RCX. Wskaźnik na rezystory jest w RDX. *psinstrukcje są używane, ponieważ są one o jeden bajt mniejsze. Technicznie rzecz biorąc, możesz mieć tylko około 2 ^ 61 rezystorów, ale na długo przedtem nie będziesz mieć pamięci RAM. Precyzja też nie jest duża, ponieważ używamy rcpps.

mnie'
źródło
„Tylko rezystory 2⁶¹” prawdopodobnie wypełniłyby obserwowalny wszechświat (wielokrotnie)!
W rzeczywistości 2 ^ 61 to tylko 2,305843e + 18, a obserwowany wszechświat ma średnicę 8,8 × 10 ^ 26 m.
ja
Tak, poważne przeszacowanie! Rzeczywista wielkość byłaby mniej więcej wielkości i masy Deimosa, mniejszego księżyca Marsa.
2

Java 8, 24 bajty

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

Zauważyłem, że nie ma jeszcze odpowiedzi w języku Java, więc pomyślałem, że ją dodam.

Wypróbuj online.

Wyjaśnienie:

Używa tego samego podejścia harmonicznej średniej, co inne odpowiedzi:

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
źródło
2

MATL , 5 bajtów

,1w/s

Wypróbuj online!

Nie jestem pewien, czy „zrobić dwa razy” ( ,) liczy się jako pętla, ale jest to tylko średnia harmoniczna podzielona przez n.

Alternatywnie ,-1^sma również pięć bajtów.

Giuseppe
źródło
2

Kod maszynowy procesora Intel 8087 FPU, 19 bajtów

 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]

Wykorzystuje to instrukcje zmiennoprzecinkowe oparte na stosie w oryginalnym komputerze PC 8087 FPU.

Wejście to wskaźnik do wartości rezystora w [SI], liczba rezystorów w CX. Dane wyjściowe mają wartość pojedynczej precyzji (DD) przy [DI].

640 KB
źródło
1

Dart , 42 bajty

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

Wypróbuj online!

numKonieczność jawnego określenia typu jest trochę pechowa, uniemożliwia wnioskowanie o typie, ponieważ oznaczałoby, że (dynamic, dynamic) => dynamicz jakiegoś powodu nie można uzyskać dublowania

Elcan
źródło
1

Python 3, 58 44 bajtów

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

Funkcja rekurencyjna. Wymaga przekazania argumentów rozpakowanych, takich jak:

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

lub

f(10, 10, 20)

Wyjaśnienie:

# 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
Triggernometria
źródło
1

Węgiel drzewny , 7 bajtów

I∕¹Σ∕¹A

Wypróbuj online! Link jest do pełnej wersji kodu. Działa poprzez obliczenie prądu pobieranego przez każdy rezystor, gdy przyłożone zostanie 1 V, biorąc sumę i obliczając rezystancję, która pobierałaby ten prąd, gdy przyłożono 1 V. Wyjaśnienie:

      A Input array
    ∕¹  Reciprocal (vectorised)
   Σ    Sum
 ∕¹     Reciprocal
I       Cast to string for implicit print
Neil
źródło
1

J , 6 bajtów

1%1#.%

Wypróbuj online!

Galen Iwanow
źródło
2
szkoda, że ​​„suma na zasadzie wzajemności” to ta sama liczba bajtów:+/&.:%
ngn
@ngn Tak, ale twoje rozwiązanie wygląda bardziej idiomatycznie na J.
Galen Iwanow
1

[MATLAB], 15 bajtów

Jeszcze jeden bajt niż flawr doskonała odpowiedź, ale musiałem użyć innych funkcji, więc oto:

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

Jest to raczej wyraźne, sumuje odwrotność rezystancji, a następnie odwraca sumę, aby uzyskać równoważny równoległy opór.

Hoki
źródło
1

Dalej (gforth) , 49 bajtów

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

Wypróbuj online!

Dane wejściowe to adres pamięci i długość tablicy (używane jako tablica improwizowana, ponieważ Forth nie ma wbudowanej konstrukcji tablicy)

Używa metody sumowania odwrotności, jak większość innych odpowiedzi

Objaśnienie kodu

: 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
źródło
1

expl3 (warstwa programowania LaTeX3), 65 bajtów

Poniżej zdefiniowano funkcję, która wypisuje wynik na terminal (niestety expl3ma bardzo pełne nazwy funkcji):

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

Kompletny skrypt, który można uruchomić z terminala, w tym wszystkie przypadki testowe, a także konfiguracja do wprowadzenia 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

Jeśli uruchomiono z pdflatex <filename>następującymi, jest wyjście konsoli:

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.

Wyjaśnienie

\fp_show:n : ocenia swój argument jako wyrażenie zmiennoprzecinkowe i wypisuje wynik na terminalu, każde rozwijane makro jest rozwijane podczas tego procesu.

\clist_map_function:nN : przyjmuje dwa argumenty, listę oddzieloną przecinkami i funkcję / makro, jeśli wywoływane jak \clist_map_function:nN { l1, l2, l3 } \footo rozwija się do czegoś podobnego \foo{l1}\foo{l2}\foo{l3}. W naszym przypadku zamiast \foomakra \2używane jest makro , które rozwija się do, +1/tak że rozwija się wyrażenie+1/{l1}+1/{l2}+1/{l3}

Skillmon
źródło