Ist die Schaltung möglich?

9

Schreiben Sie ein Programm oder eine Funktion, die Eingaben übernimmt: alle verfügbaren Widerstände und einen Widerstandswert und gibt einen Wahrheitswert darüber aus, ob es möglich ist, den Widerstand mithilfe dieser Widerstände zu ermitteln oder nicht.

Regeln:

Jedes Format für die Eingabe reicht aus.

Es ist mindestens 1 Widerstand verfügbar, und Ihr Programm sollte mindestens 10 Widerstände ausgeben.

Der Widerstand aller verfügbaren Widerstände und der erforderliche Widerstand sind positive ganze Zahlen.

Wenn für verfügbare Widerstände auch ein Bruchwert möglich ist, kann der erforderliche Widerstand der angenäherte Wert sein (siehe Beispiel).

Die Ausgabe sollte aus 2 eindeutigen Werten für Möglich und Nicht möglich bestehen.

Die Widerstände können auf irgendeine Weise angeschlossen werden.

Series Resistance: Für n Widerstände in der Reihe: Ergebnis = R1 + R2 + R3 + .... Rn

Parallelwiderstand : Für n parallele Widerstände: Ergebnis = 1 / (1 / R1 + 1 / R2 + 1 / R3 + .... + 1 / Rn)

Die Schaltung benötigt möglicherweise nicht alle Widerstände, um den erforderlichen Widerstand zu erhalten (Ausgang True, wenn dies der Fall ist).

Gewinner:

Dies ist Code-Golf, also gewinnt der kürzeste Code.

Beispiele:

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

Erläuterung der letzten beiden Beispiele: /physics/22252/resistor-circuit-that-isnt-parallel-or-series

Vedant Kandoi
quelle
Was 3 3 1ist mit 3 3 2?
14 m2
1,5 wird auf 2 gerundet, der erforderliche Widerstand wird nicht mit 0
bewertet
Schöne Herausforderung, aber ich beschäftige mich genug mit EE wie es ist ...
Ich denke Machematica gewinnen?
14 m2
2
Dieses Problem ist schwieriger als die Beschreibung vermuten lässt, da allgemeine Widerstandsschaltungen nicht komplizierter als die letzten beiden Testfälle rekursiv in Serien- und Parallelteile zerlegt werden können. 10 Widerstände sollten leicht genug sein, um solche Beispiele zu machen. Ich vermute, dass keine der aktuell veröffentlichten Antworten im Allgemeinen funktioniert und eine korrekte Antwort eine Matrixinversion in irgendeiner Form aufweisen muss.
xnor

Antworten:

1

Python 3 , 253 Bytes

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

Ich nehme das Powerset aller Widerstandswerte und berechne dann die Summen für Serien und 1 / Summe (1 / Werte) für Paralel. Dann nehme ich ein Powerset dieser beiden Sets. Wenn Sie die Summe aller Teilmengen nehmen und in eine Menge einfügen, enthält dieser Mengen-Eiter den Wert oder nicht. -> True / False zurückgeben

@stephen danke :)

SimonSchuler
quelle
2
Willkommen bei PPCG! Wenn Sie Importe benötigen, müssen diese in Ihren Code aufgenommen werden. Darüber hinaus müssen Sie Eingaben selbst vornehmen, anstatt davon auszugehen, dass sich die Eingabe in einer Variablen befindet. Auch b != 0-> b!=0.
Stephen
Wie Stephen sagte, können Sie keine Eingabe über eine vordefinierte Variable vornehmen, da dies sonst ein Snippet ist, das nicht zulässig ist. Sie sollten es entweder in eine Funktion oder ein vollständiges Programm ändern
Jo King
1
Es funktioniert nicht für den dritten Testfall (auch ein bisschen Golf und mit der richtigen Eingabe. Wenn Sie sich Sorgen machen, dass ich etwas kaputt gemacht habe, funktioniert Ihr ursprünglicher Code auch nicht)
Jo King
Teufel noch mal.
Ich werde
1

Japt , 52 Bytes

à má

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

Versuch es!

Dies war eine schwierige Frage, und ich musste ein paar seltsame Dinge tun, damit es funktionierte. Ich kann mathematisch nicht beweisen, dass dies für alles funktioniert, aber es funktioniert für alle Testfälle sowie für meinen zusätzlich vorgeschlagenen Testfall . Insbesondere weiß ich, dass die von mir definierte Funktion Wabhängig von der Reihenfolge der Widerstände in ihrem Eingang unterschiedliche Ergebnisse liefert, sodass ich sie bei jeder möglichen Reihenfolge jeder möglichen Kombination von Widerständen ausführe. Ich weiß auch, dass es eine Liste von Widerständen erzeugen wird, die alle mit den Eingangswiderständen erzeugt werden können. Ich weiß nicht mit 100% iger Sicherheit, dass diese beiden Dinge zusammen mit jedem möglichen Widerstand enden.

Erläuterung:

à       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
Kamil Drakari
quelle
0

Ruby , 153 Bytes

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

Probieren Sie es online aus!

Rohe Gewalt. Ich meine es so.

GB
quelle