Resistência paralela em circuitos elétricos

20

Introdução:

Dois resistores R1e R2, em paralelo (denotados R1 || R2), têm uma resistência combinada Rpdada como:

RP2=R1R2R1+R2
ou conforme sugerido nos comentários:

RP2=11R1+1R2

Três resistências, R1, R2e R3em paralelo ( R1 || R2 || R3) tem uma resistência combinada (R1 || R2) || R3 = Rp || R3:

RP3=R1R2R1+R2R3R1R2R1+R2+R3

ou, novamente, como sugerido nos comentários:

RP3=11R1+1R2+1R3

Naturalmente, essas fórmulas podem ser estendidas a um número indefinido de resistores.


Desafio:

Pegue uma lista de valores positivos do resistor como entrada e produza a resistência combinada se eles foram colocados em paralelo em um circuito elétrico. Você não pode assumir um número máximo de resistores (exceto que o seu computador pode lidar com isso, é claro).

Casos de teste:

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  

O código mais curto em cada idioma vence. As explicações são altamente encorajadas.

Stewie Griffin
fonte
6
Existem alguns outros desafios que se referem à média harmônica ( 1 2 3 ), mas não acho que exista uma duplicata. De acordo com o que flawr sugeriu, acho que esse órgão de desafio deve ter essa frase listada em algum lugar para que possamos fechar um futuro mais facilmente.
FryAmTheEggman 11/09

Respostas:

13

05AB1E , 5 3 bytes

zOz

Experimente online!


Explicação

z                     # compute 1/x for each x in input 
 O                    # sum input 
  z                   # compute 1/sum
Dados expirados
fonte
4
Exceto os embutidos, provavelmente é o mais baixo possível!
9

Haskell , 18 16 bytes

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

Experimente online!

flawr
fonte
3
Parece lindo.
Eric Duminil 12/09
Solução ao longo de linhas recursiva do OP seria 22 caracteres: foldr1(\r s->r*s/(r+s)).
deixou de girar no sentido contrário
9

MATLAB , 14 bytes

No MATLAB norm(...,p)calcula a p-norm de um vetor. Isso geralmente é definido para p1 como

vp=(Eu|vEu|p)1p.

Mas, felizmente para nós, isso também funciona para . (Observe que ele não funciona no Octave.)p=-1

@(x)norm(x,-1)

Não tente online!

flawr
fonte
4
Isso é horrível e bonito ao mesmo tempo!
deixou de girar no sentido contrário
1
Obrigado, estes são os melhores elogios :)
flawr 12/09
7

Geléia ,  5  3 bytes

İSİ

Experimente online!

Quão?

Inicialmente esqueci este formulário dos meus dias de engenharia eletrônica ... com que facilidade esquecemos.

İ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
fonte
4
Estou assumindo que İé pronunciado da mesma maneira que ié pronunciado list. É assim que se diz que o desafio foi fácil?
Stewie Griffin
4

PowerShell , 22 bytes

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

Experimente online!

Recebe informações por meio de splatting e usa a mesma soma de truque inverso que muitos outros estão fazendo

Veskah
fonte
4

Oitava , 15 bytes

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

Experimente online!

Média harmônica, dividida por n. Mole-mole.

Giuseppe
fonte
@tsh você sabe, acho que nunca percebi isso. Eu acho que é quase a média harmônica ...
Giuseppe
4

APL (Dyalog Unicode) , 4 bytes

÷1⊥÷

Experimente online!

-1 graças a Adám .

Erik, o Outgolfer
fonte
1
APL é a língua original do golfe!
@YiminRong Não é uma língua de golfe ...: P
Erik the Outgolfer
Eu sei, mas sua contagem de bytes está no mesmo nível das línguas modernas do golfe!
-1 byte: ÷1⊥÷ Experimente online!
Adám 15/09
@ Adám Oh, claro, 1∘⊥é o mesmo que +/para vetores ...
Erik, o Outgolfer,
3

R , 15 bytes

1/sum(1/scan())

Experimente online!

Segue o mesmo princípio da Média Harmônica visto em outras respostas.

Sumner18
fonte
3

Perl 6 , 14 bytes

