计算电阻(书呆子狙击)


10

下午好,高尔夫球手,

我们今天的挑战是受XKCD漫画356370启发的。我们将编写一个程序来计算一组电阻的电阻。预先警告说,这几乎足以应付代码挑战,但是我认为以高尔夫格式编写稍微复杂一些的程序是有一定道理的。最少的字符获胜。

计算电阻取决于以下两个公式:

  • 如果电阻是串联的,则电阻是每个电阻的电阻之和
  • 如果电阻是并联的,则电阻是每个电阻的电阻之和的倒数。

所以-例如:

电阻计算示例

您面临的挑战是,以最少的字符数来计算一组最多64个电阻器的电阻。对于复杂性,尤其是输入规则,我深表歉意。我试图以每种语言都可以使用的方式定义它们。

  • 每个电阻将连接到2个或更多其他电阻。

  • 保证输入有效,只有一个入口和一个出口点,它们将连接

  • 网络将是串并联的,以防止需要比所展示的更多的数学运算

  • 输入将通过文件,参数或标准输入,这取决于您的语言。

  • 输入将由一系列换行符或正斜杠分隔的语句组成,这些语句由电阻的电阻的整数组成,并且用空格分隔电阻的一侧所连接的电阻的ID。

  • 第一个电阻器的ID将为1,对于每个后续电阻器递增1。

  • 开始将始终具有0的ID

  • 最终电阻将始终具有0欧姆的电阻,并且仅在其线路中定义了连接

例如:

例子2

可以表示为

3 0
6 1
1 0
5 0
0 2 3 4
  • 输出可以是stdout或文件。它可以通过以下方式之一表示:
    • 一个数字,至少要保留2个小数位,后跟换行符
    • 由整数(分子),正斜杠和另一个整数(分母)组成的分数,后跟换行符。分数不必为最低形式-例如4/4或10/8是可接受的。分数必须在1/100之内。完全准确没有任何好处-这是为了使没有定点或浮点运算的语言能够竞争而提供的拐杖。

我希望能涵盖所有问题。祝好运!


/不是反斜杠。您是指“ \”还是正斜杠?
John Dvorak

如果输入不是串并联网络,是否可以产生不正确的结果?
John Dvorak

1
如果用电阻代替中心电压表,则惠斯通电桥不是串联并联的
John Dvorak

1
电阻器将始终连接到ID较低的电阻器中,还是可以以任何顺序输入?是否1 2/1 0/0 1有效?
John Dvorak 2013年

9
平行的例子是错误的。它应该是15/23,而不是15/8。
彼得·泰勒

Answers:


6

APL 190

索引原点1.第一个回路组合所有串联的电阻,第二个回路组合并联的电阻,重复到第一个回路以组合现在串联的所有并联电阻。最终零电阻的规格似乎是多余的。

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

我认为您可以保存几个字符。用替换前两行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欧姆电阻两端的压降来计算网络电阻。

每个电阻都有两个数字,左边的数字和右边的数字。电阻r的左端为2 * r,右端为2 * r + 1。输入用于计算S连接在一起的端子组。给每个端子一个电压V[t],如果电流净流入端子组,则通过升高电压;如果电流净流出,则通过降低电压来实现松弛。


2

(这是一条评论,但我无法在真正的评论中进行ASCII艺术...)

怎么这样输入?

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

特别是3和4连接到什么?1或2,还是1和2都?


一和两个
lochok
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.