저항 계산 (Nerd Sniping)


10

좋은 오후 골퍼,

오늘 우리의 도전은 XKCD 만화 356370에서 영감을 얻었습니다 . 우리는 저항 그룹의 저항을 계산하는 프로그램을 작성할 것입니다. 이것이 코드 문제라는 것을 보증하기에 충분히 어렵다는 것을 미리 경고하지만, 골프 형식으로 약간 더 복잡한 프로그램을 작성하는 데 특정 기술이 있다고 생각합니다. 가장 적은 양의 캐릭터가 승리합니다.

저항 계산은 다음 두 공식에 의존합니다.

  • 저항이 직렬 인 경우 저항은 각 저항의 저항의 합입니다.
  • 저항이 병렬 인 경우 저항은 각 저항의 저항의 역의 합의 역수입니다

예를 들어 :

저항 계산의 예

가능한 최소한의 문자로 최대 64 개의 저항 그룹의 저항을 계산해야합니다. 특히 입력 규칙의 복잡성에 대해 사과드립니다. 나는 모든 언어를 사용할 수있는 방식으로 그것들을 정의하려고 노력했다.

  • 각 저항은 2 개 이상의 다른 저항에 연결됩니다.

  • 입력은 하나의 종료점과 하나의 종료 점이 연결되어 유효한 것으로 보장됩니다.

  • 네트워크는 제시된 것보다 더 많은 수학을 요구하지 않도록 직렬 병렬입니다

  • 입력 한 언어에 따라 파일, 인수 또는 표준 입력을 통해 입력됩니다.

  • 입력은 저항의 저항 정수로 구성된 일련의 개행 문자 또는 슬래시로 구분 된 일련의 명령문과 저항의 한쪽이 연결된 저항의 ID를 분리하는 공백으로 구성됩니다.

  • 첫 번째 저항의 ID는 1이되고 연속 저항마다 하나씩 증가합니다.

  • 시작의 ID는 항상 0입니다.

  • 최종 저항은 항상 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

9
병렬 예가 잘못되었습니다. 15/8이 아닌 15/23이어야합니다.
피터 테일러

답변:


6

APL 190

색인 원점 1. 첫 번째 루프는 직렬로 연결된 모든 저항기를, 두 번째로 (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

APL의 답변에 항상 놀라움-그들은 완전히 미쳐 보입니다. 마지막 저항은 다른 저항이 연결할 더미 엔드 링크를 제공하는 것입니다. 잘 했어!
lochok

나는 당신이 두 개의 문자를 저장할 수 있다고 생각합니다. 처음 두 줄을로 바꿉니다 o←⊃↑¨r←¯1↓⍎¨(c≠'/')⊂c. 이 패턴은 두 곳에서 적용 할 수 있습니다.
FUZxxl

5

파이썬, 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

회로에서 전압 완화를 수행하여 저항을 계산합니다. 먼저 1ohm 저항을 시작으로 시작하고 마지막 저항을 0ohm에서 1ohm으로 변경합니다. 그런 다음 입력 전압을 0으로 설정하고 출력 전압을 1V로 설정합니다. 네트워크를 통한 전류 흐름을 시뮬레이션 한 후 네트워크 저항은 첫 1 옴 저항의 전압 강하를 사용하여 계산됩니다.

각 저항에는 왼쪽 단자 번호와 오른쪽 단자 번호의 두 가지 숫자가 있습니다. 저항 r의 왼쪽 단자는 2 * r이고 오른쪽 단자는 2 * r + 1입니다. 입력은 S함께 연결된 터미널 세트 를 계산하는 데 사용 됩니다. 각 단자에는 전압이 공급 V[t]되고 전류가 단자 세트로 유입되면 전압을 높이고 전류가 유출되면 전압을 낮추면 완화가 이루어집니다.


2

(이것은 의견이지만 실제 의견으로는 아스키 아트를 할 수 없습니다 ...)

이와 같은 내용은 어떻게 입력됩니까?

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

특히, 3과 4는 무엇에 연결되어 있습니까? 1 또는 2 또는 1과 2?


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