抵抗の計算(オタクの狙撃)


10

こんにちは、ゴルファー、

今日の私たちの挑戦は、XKCDのコミック356370に触発されています。抵抗器のグループの抵抗を計算するプログラムを作成します。これはコードの挑戦であることを正当化するのに十分に厳しいものであることを事前に警告しますが、ゴルフ形式で少し複雑なプログラムを書くことには一定の芸術があると思います。最も少ない数のキャラクターが勝利します。

抵抗の計算は、次の2つの式に依存しています。

  • 抵抗が直列の場合、抵抗は各抵抗の抵抗の合計です。
  • 抵抗が並列の場合、抵抗は各抵抗の抵抗の逆数の合計の逆数になります。

だから-例えば:

抵抗の計算例

あなたの課題は、可能な限り少ない文字数で、最大64個の抵抗器のグループの抵抗を計算することです。特に入力ルールの複雑さについては、お詫び申し上げます。私は、すべての言語が使用できるようにそれらを定義しようとしました。

  • 各抵抗は2つ以上の他の抵抗に接続されます。

  • 入力は有効であることが保証され、1つのエントリと1つの出口ポイントのみが接続されます

  • ネットワークは、提示されているものよりも多くの数学を必要としないようにするために直列並列になります

  • 入力は、言語に適したものに応じて、ファイル、引数、またはstdinを介して行われます。

  • 入力は、一連の改行またはスラッシュで区切られた、抵抗の抵抗の整数からなるステートメントと、抵抗の片側が接続されている抵抗のIDを区切るスペースで構成されます。

  • 最初の抵抗のIDは1で、連続する抵抗ごとに1ずつ増加します。

  • 開始のIDは常に0になります

  • 最終的な抵抗は常に0オームの抵抗を持ち、そのラインで定義された接続のみを持ちます

例えば:

例2

次のように表すことができます

3 0
6 1
1 0
5 0
0 2 3 4
  • 出力は、標準出力またはファイルにすることができます。次のいずれかの方法で表すことができます。
    • 小数点以下2桁以上の数字とそれに続く改行
    • 整数(分子)、スラッシュ、別の整数(分母)で構成され、その後に改行が続く分数。分数は最低の形である必要はありません-たとえば4/4または10/8は許容範囲です。分数は1/100以内で正確でなければなりません。完全に正確であることにはボーナスはありません。これは、固定小数点演算や浮動小数点演算のない言語が競合できるようにするための松葉杖です。

それがすべての点をカバーしているといいのですが。幸運を!


/バックスラッシュではありません。「\」またはスラッシュですか?
John Dvorak

入力が直並列ネットワークでない場合、誤った結果を生成することは許可されますか?
John Dvorak

1
中心の電圧計を抵抗器に交換した場合、ホイートストンブリッジは直並列にならない
John Dvorak

1
抵抗は常に低いIDの抵抗に配線されますか、それとも任意の順序で入力できますか?ある1 2/1 0/0 1有効?
John Dvorak

9
並列の例は間違っています。15/8ではなく15/23にする必要があります。
Peter Taylor

回答:


6

APL 190

インデックスの原点1.最初のループ(s)は直列に配線されたすべての抵抗を結合し、2番目(p)は並列に配線された抵抗を結合し、最初のループを繰り返して、並列抵抗を直列に結合します。最後のゼロ抵抗の仕様は冗長なようです。

r←¯1↓⍎¨(c≠'/')⊂c        
o←⊃↑¨r                  
r←⊃1↓¨r                 
s:→(0=+/n←1=+/×r)/p     
n←↑n/i←⍳↑⍴r             
o[n-1]←+/o[n-0 1]       
o←(i←n≠i)/o             
r←i⌿r                   
r←r-r≥n                 
→s                      
p:n←1⍪2≠/r[;1]          
r←((⍴r),1)⍴r←¯1++\n~0   
o←∊1÷¨+/¨1÷¨n⎕penclose o
→(1<⍴o)/s               
3⍕o                     
' '  

質問の例に加えて、もう少し複雑な例をテストしました。

      Input: '5 0/3 1/1 2/0 2'
 9.000

      Input: '3 0/1 0/5 0/0 1 2 3'
 0.652

      Input: '3 0/6 1/1 0/5 0/0 2 3 4'
 0.763

      Input: '2 0/2 1/2 0/2 0/2 4/2 5/2 2 3 6/2 7/2 2 3 6/0 8 9'
 2.424

常にAPLの回答に驚かされます。最後の抵抗は、他の抵抗を接続するための何かを与えるためのものでした-ダミーのエンドリンク。よくやった!
lochok 2013年

いくつかのキャラクターを保存できると思います。最初の2行をに置き換えo←⊃↑¨r←¯1↓⍎¨(c≠'/')⊂cます。このパターンは、いくつかの場所で適用できます。
FUZxxl 2015

5

Python、329文字

import sys
N=[[1]]+[map(int,x.split())for x in sys.stdin]
N[-1][0]=1
n=len(N)
S=[set([i])for i in range(2*n)]
for x in range(n):
 C=S[2*x]
 for y in N[x][1:]:C|=S[2*y+1]
 for x in C:S[x]|=C
V=[0]*(2*n-1)+[1]
for k in range(999):
 for i in range(1,2*n-1):V[i]+=sum((V[j^1]-V[i])/N[j/2][0]for j in S[i])/9./len(S[i])
print 1/V[1]-2

回路で電圧緩和を行うことにより、抵抗を計算します。まず、最初に1オームの抵抗を取り付け、最後の抵抗を0オームから1オームに変更します。次に、入力電圧を0に、出力電圧を1ボルトに設定します。ネットワークを流れる電流をシミュレートした後、ネットワーク抵抗は最初の1オームの抵抗器での電圧降下を使用して計算されます。

各抵抗には、左側の端子の番号と右側の端子の番号の2つの番号が付けられています。抵抗rの左側の端子は2 * rで、右側の端子は2 * r + 1です。入力はS、一緒に接続されている端子のセットを計算するために使用されます。各端子には電圧が与えられ、V[t]端子セットに電流が流れている場合は電圧を上げ、電流が流れている場合は電圧を下げて緩和を行います。


2

(これはコメントですが、実際のコメントではアスキーアートを行うことはできません...)

このようなものはどのように入力されますか?

    --1--     --3--
   /     \   /     \
---       ---       --0--
   \     /   \     /
    --2--     --4--

特に、3と4は何に接続されていますか?1または2、または1と2の両方?


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