電気回路の並列抵抗


20

前書き:

2つの抵抗、R1およびR2、並列(で示されるR1 || R2)は、次のように結合された抵抗を持ちますRp

RP2=R1R2R1+R2
またはコメントで提案されているとおり:

RP2=11R1+1R2

3個の抵抗器はR1R2R3平行に(R1 || R2 || R3)合成抵抗を有しています(R1 || R2) || R3 = Rp || R3

RP3=R1R2R1+R2R3R1R2R1+R2+R3

または、再びコメントで提案されたとおり:

RP3=11R1+1R2+1R3

もちろん、これらの式は無制限の抵抗に拡張できます。


チャレンジ:

入力として正の抵抗値のリストを取得し、電気回路に並列に配置されている場合は合成抵抗を出力します。抵抗器の最大数を想定することはできません(もちろん、コンピュータがそれを処理できることを除いて)。

テストケース:

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  

各言語の最短コードが優先されます。説明を強くお勧めします。


6
調和平均(1 2 3)を参照する他の課題がいくつかありますが、重複しているとは思いません。flawrが示唆したことと一致して、このチャレンジボディはどこかにそのフレーズをリストする必要があると思います。
FryAmTheEggman

回答:




9

MATLAB、14バイト

MATLAB norm(...,p)では、pベクトルの- ノルムを計算します。これは通常のために定義されp1として

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

しかし、幸運なことに、p=1ます。(Octaveでは機能しないことに注意してください。)

@(x)norm(x,-1)

オンラインで試さないでください!


4
これは恐ろしいと同時に美しいです!
反時計回りの回転を停止

1
ありがとう、これらは最高の賛辞です:)
flawr

7

ゼリー 5  3 バイト

İSİ

オンラインでお試しください!

どうやって?

当初、私は電子工学の時代からこのフォームを忘れていました。

İ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
İで発音されるのと同じように発音されると仮定iしていlistます。これは挑戦が簡単だったと言っているのでしょうか?
Stewie Griffin



4

1
APLはオリジナルのゴルフ言語です!

@YiminRongゴルフ言語ではありません...:P
エリック・ザ・アウトゴルファー

私は知っていますが、そのバイト数は現代のゴルフ言語と同等です!


@AdámOhもちろん、ベクターの場合1∘⊥と同じ+/です...
Erik the Outgolfer




3

Perl 6、14バイト

1/*.sum o 1/**

オンラインでお試しください!

1 / **引数の逆数のリストを返す匿名関数です。 1 / *.sumリスト引数の要素の合計の逆数を返す別の匿名関数です。oオペレータは、これらの二つの機能を構成します。


非常に素晴らしい。HyperWhateversは、より複雑な表現では使用できないため、ゴルフで十分な頻度で使用されることはありません。彼らは通常のWhateversに近づいた場合、私は同じようsumething期待するこの作品には、悲しいかな...
ジョー・キング

ええ、これはおそらくゴルフに使用することを考えたのは初めてだと思いますが、その限界を発見することに失望しました。
ショーン




2

PHP、51バイト

逆数の合計の逆数。入力は$aです。

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

オンラインでお試しください!


PHP7.4では、これができると思います:1/array_reduce($a,fn($c,$i)=>$c+1/$i);(38バイト)。wiki.php.net/rfc/arrow_functionsで
Ismael Miguel

あなたは正しいと思います!しかし、デモする場所はありませんか?

自分でダウンロードする必要があります。ただし、PHP 7.4.0RC1は今月5日にリリースされたので(php.net/archive/2019.php#2019-09-05-1)、おそらく安全に使用できます。疑問がある場合は、メタで尋ねることができます。
イスマエル・ミゲル




2

x86-64マシンコード-20 18バイト

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  

入力-Windows呼び出し規約。最初のパラメーターは、の抵抗器の数ですRCX。抵抗へのポインタはにありRDXます。*ps命令は1バイト小さいため使用されます。技術的には、約2 ^ 61の抵抗しか使用できませんが、それよりずっと前にRAMが不足します。を使用しているため、精度も優れていませんrcpps


「たった2⁶¹の抵抗器」で、おそらく観測可能な宇宙が満たされるでしょう(何度も繰り返します)!

実際、2 ^ 61は2.305843e + 18で、観測可能な宇宙は直径8.8×10 ^ 26 mです。
私の

ええ、深刻な過大評価!実際の大きさは、火星の小さな月であるデイモスの大きさと質量に近いでしょう。

2

Java 8、24バイト

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

Javaの回答がまだないことに気付いたので、追加することを考えました。

オンラインでお試しください。

説明:

他の回答と同じ調和平均アプローチを使用します。

Mバツ1バツn=11バツ1+1バツ2++1バツn

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

Intel 8087 FPUマシンコード、19バイト

 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]

これは、元のIBM PCの8087 FPUのスタックベースの浮動小数点命令を使用します。

入力は、の抵抗値へのポインタ、の抵抗の[SI]数ですCX。出力は、の単精度(DD)値[DI]です。


1

Dart、42バイト

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

オンラインでお試しください!

num型を明示的に指定する必要があるのは、ややこしい(dynamic, dynamic) => dynamicです。何らかの理由で倍精度が得られない型を推論するため、型の推論を防ぎます。



1

Pythonの3、58の 44バイト

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

再帰関数。次のように、引数をアンパックして渡す必要があります。

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

または

f(10, 10, 20)

説明:

# 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

、7バイト

I∕¹Σ∕¹A

オンラインでお試しください!リンクは、コードの詳細バージョンです。1Vが印加されたときに各抵抗器に流れる電流を計算し、合計を取得して、1Vが印加されたときにその電流を流す抵抗を計算することにより機能します。説明:

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


1

[MATLAB]、15バイト

flawrの優れた答えよりも1バイト多くなりましたが、他の関数を使用する必要があったため、ここに進みます。

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

かなり明示的で、抵抗の逆数を合計し、合計を反転して等価の並列抵抗を出力します。


1

Forth(gforth)、49バイト

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

オンラインでお試しください!

入力はメモリアドレスと配列の長さです(Forthには組み込みの配列構造がないため、即席配列として使用されます)

他のほとんどの答えがそうであるように、逆算法を使用します

コードの説明

: 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(LaTeX3プログラミングレイヤー)、65バイト

以下は、結果を端末に出力する関数を定義しています(残念ながらexpl3非常に冗長な関数名があります)。

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

入力するセットアップだけでなく、すべてのテストケースを含むターミナルから実行できる完全なスクリプト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

pdflatex <filename>コンソール出力が次で実行される場合:

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.

説明

\fp_show:n :引数を浮動小数点式として評価し、結果を端末に出力します。すべての展開可能なマクロはそのプロセス中に展開されます。

\clist_map_function:nN :のように呼び出された場合、コンマは、リストおよび機能/マクロを分け、二つの引数を取り\clist_map_function:nN { l1, l2, l3 } \foo、それはのようなものに展開\foo{l1}\foo{l2}\foo{l3}。私たちのケースでは\foo、マクロの代わりに、式が展開さ\2れる+1/ように展開されるマクロが使用されます+1/{l1}+1/{l2}+1/{l3}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.