¿Es posible el circuito?

9

Escriba un programa o función que tome entrada: todas las resistencias disponibles y un valor de resistencia y genera un valor verdadero de si es posible o no obtener la resistencia usando esas resistencias.

Reglas:

Cualquier formato de entrada servirá.

Habrá al menos 1 resistencia disponible y su programa debería generar al menos 10 resistencias disponibles.

La resistencia de todas las resistencias disponibles y la resistencia requerida serán enteros positivos.

Para resistencias disponibles si también es posible un valor fraccional, la resistencia requerida puede ser el valor aproximado (ver ejemplo)

La salida debe ser cualquier 2 valores únicos para Posible y No posible.

Las resistencias pueden conectarse de cualquier manera.

Resistencia en serie : Para n resistencias en serie: Resultado = R1 + R2 + R3 + .... Rn

Resistencia paralela : Para n resistencias en paralelo: Resultado = 1 / (1 / R1 + 1 / R2 + 1 / R3 + .... + 1 / Rn)

Es posible que el circuito no requiera que todas las resistencias obtengan la resistencia requerida (salida True si ese es el caso).

Ganador:

Este es el código de golf, por lo que el código más corto gana.

Ejemplos:

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

Explicación de los dos últimos ejemplos: /physics/22252/resistor-circuit-that-isnt-parallel-or-series

Vedant Kandoi
fuente
Lo que pelea 3 3 1, 3 3 2?
l4m2
1.5 se redondea a 2, la resistencia requerida no se dará 0 (se agregó a la pregunta), 3 3 será cierto
Vedant Kandoi
Buen desafío, pero trato bastante con EE como es ...
Supongo que Machematica gana?
l4m2
2
Este problema es más difícil de lo que la descripción lo hace parecer porque los circuitos de resistencia general no se pueden dividir recursivamente en series y partes paralelas, en formas más complicadas que los últimos dos casos de prueba. 10 resistencias deberían ser lo suficientemente fáciles para hacer tales ejemplos. Sospecho que ninguna de las respuestas publicadas actualmente funciona en general, y una respuesta correcta necesita tener inversión de matriz de alguna forma.
xnor

Respuestas:

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

Tomo el conjunto de potencias de todos los valores de resistencia y luego calculo las sumas para series y 1 / suma (1 / valores) para paralelas y luego tomo un conjunto de potencias de estos dos conjuntos. Cuando toma la suma de todos los subconjuntos y los coloca en un conjunto, este conjunto de valores contiene el valor o no. -> volver verdadero / falso

@stephen gracias :)

SimonSchuler
fuente
2
Bienvenido a PPCG! Si necesita alguna importación, debe incluirla en su código. Además, debe tomar entradas usted mismo, en lugar de asumir que la entrada está en una variable. Además, b != 0-> b!=0.
Stephen
Como Stephen Saod, no puede tomar la entrada a través de una variable predefinida, de lo contrario, este es un fragmento, que no está permitido. Debería cambiarlo a una función o un programa completo
Jo King
1
No funciona para el tercer caso de prueba (también, un poco de golf y con la entrada adecuada. Si te preocupa que haya roto algo, tu código original tampoco funciona)
Jo King
maldita sea
Voy a
1

Japt , 52 bytes

à má

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

¡Intentalo!

Fue difícil y tuve que hacer un par de cosas extrañas para que funcionara. No puedo demostrar matemáticamente que esto funcione para todo, pero funciona para todos los casos de prueba, así como para mi caso de prueba adicional propuesto . Específicamente, sé que la función que defino llamada Wda resultados diferentes dependiendo del orden de las resistencias en su entrada, por lo que la ejecuto en cada orden posible de cada combinación posible de resistencias. También sé que producirá una lista de resistencias que son posibles de crear usando las resistencias de entrada. No sé con 100% de certeza que esas dos cosas juntas terminan con todas las resistencias posibles.

Explicación:

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

Pruébalo en línea!

Fuerza bruta. Lo digo en serio.

GB
fuente