电路可能吗?


9

编写一个接受输入的程序或函数:所有可用电阻器和一个电阻值,并输出一个真实值,该值表示是否可以使用这些电阻器获得电阻。

规则:

任何输入格式都可以。

至少会有1个可用电阻,并且您的程序应输出至少10个可用电阻。

所有可用电阻器的电阻和所需电阻将为正整数。

对于可用电阻器,如果也可以使用小数点值,则所需电阻可能是近似值(请参见示例)

输出应为“可能”和“不可能”的任何2个唯一值。

电阻可以任何方式连接。

串联电阻:对于串联的n个电阻:结果= R1 + R2 + R3 + .... Rn

并联电阻:对于n个并联电阻:结果= 1 /(1 / R1 + 1 / R2 + 1 / R3 + .... + 1 / Rn)

该电路可能不需要所有电阻来获得所需的电阻(如果是这种情况,则输出True)。

优胜者:

这是代码高尔夫球,所以最短代码获胜。

例子:

R     List
110   220,220 -> True
440   220,220 -> True
550   400,300 -> False
3000  1000,3000 -> True
750   1000,3000 -> True
333   1000,1000,1000 -> True (1000||1000||1000=333.333)
667   1000,1000,1000 -> True ((1000+1000)||1000=666.6666)
8000  1000,1000,7000 -> True 
190   100,200,333,344,221 -> True 
193   105,200,333,344,221 -> True
400   200,100 -> False

最后两个示例的说明:https : //physics.stackexchange.com/questions/22252/resistor-circuit-that-isnt-parallel-or-series


什么回合3 3 13 3 2
l4m2

1.5四舍五入为2,所需的阻力不会为0(添加到问题中),3为3
Vedant Kandoi

很好的挑战,但我对EE的处理已经足够……

我猜Machematica赢了吗?
l4m2

2
这个问题比描述中说明的要难,因为一般的电阻器电路不能以递归方式分解为串联和并联部分,比最后两个测试用例要复杂得多。10个电阻应该足够容易地做出这样的例子。我怀疑当前发布的答案都无法正常工作,正确的答案需要以某种形式进行矩阵求逆。
xnor

Answers:


1

Python 3,253字节

import functools
def p(l): return functools.reduce(lambda z,x:z+[y+[x]for y in z],l,[[]])
print(l[-1:][0]in[round(a)for a in[sum(a)for a in p([sum(a)for a in p(l)]+[1/sum(c)for c in[[1/b for b in a if b!=0]for a in p(l).copy()]if sum(c)!=0])]])

我获取所有电阻器值的功率集,然后为串联计算总和,并为并联计算1 / sum(1 / values),然后对这两个集合进行功率集计算。当您将所有子集的总和放入一个集合中时,该集合元素包含或不包含该值。->返回真/假

@stephen谢谢:)


2
欢迎来到PPCG!如果您需要任何导入,则需要将它们包含在您的代码中。此外,您需要自己进行输入,而不是假设输入位于变量中。另外,b != 0-> b!=0
斯蒂芬

正如Stephen Saod一样,您不能通过预定义的变量进行输入,否则,这是一个片段,这是不允许的。您应该将其更改为函数或完整程序
Jo King

1
它在第三个测试用例中不起作用(同样,打了一点球并且输入正确。如果您担心我弄坏了东西,您的原始代码也不起作用)
Jo King

该死的。生病了:(
SimonSchuler '18

1

Japt,52个字节

à má

ÈÊ<2?X:X¯1 ïXÅgW @[X+Y1/(1/XÄ/Y]Ãc
mmW c mr øV

尝试一下!

这是一个艰难的过程,我必须做一些奇怪的事情才能使它起作用。我无法从数学上证明这适用于所有情况,但适用于所有测试用例以及我额外提议的测试用例。具体来说,我知道我定义的函数W会根据输入中电阻的顺序给出不同的结果,因此我将根据电阻的每种可能组合的每种可能顺序来运行它。我也知道,它将产生一个电阻列表,所有这些电阻都可以使用输入电阻来创建。我不确定100%地确定这两个因素最终会遇到所有可能的阻力。

说明:

à       Get each combination e.g. [1,2,3] -> [[1,2,3],[1,2],[1,3],[2,3],[1],[2],[3]]
  m     For each combination...
   á    Get each order e.g. [1,2,3] -> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

    Skip a line to avoid overwriting the target resistance

È                                     Define a function W taking an array input X:
 Ê<2?X                                  If X is only 1 resistor, return it as-is
            XÅgW                        Get the resistances from applying W to the tail of X
       X¯1 ï                            Pair the first resistor with each possible tail resistance
                 @[            ]Ã       For each pair get these two values:
                   X+Y                    Those resistances in series
                      1/(1/XÄ/Y           Those resistances in parallel
                                 c      Collapse all those resistances into a single flat list

mmW            For each combination and order, get the resistances using W
    c          Collapse to a single list of resistances
      mr       Round each one
         øV    Return true if the target resistance is in the list, false otherwise

0

红宝石 153字节

f=->v,r{[r]-v==[]||r[1]&&[*2..v.size].any?{|n|v.permutation.any?{|l|[l[0,n].sum,(1.0/l[0,n].reduce(0){|s,x|s+1.0/x}).round].any?{|b|f[l[n..-1]+[b],r]}}}}

在线尝试!

蛮力。我是认真的。

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.