การคำนวณความต้านทาน (Snding Nerd)


10

สวัสดียามบ่ายนักกอล์ฟ

ความท้าทายของเราสำหรับวันนี้เป็นแรงบันดาลใจ XKCD การ์ตูน356และ370 เราจะเขียนโปรแกรมเพื่อคำนวณความต้านทานของกลุ่มตัวต้านทาน คำเตือนว่านี่เกือบจะยากพอที่จะรับประกันว่าเป็นความท้าทายด้านรหัส แต่ฉันคิดว่ามีบางศิลปะในการเขียนโปรแกรมที่ซับซ้อนขึ้นเล็กน้อยในรูปแบบ golfed จำนวนอักขระต่ำสุดชนะ

การคำนวณความต้านทานขึ้นอยู่กับสองสูตรดังต่อไปนี้:

  • หากตัวต้านทานอยู่ในอนุกรมความต้านทานคือผลรวมของความต้านทานของตัวต้านทานแต่ละตัว
  • หากตัวต้านทานเป็นแบบขนานความต้านทานคือค่าผกผันของผลรวมของค่าผกผันของความต้านทานของตัวต้านทานแต่ละตัว

ตัวอย่างเช่น:

ตัวอย่างการคำนวณความต้านทาน

ความท้าทายของคุณคือการคำนวณความต้านทานของกลุ่มตัวต้านทานได้มากถึง 64 ตัว ฉันขอโทษสำหรับความซับซ้อนโดยเฉพาะกฎการป้อนข้อมูล ฉันพยายามกำหนดให้เป็นแบบที่ทุกภาษาจะใช้งานได้

  • ตัวต้านทานแต่ละตัวจะเชื่อมต่อกับตัวต้านทานอื่น ๆ 2 ตัวหรือมากกว่า

  • อินพุตรับประกันว่าถูกต้องโดยมีเพียงหนึ่งรายการและหนึ่งจุดออกซึ่งจะเชื่อมต่อ

  • เครือข่ายจะขนานอนุกรมเพื่อป้องกันไม่ให้ต้องใช้คณิตศาสตร์มากขึ้นจากนั้นสิ่งที่จะนำเสนอ

  • การป้อนข้อมูลจะผ่านไฟล์อาร์กิวเมนต์หรือ stdin ขึ้นอยู่กับสิ่งที่เหมาะสมกับภาษาของคุณ

  • อินพุตจะประกอบด้วยชุดของประโยคขึ้นบรรทัดใหม่หรือเครื่องหมายทับซ้ายไปข้างหน้าซึ่งประกอบด้วยจำนวนเต็มของความต้านทานของตัวต้านทานและช่องว่างที่แยก ID ของตัวต้านทานที่ด้านหนึ่งของตัวต้านทานเชื่อมต่ออยู่

  • ID ของตัวต้านทานตัวแรกจะเป็น 1 เพิ่มขึ้นทีละหนึ่งสำหรับตัวต้านทานต่อเนื่องแต่ละตัว

  • การเริ่มต้นจะมี ID เป็น 0 เสมอ

  • ตัวต้านทานสุดท้ายจะมีความต้านทาน 0 โอห์มเสมอและมีการเชื่อมต่อที่กำหนดไว้ในสายของมันเท่านั้น

ตัวอย่างเช่น:

ตัวอย่างที่ 2

อาจแสดงว่า

3 0
6 1
1 0
5 0
0 2 3 4
  • เอาต์พุตสามารถเป็น stdout หรือไฟล์ มันอาจจะเป็นหนึ่งในวิธีต่อไปนี้:
    • ตัวเลขที่มีจุดทศนิยมอย่างน้อย 2 ตำแหน่งตามด้วย newline
    • เศษส่วนที่ประกอบด้วยเลขจำนวนเต็ม (ตัวเศษ) ตัวส่งต่อและอีกจำนวนหนึ่ง (ตัวส่วน) ตามด้วยบรรทัดใหม่ เศษส่วนไม่จำเป็นต้องอยู่ในรูปแบบที่ต่ำที่สุด - 4/4 หรือ 10/8 เป็นตัวอย่างที่ยอมรับได้ เศษส่วนต้องแม่นยำภายใน 1/100 ไม่มีโบนัสสำหรับความแม่นยำที่สมบูรณ์แบบ - สิ่งนี้มีให้เพื่อสนับสนุนภาษาที่ไม่มีการดำเนินการจุดคงที่หรือลอยตัวเพื่อแข่งขัน

ฉันหวังว่าจะครอบคลุมทุกประเด็น โชคดี!


/ไม่ใช่แบ็กสแลช คุณหมายถึง `` `หรือเครื่องหมายทับหน้าหรือไม่
John Dvorak

เราได้รับอนุญาตให้สร้างผลลัพธ์ที่ไม่ถูกต้องหรือไม่หากสัญญาณเข้าไม่ใช่เครือข่ายอนุกรมแบบขนาน
John Dvorak

1
สะพาน Wheatstoneไม่ได้เป็นชุดขนานถ้าคุณเปลี่ยนโวลต์มิเตอร์ศูนย์ด้วยตัวต้านทาน
จอห์น Dvorak

1
ตัวต้านทานจะโยงเข้ากับผู้ที่มี ID ต่ำกว่าเสมอหรือพวกมันอาจจะถูกป้อนเข้าในลำดับใด ๆ คือ1 2/1 0/0 1ถูกต้อง?
John Dvorak

9
ตัวอย่างที่ขนานกันนั้นผิด ควรเป็น 15/23 ไม่ใช่ 15/8
Peter Taylor

คำตอบ:


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

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 art ในความคิดเห็นจริง ... )

สิ่งที่เป็นเช่นนี้ป้อนเข้าเป็นอย่างไร

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

โดยเฉพาะอย่างยิ่งสิ่งที่เชื่อมต่อ 3 และ 4 คืออะไร? 1 หรือ 2 หรือทั้ง 1 และ 2?


ทั้งหนึ่งและสอง
lochok
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.