Le circuit est-il possible?

9

Écrivez un programme ou une fonction qui prend en entrée: toutes les résistances disponibles et une valeur de résistance et génère une valeur véridique de savoir s'il est possible ou non d'obtenir la résistance en utilisant ces résistances.

Règles:

N'importe quel format d'entrée fera l'affaire.

Il y aura au moins 1 résistance disponible et votre programme devrait sortir pour au moins 10 résistances disponibles.

La résistance de toutes les résistances disponibles et la résistance requise seront des entiers positifs.

Pour les résistances disponibles, si une valeur fractionnaire est également possible, la résistance requise peut être la valeur approximative (voir l'exemple).

La sortie doit avoir 2 valeurs uniques pour Possible et Non possible.

Les résistances peuvent être connectées de n'importe quelle manière.

Résistance série : Pour n résistances en série: Résultat = R1 + R2 + R3 + .... Rn

Résistance parallèle : Pour n résistances en parallèle: Résultat = 1 / (1 / R1 + 1 / R2 + 1 / R3 + .... + 1 / Rn)

Le circuit peut ne pas nécessiter toutes les résistances pour obtenir la résistance requise (sortie True si c'est le cas).

Gagnant:

C'est le code-golf, donc le code le plus court l'emporte.

Exemples:

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

Explication des deux derniers exemples: /physics/22252/resistor-circuit-that-isnt-parallel-or-series

Vedant Kandoi
la source
Qu'est - ce combat 3 3 1, 3 3 2?
l4m2
1,5 est arrondi à 2, la résistance requise ne sera pas donnée 0 (l'ajoutée à la question), 3 3 sera vrai
Vedant Kandoi
Beau défi, mais je traite assez avec EE tel qu'il est ...
Je suppose que Machematica gagne?
l4m2
2
Ce problème est plus difficile à résoudre que la description ne le semble, car les circuits de résistance généraux ne peuvent pas être décomposés récursivement en séries et en parties parallèles, de manière plus compliquée que les deux derniers cas de test. 10 résistances devraient être assez faciles pour faire de tels exemples. Je soupçonne qu'aucune des réponses actuellement publiées ne fonctionne en général, et une réponse correcte doit avoir une inversion de matrice sous une forme ou une autre.
2018

Réponses:

1

Python 3 , 253 octets

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

Je prends le jeu de puissance de toutes les valeurs de résistance, puis je calcule les sommes pour les séries et 1 / somme (1 / valeurs) pour parallèle, puis je prends un jeu de puissance de ces deux ensembles. Lorsque vous prenez la somme de tous les sous-ensembles et les mettez dans un ensemble, cet ensemble eiter contient ou non la valeur. -> retourner Vrai / Faux

@stephen merci :)

SimonSchuler
la source
2
Bienvenue chez PPCG! Si vous avez besoin d'importations, elles doivent être incluses dans votre code. De plus, vous devez prendre les entrées vous-même, plutôt que de supposer que l'entrée se trouve dans une variable. Aussi, b != 0-> b!=0.
Stephen
Comme Stephen Saod, vous ne pouvez pas prendre d'entrée via une variable prédéfinie, sinon c'est un extrait de code, ce qui n'est pas autorisé. Vous devez le changer en fonction ou en programme complet
Jo King
1
Cela ne fonctionne pas pour le troisième cas de test (aussi, a joué un peu au golf et avec une entrée appropriée. Si vous avez peur que je casse quelque chose, votre code d'origine ne fonctionne pas non plus)
Jo King
bon sang.
Je vais
1

Japt , 52 octets

à má

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

Essayez!

Ce fut difficile, et j'ai dû faire deux ou trois choses étranges pour le faire fonctionner. Je ne peux pas prouver mathématiquement que cela fonctionne pour tout, mais cela fonctionne pour tous les cas de test ainsi que mon cas de test supplémentaire proposé . Plus précisément, je sais que la fonction que je définis appelée Wdonne des résultats différents en fonction de l'ordre des résistances en entrée donc je l'exécute sur chaque ordre possible de chaque combinaison possible de résistances. Je sais également que cela produira une liste de résistances qu'il est possible de créer en utilisant les résistances d'entrée. Je ne sais pas avec 100% de certitude que ces deux choses ensemble se retrouvent avec toutes les résistances possibles.

Explication:

à       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
la source
0

Rubis , 153 octets

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

Essayez-le en ligne!

Force brute. Je suis sérieux.

GB
la source