O circuito é possível?


9

Escreva um programa ou função que receba entrada: todos os resistores disponíveis e um valor de resistência e emita um valor verdadeiro se é possível ou não obter a resistência usando esses resistores.

Regras:

Qualquer formato para entrada serve.

Haverá pelo menos 1 resistor disponível e seu programa deve gerar pelo menos 10 resistores disponíveis.

A resistência de todos os resistores disponíveis e a resistência necessária serão números inteiros positivos.

Para resistores disponíveis, se também for possível um valor fracionário, a resistência necessária pode ser o valor aproximado (veja o exemplo)

A saída deve ter 2 valores exclusivos para Possível e Não possível.

Os resistores podem ser conectados de qualquer maneira.

Resistência em série : Para n resistências em série: Resultado = R1 + R2 + R3 + .... Rn

Resistência Paralela : Para n resistências em paralelo: Resultado = 1 / (1 / R1 + 1 / R2 + 1 / R3 + .... + 1 / Rn)

O circuito pode não exigir que todos os resistores obtenham a resistência necessária (saída True, se for esse o caso).

Vencedora:

Isso é código-golfe, então o código mais curto vence.

Exemplos:

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

Explicação para os dois últimos exemplos: /physics/22252/resistor-circuit-that-isnt-parallel-or-series


O ataque 3 3 1, 3 3 2?
L4m2

1,5 é arredondado para 2, resistência necessária não receberá 0 (foi adicionado à pergunta), 3 3 será verdade #
Vedant Kandoi

Bom desafio, mas eu lidar bastante com EE como é ...

Eu acho que o Machematica vence?
L4m2

2
Esse problema é mais difícil do que a descrição faz parecer, porque os circuitos de resistores gerais não podem ser divididos recursivamente em séries e partes paralelas, de maneiras mais complicadas do que os dois últimos casos de teste. 10 resistores devem ser fáceis o suficiente para fazer tais exemplos. Suspeito que nenhuma das respostas atualmente postadas funcione em geral, e uma resposta correta precisa ter inversão de matriz de alguma forma.
Xnor

Respostas:


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

Pego o conjunto de potências de todos os valores do resistor e, em seguida, calculo as somas para séries e 1 / soma (1 / valores) para o paralel e, em seguida, pego um conjunto de potências desses dois conjuntos. Quando você pega a soma de todos os subconjuntos e os coloca em um conjunto, esse conjunto eiter contém o valor ou não. -> retornar Verdadeiro / Falso

@stephen thanks :)


2
Bem-vindo ao PPCG! Se você precisar de importações, elas deverão ser incluídas no seu código. Além disso, você precisa receber as entradas sozinho, em vez de assumir que a entrada está em uma variável. Além disso, b != 0-> b!=0.
Stephen

Como Stephen saod, você não pode receber informações através de uma variável predefinida, caso contrário, esse é um trecho, o que não é permitido. Você deve alterá-lo a qualquer uma função ou um programa completo
Jo rei

11
Ele não funciona para o caso de teste terceiro (., Também, golfed um pouco e com a entrada adequada, se você está preocupado que eu quebrei alguma coisa, o seu código original não quer trabalhar)
Jo rei

caramba. Vou dar uma olhada :(
SimonSchuler

1

Japonês , 52 bytes

à má

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

Tente!

Essa foi uma pergunta difícil, e eu tive que fazer algumas coisas estranhas para fazer funcionar. Não posso provar matematicamente que isso funciona para tudo, mas funciona para todos os casos de teste e para o meu caso de teste extra proposto . Especificamente, eu sei que a função que eu defino chamada Wfornece resultados diferentes, dependendo da ordem dos resistores em sua entrada, então eu o executo em cada ordem possível de cada combinação possível de resistores. Eu também sei que ele produzirá uma lista de resistências que são possíveis de serem criadas usando os resistores de entrada. Não sei com 100% de certeza que essas duas coisas juntas acabam com todas as resistências possíveis.

Explicação:

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

Experimente online!

Força bruta. Quero dizer.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.