회로가 가능합니까?


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

마지막 두 예제에 대한 설명 : /physics/22252/resistor-circuit-that-isnt-parallel-or-series


어떤 시합 3 3 1, 3 3 2?
l4m2

1.5 2로 반올림되고, 필요한 저항은 0이 3/3에 해당 할 것이다 (질문에 추가)을들 수 없습니다
Vedant Kandoi

좋은 도전이지만, EE를 충분히 다루고 있습니다.

나는 Machematica가 이길 것 같아?
l4m2

2
이 문제는 일반적인 저항 회로를 마지막 두 테스트 사례보다 더 복잡한 방식으로 직렬 및 병렬 부품으로 재귀 적으로 분류 할 수 없기 때문에 설명보다 더 어렵습니다. 10 개의 저항은 이러한 예를 만들기에 충분해야합니다. 현재 게시 된 답변 중 어느 것도 일반적으로 작동하지 않는다고 생각하며 정답에는 어떤 형태의 행렬 반전이 필요합니다.
xnor

답변:


1

파이썬 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)의 합계를 계산 한 다음이 두 세트의 파워 세트를 가져옵니다. 모든 하위 집합의 합계를 가져 와서 집합에 넣으면이 집합에 값이 포함됩니다. -> True / False를 반환

@ 스티븐 감사합니다 :)


2
PPCG에 오신 것을 환영합니다! 가져 오기가 필요한 경우 코드에 가져와야합니다. 또한 입력이 변수에 있다고 가정하지 않고 직접 입력해야합니다. 또한 b != 0-> b!=0.
Stephen

Stephen saod로서, 사전 정의 된 변수를 통해 입력을받을 수 없습니다. 그렇지 않으면 스 니펫이며 허용되지 않습니다. 기능 또는 전체 프로그램으로 변경해야합니다.
Jo King

1
세 번째 테스트 사례 에서는 작동하지 않습니다 (또한 약간의 골프를 치고 적절한 입력을합니다. 문제가 생겼다면 걱정이된다면 원래 코드도 작동하지 않습니다)
Jo King

젠장. Ill look look :(
SimonSchuler

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.