下午好,高尔夫球手,
我们今天的挑战来自XKCD漫画、356和370。我们将编写一个程序来计算一组电阻的电阻。预先警告说,这几乎足以证明这是一个代码挑战,然而,我认为以黄金格式编写稍微复杂一些的程序是一门艺术。最少的字符获胜。
电阻的计算依赖于以下两个公式:
例如:
你的挑战是,以尽可能少的字符,计算一组多达64个电阻器的电阻。我对复杂性,特别是输入规则的复杂性表示歉意。我试图用这样一种方式来定义它们:每种语言都是可用的。
例如:
可以表示为
3 0
6 1
1 0
5 0
0 2 3 4
我希望这涵盖了所有要点。祝好运!
发布于 2013-03-10 06:08:19
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欧姆电阻的电压降来计算网络电阻。
每个电阻器都有两个数字,一个是左边的数字,另一个是右边的数字。电阻r的左端为2*r,右端为2*r+1,输入用于计算连接在一起的S
。给每个端子一个电压V[t]
,如果电流净流入端子组,则通过提高电压来实现松弛,如果电流是净流出的,则降低电压。
发布于 2013-03-10 16:48:20
指数原点1.第一环(s)将所有串联的电阻(p)、并联的电阻(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
https://codegolf.stackexchange.com/questions/10863
复制相似问题