Czy obwód jest możliwy?

9

Napisz program lub funkcję, która pobiera dane wejściowe: wszystkie dostępne rezystory oraz wartość rezystancji i generuje prawdziwą wartość określającą, czy można uzyskać rezystancję za pomocą tych rezystorów.

Zasady:

Wystarczy dowolny format wejściowy.

Będzie co najmniej 1 dostępny rezystor, a twój program powinien generować co najmniej 10 dostępnych rezystorów.

Rezystancja wszystkich dostępnych rezystorów i wymagana rezystancja będą dodatnimi liczbami całkowitymi.

W przypadku dostępnych rezystorów, jeśli możliwa jest również wartość ułamkowa, wymagana rezystancja może być wartością przybliżoną (patrz przykład)

Dane wyjściowe powinny być dowolnymi 2 unikatowymi wartościami Możliwe i Niemożliwe.

Rezystory można podłączyć w dowolny sposób.

Rezystancja szeregowa : Dla n rezystancji szeregowych: Wynik = R1 + R2 + R3 + .... Rn

Rezystancja równoległa : Dla n równoległych rezystancji: Wynik = 1 / (1 / R1 + 1 / R2 + 1 / R3 + .... + 1 / Rn)

Obwód może nie wymagać od wszystkich rezystorów uzyskania wymaganej rezystancji (w takim przypadku należy wybrać wartość True).

Zwycięzca:

To jest golf golfowy, więc wygrywa najkrótszy kod.

Przykłady:

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

Objaśnienie dwóch ostatnich przykładów: /physics/22252/resistor-circuit-that-isnt-parallel-or-series

Wedant Kandoi
źródło
Co walka 3 3 1, 3 3 2?
l4m2
1,5 zaokrągla się do 2, wymagany opór nie otrzyma 0 (dodał to do pytania), 3 3 będzie prawdą
Vedant Kandoi
Niezłe wyzwanie, ale dość dobrze sobie radzę z EE, ponieważ jest ...
Chyba wygrał Machematica?
l4m2
2
Ten problem jest trudniejszy niż w opisie brzmi, ponieważ ogólnych obwodów rezystorowych nie można rozbić rekurencyjnie na części szeregowe i równoległe w bardziej skomplikowany sposób niż w dwóch ostatnich przypadkach testowych. 10 rezystorów powinno wystarczyć do stworzenia takich przykładów. Podejrzewam, że żadna z obecnie opublikowanych odpowiedzi nie działa ogólnie i poprawna odpowiedź musi mieć odwróconą macierz w jakiejś formie.
xnor

Odpowiedzi:

1

Python 3 , 253 bajty

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

Biorę zestaw mocy wszystkich wartości rezystorów, a następnie obliczam sumy dla szeregu i 1 / suma (1 / wartości) dla równoległych, a następnie biorę zestaw mocy z tych dwóch zestawów. Gdy weźmiesz sumę wszystkich podzbiorów i umieścisz je w zestawie, ten zestaw eiter będzie zawierał wartość lub nie. -> zwraca wartość Prawda / Fałsz

@stephen dzięki :)

SimonSchuler
źródło
2
Witamy w PPCG! Jeśli potrzebujesz importu, należy go uwzględnić w kodzie. Ponadto musisz sam pobierać dane wejściowe, zamiast zakładać, że dane wejściowe są zmienne. Również b != 0-> b!=0.
Stephen
Jako Stephen Saod nie możesz pobierać danych wejściowych przez predefiniowaną zmienną, w przeciwnym razie jest to fragment kodu, który jest niedozwolony. Powinieneś zmienić ją na funkcję lub pełny program
Jo King
1
To nie działa w trzecim przypadku testowym (również grałem trochę w golfa i przy odpowiednim wejściu. Jeśli martwisz się, że coś zepsułem, twój oryginalny kod też nie działa)
Jo King
cholera.
Rzucę
1

Japt , 52 bajty

à má

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

Spróbuj!

To był trudny i musiałem zrobić kilka dziwnych rzeczy, aby zadziałało. Nie mogę matematycznie udowodnić, że to działa na wszystko, ale działa na wszystkie przypadki testowe, a także na mój dodatkowy proponowany przypadek testowy . W szczególności wiem, że funkcja, którą definiuję, Wwywołuje, daje różne wyniki w zależności od kolejności rezystorów na wejściu, więc uruchamiam ją przy każdej możliwej kolejności każdej możliwej kombinacji rezystorów. Wiem również, że stworzy listę rezystancji, które wszystkie można utworzyć za pomocą rezystorów wejściowych. Nie wiem ze 100% pewnością, że te dwie rzeczy razem kończą się wszelkim możliwym oporem.

Wyjaśnienie:

à       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
źródło
0

Rubin , 153 bajty

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

Wypróbuj online!

Brutalna siła. Mam na myśli to.

GB
źródło