เป็นไปได้ของวงจร?


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

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])]])

ฉันใช้ powerset ของค่าตัวต้านทานทั้งหมดแล้วคำนวณผลรวมสำหรับอนุกรมและ 1 / sum (1 / ค่า) สำหรับ paralel แล้วฉันจะใช้ powerset ของทั้งสองชุด เมื่อคุณนำผลรวมของชุดย่อยทั้งหมดและใส่ลงในชุดดังนั้นชุด eiter นี้มีค่าหรือไม่ -> คืนค่า True / False

@ สตีเฟ่นขอบคุณ :)


2
ยินดีต้อนรับสู่ PPCG! หากคุณต้องการนำเข้าใด ๆ พวกเขาจะต้องรวมอยู่ในรหัสของคุณ นอกจากนี้คุณต้องรับอินพุตด้วยตัวเองแทนที่จะสมมติว่าอินพุตอยู่ในตัวแปร นอกจากนี้->b != 0 b!=0
Stephen

ในฐานะที่เป็นสตีเฟ่น saod คุณไม่สามารถรับข้อมูลผ่านตัวแปรที่กำหนดไว้ล่วงหน้ามิฉะนั้นนี่เป็นข้อมูลโค้ดซึ่งไม่ได้รับอนุญาต คุณควรเปลี่ยนเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
โจคิง

1
มันใช้งานไม่ได้กับกรณีทดสอบครั้งที่สาม (เช่นตีกอล์ฟนิดหน่อยและป้อนข้อมูลอย่างถูกต้องหากคุณกังวลว่าฉันทำอะไรผิดรหัสต้นฉบับของคุณก็ใช้ไม่ได้)
Jo King

บ้า ป่วยดู :(
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.