Devre Mümkün mü?


9

Girdi alan bir program veya fonksiyon yazın: mevcut tüm dirençler ve bir direnç değeri ve bu dirençleri kullanarak direnç elde etmenin mümkün olup olmadığına dair doğru bir değer üretir.

Kurallar:

Giriş için herhangi bir format yapar.

En az 1 kullanılabilir direnç olacaktır ve programınız en az 10 kullanılabilir direnç için çıkış yapmalıdır.

Mevcut tüm dirençlerin direnci ve gerekli direnç pozitif tamsayılar olacaktır.

Kesirli bir değer de mümkünse mevcut dirençler için, gerekli direnç yaklaşık değer olabilir. (Örneğe bakınız)

Çıktı, Olası ve Mümkün olmayan için 2 benzersiz değer olmalıdır.

Dirençler herhangi bir şekilde bağlanabilir.

Seri Direnç: Seri n dirençler için: Sonuç = R1 + R2 + R3 + .... Rn

Paralel Direnç: Paralel n dirençler için: Sonuç = 1 / (1 / R1 + 1 / R2 + 1 / R3 + .... + 1 / Rn)

Devre, tüm dirençlerin gerekli direnci almasını gerektirmeyebilir (bu durumda True çıkışı).

Kazanan:

Bu kod golf çok kısa kod kazanır.

Örnekler:

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

Son iki örnek için açıklama: /physics/22252/resistor-circuit-that-isnt-parallel-or-series


Ne dersin 3 3 1, 3 3 2?
l4m2

1.5 2'ye yuvarlanır, gerekli direnç 0 verilmez (soruya eklenir), 3 3 doğru olur
Vedant Kandoi

Güzel bir meydan okuma, ama olduğu gibi EE ile yeterince anlaşma ...

Sanırım Machematica kazanıyor?
l4m2

2
Genel rezistör devreleri, son iki test durumundan daha karmaşık yollarla seri ve paralel parçalara özyinelemeli olarak ayrıştırılamadığından, bu sorun açıklamadan daha zordur. 10 direnç bu tür örnekleri yapacak kadar kolay olmalıdır. Şu anda gönderilen cevapların hiçbirinin genel olarak işe yaramadığından ve doğru bir cevabın bir şekilde matris inversiyonu olması gerektiğinden şüpheleniyorum.
xnor

Yanıtlar:


1

Python 3 , 253 bayt

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

Tüm direnç değerlerinin güç kümesini alıyorum, sonra seri için toplamları ve paralel için 1 / toplamı (1 / değerler) hesaplıyorum ve sonra bu iki kümenin güç kümesini alıyorum. Tüm altkümelerin toplamını alıp bir kümeye koyduğunuzda, bu küme eiter değeri içerir veya içermez. -> True / False döndür

@stephen teşekkürler :)


2
PPCG'ye Hoşgeldiniz! Herhangi bir içe aktarmaya ihtiyacınız varsa, bunların kodunuza dahil edilmesi gerekir. Ayrıca, girdinin bir değişken içinde olduğunu varsaymak yerine girdileri kendiniz almanız gerekir. Ayrıca, b != 0-> b!=0.
Stephen

Stephen saod olarak, önceden tanımlanmış bir değişken aracılığıyla girdi alamazsınız, aksi takdirde bu izin verilmeyen bir parçacıktır. Bir fonksiyonun veya tam programa birine değiştirmek gerekir
Jo Kral

1
Üçüncü test davasında işe yaramaz (ayrıca, biraz golf oynadı ve uygun girdiyle. Bir şey kırdığından endişe ediyorsanız, orijinal kodunuz da işe yaramaz)
Jo King

kahretsin.
Bakalım

1

Japt , 52 bayt

à má

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

Dene!

Bu zor bir işti ve çalışmasını sağlamak için birkaç tuhaf şey yapmak zorunda kaldım. Bunun her şey için işe yaradığını matematiksel olarak kanıtlayamıyorum, ancak tüm test vakaları ve ekstra önerilen test durumum için de çalışıyor . Özellikle, çağrılan tanımladığım fonksiyonun Wgirişindeki dirençlerin sırasına bağlı olarak farklı sonuçlar verdiğini biliyorum, bu yüzden her olası direnç kombinasyonunun her olası sırasına göre çalıştırıyorum. Ayrıca, giriş dirençlerini kullanarak oluşturulabilecek dirençlerin bir listesini üreteceğini biliyorum. Bu iki şeyin birlikte her olası direnişle sonuçlandığını% 100 kesin olarak bilmiyorum.

Açıklama:

à       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

0

Ruby , 153 bayt

f=->v,r{[r]-v==[]||r[1]&&[*2..v.size].any?{|n|v.permutation.any?{|l|[l[0,n].sum,(1.0/l[0,n].reduce(0){|s,x|s+1.0/x}).round].any?{|b|f[l[n..-1]+[b],r]}}}}

Çevrimiçi deneyin!

Kaba kuvvet. İçtenlikle söyledim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.