Чи можливий ланцюг?


9

Напишіть програму або функцію, яка приймає вхід: всі наявні резистори та значення опору та виводять триєдне значення того, чи можна отримати опір, використовуючи ці резистори.

Правила:

Будь-який формат для введення буде робити.

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

Опір усіх наявних резисторів та необхідний опір становитимуть цілими додатними.

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

Вихідні дані повинні бути будь-якими 2 унікальними значеннями для Можливе та Неможливо.

Резистори можуть бути підключені будь-яким способом.

Серійний опір: Для n опорів у серії: Результат = R1 + R2 + R3 + .... Rn

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

Схема може не зажадати всіх резисторів для отримання необхідного опору (вихід справжній, якщо це так).

Переможець:

Це код-гольф, тому виграє найкоротший код.

Приклади:

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 буде вірно
Vedant Kandoi

Приємний виклик, але я достатньо маю справу з 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 дякую :)


2
Ласкаво просимо до PPCG! Якщо вам потрібен імпорт, вони повинні бути включені у ваш код. Крім того, вам потрібно взяти дані самостійно, а не припускати, що вхід є змінною. Також, b != 0-> b!=0.
Стівен

Як Стівен Саод, ви не можете приймати дані через заздалегідь задану змінну, інакше це фрагмент, який заборонено. Ви повинні змінити його або на функцію, або на повну програму
Jo King

1
Він не працює для третього тестового випадку (також, трохи погравши в гольф і з належним вкладом. Якщо ви переживаєте, я щось зламав, ваш оригінальний код також не працює)
Jo King

чорт. Я маю на увазі :(
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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.