È possibile il circuito?


9

Scrivi un programma o una funzione che accetta input: tutti i resistori disponibili e un valore di resistenza e generano un valore veritiero del fatto che sia possibile ottenere la resistenza utilizzando tali resistori.

Regole:

Qualsiasi formato per l'input farà.

Ci sarà almeno 1 resistenza disponibile e il tuo programma dovrebbe essere in uscita per almeno 10 resistori disponibili.

La resistenza di tutti i resistori disponibili e la resistenza richiesta saranno numeri interi positivi.

Per i resistori disponibili se è possibile anche un valore frazionario, la resistenza richiesta può essere il valore approssimativo (vedere esempio)

L'output dovrebbe essere qualsiasi 2 valori univoci per Possibile e Non possibile.

I resistori possono essere collegati in qualsiasi modo.

Resistenza in serie : per n resistenze in serie: Risultato = R1 + R2 + R3 + .... Rn

Resistenza parallela : per n resistenze in parallelo: Risultato = 1 / (1 / R1 + 1 / R2 + 1 / R3 + .... + 1 / Rn)

Il circuito potrebbe non richiedere a tutte le resistenze di ottenere la resistenza richiesta (uscita True in questo caso).

Vincitore:

Questo è code-golf, quindi vince il codice più corto.

Esempi:

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

Spiegazione per gli ultimi due esempi: /physics/22252/resistor-circuit-that-isnt-parallel-or-series


Cosa attacco 3 3 1, 3 3 2?
l4m2

1.5 è arrotondato a 2, la resistenza richiesta non verrà data 0 (aggiunta alla domanda), 3 3 sarà vero
Vedant Kandoi,

Bella sfida, ma mi occupo abbastanza di EE così com'è ...

Immagino che vinca Machematica?
l4m2

2
Questo problema è più difficile della descrizione perché sembra che i circuiti dei resistori generali non possano essere suddivisi in modo ricorsivo in parti in serie e parallele, in modo più complicato rispetto agli ultimi due casi di test. 10 resistori dovrebbero essere abbastanza facili da fare tali esempi. Sospetto che nessuna delle risposte attualmente pubblicate funzioni in generale, e una risposta corretta deve avere un'inversione di matrice in qualche forma.
xnor

Risposte:


1

Python 3 , 253 byte

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

Prendo il set di potenze di tutti i valori di resistenza e quindi calcolo le somme per le serie e 1 / somma (1 / valori) per il parallelo e quindi prendo un set di potenze di questi due set. Quando si prende la somma di tutti i sottoinsiemi e li si inserisce in un set, questo set eiter contiene o meno il valore. -> restituisce Vero / Falso

@stephen thanks :)


2
Benvenuti in PPCG! Se hai bisogno di importazioni, devono essere incluse nel tuo codice. Inoltre, devi prendere tu stesso gli input, piuttosto che supporre che l'input sia in una variabile. Inoltre, b != 0-> b!=0.
Stephen,

Come ha detto Stephen, non è possibile accettare input tramite una variabile predefinita, altrimenti si tratta di uno snippet, che non è consentito. Dovresti cambiarlo in una funzione o in un programma completo
Jo King,

1
Non funziona per il terzo caso di test (inoltre, ho giocato a golf un po 'e con un input adeguato. Se sei preoccupato ho rotto qualcosa, il tuo codice originale non funziona neanche)
Jo King

dannazione.
Devo

1

Japt , 52 byte

à má

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

Provalo!

Questa è stata dura, e ho dovuto fare un paio di cose strane per farlo funzionare. Non posso dimostrare matematicamente che questo funziona per tutto, ma funziona per tutti i casi di test, nonché per il mio caso di test extra proposto . In particolare, so che la funzione che definisco chiamata Wdà risultati diversi a seconda dell'ordine dei resistori nel suo ingresso, quindi lo eseguo su ogni possibile ordinamento di ogni possibile combinazione di resistori. So anche che produrrà un elenco di resistenze che è possibile creare utilizzando le resistenze di ingresso. Non so con certezza al 100% che queste due cose insieme finiscono con ogni possibile resistenza.

Spiegazione:

à       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

Rubino , 153 byte

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

Provalo online!

Forza bruta. Voglio dire che.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.