回路は可能ですか?


9

入力を取得するプログラムまたは関数を記述します。使用可能なすべての抵抗と抵抗値、およびそれらの抵抗を使用して抵抗を取得できるかどうかの真の値を出力します。

ルール:

入力用の任意のフォーマットで十分です。

少なくとも1つの利用可能な抵抗があり、プログラムは少なくとも10個の利用可能な抵抗に対して出力する必要があります。

利用可能なすべての抵抗の抵抗と必要な抵抗は正の整数になります。

小数の値も可能な場合に使用可能な抵抗の場合、必要な抵抗は概算値になることがあります(例を参照)。

出力は、可能と不可能の2つの一意の値である必要があります。

抵抗器は任意の方法で接続できます。

直列抵抗:直列のn個の抵抗の場合:Result = 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

最後の2つの例の説明: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はtrueになります
Vedant Kandoi

素敵な挑戦ですが、EEは

Machematicaが勝ったと思いますか?
l4m2 2018年

2
一般的な抵抗回路は、最後の2つのテストケースよりも複雑な方法で、直列と並列のパーツに再帰的に分解できないため、この問題は説明よりも困難です。このような例を作成するには、10個の抵抗で簡単に十分です。現在投稿されている回答は一般に機能せず、正しい回答には何らかの形式の行列反転が必要です。
XNOR

回答:


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)を計算してから、これら2つのセットのパワーセットを取得します。すべてのサブセットの合計を取り、それらをセットに入れると、このセットeiterには値が含まれるかどうかが決まります。-> True / Falseを返す

@stephenありがとう:)


2
PPCGへようこそ!インポートが必要な場合は、それらをコードに含める必要があります。さらに、入力が変数であると想定するのではなく、入力を自分で受け取る必要があります。また、b != 0-> b!=0
スティーブン

Stephen saodと同様に、事前定義された変数を介して入力を取得することはできません。それ以外の場合、これはスニペットであり、許可されません。関数または完全なプログラムに変更する必要があります
Jo King

1
3番目のテストケースでは動作しません(また、少しゴルフをして適切な入力をします。何かを壊してしまった場合は、元のコードも動作しません)
Jo King

くそったれ。Ill have a look :(
SimonSchuler 2018年

1

Japt、52バイト

à má

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

それを試してみてください!

これはタフなもので、私はそれを機能させるためにいくつかの奇妙なことをしなければなりませんでした。これがすべてで機能することを数学的に証明することはできませんが、すべてのテストケースと、提案された追加のテストケースで機能します。具体的には、私が呼び出す関数を定義するとW、その入力の抵抗の順序に応じて異なる結果が得られるので、抵抗の可能な組み合わせのそれぞれの可能な順序で実行します。また、入力抵抗を使用して作成できるすべての抵抗のリストが生成されることも知っています。これらの2つのことが一緒になってすべての可能な抵抗になることは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

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