1/*.sum o 1/**

Experimente online!

1 / **é uma função anônima que retorna uma lista dos recíprocos de seus argumentos. 1 / *.sumé outra função anônima que retorna o inverso da soma dos elementos de seu argumento de lista. O ooperador compõe essas duas funções.

Sean
fonte
Muito agradável. Não vejo o HyperWhatevers usado com bastante frequência no golfe, pois não pode ser usado em expressões mais complexas. Se eles estavam mais próximos Whatevers normais, eu esperaria sumething como esta para trabalhar, mas infelizmente ...
Jo Rei
Sim, esta é provavelmente a primeira vez que pensei em usar um para jogar golfe e fiquei decepcionado ao descobrir suas limitações.
Sean
3

bash + coreutils, 25 bytes

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

TIO

Nahuel Fouilleul
fonte
3

Wolfram Language (Mathematica) , 10 bytes

1/Tr[1/#]&

Experimente online!

attinat
fonte
Não há um meio harmônico embutido ou é mais longo para digitar?
Eric Duminil 12/09
O @Eric AFAIK é nomeado intuitivamente HarmonicMeane é mais longo.
meu pronome é monicareinstate
3

MathGolf , 3 bytes

∩Σ∩

1nΣ

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

Experimente online.

Kevin Cruijssen
fonte
2

PHP , 51 bytes

Recíproco da soma dos recíprocos. Entrada é $a.

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

Experimente online!


fonte
Com o PHP7.4, acho que você pode fazer isso: 1/array_reduce($a,fn($c,$i)=>$c+1/$i);(38 bytes). Leia mais em wiki.php.net/rfc/arrow_functions
Ismael Miguel
Eu acho que você está certo! Mas nenhum lugar para demo?
Você precisa fazer o download você mesmo. No entanto, desde que o PHP 7.4.0RC1 foi lançado no dia 5 deste mês ( php.net/archive/2019.php#2019-09-05-1 ), você provavelmente está seguro em usá-lo. Se você tiver dúvidas, pode perguntar na meta.
Ismael Miguel
2

JavaScript (ES6), 29 bytes

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

Experimente online!

ou:

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

Experimente online!

Mas com essa abordagem, usar map()(como Shaggy fez ) é 1 byte mais curto.

Arnauld
fonte
2

x86-64 Código da máquina - 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  

Entrada - convenção de chamada do Windows. O primeiro parâmetro é o número de resistores em RCX. Um apontador para as resistências está em RDX. *psAs instruções são usadas, pois são um byte menor. Tecnicamente, você pode ter apenas 2 ^ 61 resistores, mas estará sem memória RAM muito antes disso. A precisão também não é ótima, pois estamos usando rcpps.

mim'
fonte
“Apenas 2⁶¹ resistores” provavelmente encheriam o universo observável (muitas vezes)!
Na verdade, 2 ^ 61 tem apenas 2,305843e + 18 e o universo observável tem 8,8 × 10 ^ 26 m de diâmetro.
me
Sim, superestimação séria! A magnitude real seria em torno do tamanho e massa de Deimos, menor lua de Marte.
2

Java 8, 24 bytes

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

Notei que ainda não havia uma resposta em Java, então achei que adicionaria uma.

Experimente online.

Explicação:

Usa a mesma abordagem de Média Harmônica de outras respostas:

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

MATL , 5 bytes

,1w/s

Experimente online!

Não tenho certeza se "fazer duas vezes" ( ,) conta como um loop, mas essa é apenas a média harmônica, dividida por n.

Como alternativa, ,-1^ssão cinco bytes também.

Giuseppe
fonte
2

Código da máquina FPU Intel 8087, 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]

Isso usa as instruções de ponto flutuante baseadas em pilha na FPU 8087 original do IBM PC.

A entrada é um ponteiro para os valores do resistor em [SI], número de resistores em CX. A saída é para um único valor de precisão (DD) em [DI].

640KB
fonte
1

Dardo , 42 bytes

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

Experimente online!

Ter que especificar explicitamente o numtipo é meio chato, evita a dedução de tipos, porque inferiria o (dynamic, dynamic) => dynamicque não pode resultar em duplicado por algum motivo

Elcan
fonte
1

Python 3, 58 44 bytes

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

Uma função recursiva. Requer que os argumentos sejam passados ​​descompactados, da seguinte maneira:

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

ou

f(10, 10, 20)

Explicação:

# 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
fonte
1

Carvão , 7 bytes

I∕¹Σ∕¹A

Experimente online! Link é a versão detalhada do código. Funciona calculando a corrente consumida por cada resistor quando 1V é aplicado, obtendo o total e calculando a resistência que consumiria essa corrente quando 1V for aplicado. Explicação:

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

J , 6 bytes

1%1#.%

Experimente online!

Galen Ivanov
fonte
2
é uma pena que "soma sob recíproco" seja o mesmo número de bytes:+/&.:%
ngn 13/09
@ngn Sim, mas sua solução parece mais idiomática para J.
Galen Ivanov
1

[MATLAB], 15 bytes

Mais um byte de flawr resposta excelente, mas eu tive que usar outras funções então aqui vai:

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

É bastante explícito, soma o inverso das resistências e inverte a soma para produzir a resistência paralela equivalente.

Hoki
fonte
1

Quarto (gforth) , 49 bytes

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

Experimente online!

Entrada é um endereço de memória e comprimento da matriz (usado como uma matriz improvisada, pois Forth não possui uma construção de matriz incorporada)

Usa o método da soma inversa, pois a maioria das outras respostas é

Código Explicação

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

expl3 (camada de programação LaTeX3), 65 bytes

A seguir, define uma função que imprime o resultado no terminal (infelizmente, expl3possui nomes de funções muito detalhados):

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

Um script completo que pode ser executado no terminal, incluindo todos os casos de teste, bem como a configuração para inserir 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

Se executar com pdflatex <filename>o seguinte é a saída do console:

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.

Explicação

\fp_show:n : avalia seu argumento como uma expressão de ponto flutuante e imprime o resultado no terminal, toda macro expansível é expandida durante esse processo.

\clist_map_function:nN : recebe dois argumentos, uma lista separada por vírgula e uma função / macro, se chamada como \clist_map_function:nN { l1, l2, l3 } \foose expande para algo como \foo{l1}\foo{l2}\foo{l3}. No nosso caso, em vez da \foomacro \2é usada, a qual se expande para +1/que a expressão se expanda para+1/{l1}+1/{l2}+1/{l3}

Skillmon
fonte