Возможна ли схема?

9

Напишите программу или функцию, которая принимает входные данные: все доступные резисторы и значение сопротивления и выводит истинное значение того, возможно ли получить сопротивление с помощью этих резисторов.

Правила:

Подойдет любой формат для ввода.

Будет как минимум 1 доступный резистор, и ваша программа должна вывести минимум 10 доступных резисторов.

Сопротивление всех доступных резисторов и требуемое сопротивление будут положительными целыми числами.

Для доступных резисторов, если также возможно дробное значение, требуемое сопротивление может быть приблизительным значением (см. Пример).

Выходные данные должны быть любыми 2 уникальными значениями для Возможного и Не возможного.

Резисторы могут быть подключены любым способом.

Последовательное сопротивление: для n последовательных сопротивлений: Результат = R1 + R2 + R3 + .... Rn

Параллельное сопротивление: Для n параллельных сопротивлений: Результат = 1 / (1 / R1 + 1 / R2 + 1 / R3 + .... + 1 / Rn)

Схема может не требовать от всех резисторов получения необходимого сопротивления (в этом случае выведите True).

Победитель:

Это код-гольф, поэтому выигрывает самый короткий код.

Примеры:

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

Пояснения к последним двум примерам: /physics/22252/resistor-circuit-that-isnt-parallel-or-series

Ведант Кандой
источник
Какой бой 3 3 1, 3 3 2?
l4m2
1.5 округляется до 2, требуемое сопротивление не будет дано 0 (добавил это к вопросу), 3 3 будет верным
Ведант Кандой
Хороший вызов, но я достаточно разбираюсь с EE как есть ...
Я думаю, Machematica победит?
l4m2
2
Эта проблема сложнее, чем излагаемое в описании, потому что схемы общего резистора не могут быть рекурсивно разбиты на последовательные и параллельные части более сложными способами, чем два последних тестовых случая. 10 резисторов должно быть достаточно легко, чтобы сделать такие примеры. Я подозреваю, что ни один из опубликованных в настоящее время ответов не работает вообще, и правильный ответ должен иметь инверсию матрицы в некоторой форме.
xnor

Ответы:

1

Python 3 , 253 байта

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

Я беру набор мощности всех значений резисторов, а затем вычисляю суммы для серии и 1 / сумму (1 / значения) для паралеля, а затем беру набор значений этих двух наборов. Когда вы берете сумму всех подмножеств и помещаете их в набор, тогда этот набор значений содержит значение или нет. -> вернуть True / False

@stephen спасибо :)

SimonSchuler
источник
2
Добро пожаловать в PPCG! Если вам нужен какой-либо импорт, он должен быть включен в ваш код. Кроме того, вам нужно принимать входные данные самостоятельно, а не предполагать, что входные данные находятся в переменной. Также, b != 0-> b!=0.
Стивен
Как Стивен Саод, вы не можете получить ввод через предопределенную переменную, в противном случае это фрагмент, который не допускается. Вы должны изменить его либо на функцию, либо на полную программу
Джо Кинг,
1
Это не работает для третьего тестового случая (также, немного поиграв в гольф и с правильным вводом. Если вы беспокоитесь, что я что-то сломал, ваш оригинальный код тоже не работает)
Джо Кинг,
черт побери. Я посмотрю :(
SimonSchuler
1

Japt , 52 байта

à má

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

Попробуй это!

Это было непросто, и мне пришлось сделать пару странных вещей, чтобы это сработало. Я не могу математически доказать, что это работает для всего, но оно работает для всех тестовых случаев, а также для моего дополнительного предложенного тестового примера . В частности, я знаю, что вызываемая мной функция Wдает разные результаты в зависимости от порядка резисторов на входе, поэтому я запускаю ее при каждом возможном упорядочении каждой возможной комбинации резисторов. Я также знаю, что он выдаст список сопротивлений, которые все можно создать, используя входные резисторы. Я не знаю со 100% уверенностью, что эти две вещи вместе приводят к всевозможному сопротивлению.

Объяснение:

à       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
Камил Дракари
источник