Вступ
При побудові проекту з електроніки схематично може зажадати резистор незвичного значення (скажімо, 510 Ом). Ви перевіряєте свій контейнер для деталей і виявляєте, що у вас немає резисторів 510 Ом. Але у вас є багато загальних значень вище та нижче цього значення. Комбінуючи резистори паралельно та послідовно, ви зможете досить наблизити резистор 510 Ом.
Завдання
Ви повинні написати функцію або програму, яка приймає перелік значень резисторів (резисторів, які ви запасуєте), і цільове значення (яке ви хочете наблизити). Програма повинна враховувати:
- Індивідуальні резистори
- Два резистори послідовно
- Паралельно два резистори
Програма повинна обчислити всі можливі комбінації 1 і 2 резисторів зі списку запасів (включаючи дві копії одного і того ж значення резистора), обчислити їхні серії та паралельний опір, а потім сортувати конфігурації відповідно до того, наскільки вони наближають цільове значення.
Вихідний формат повинен мати одну конфігурацію на рядок, із +
позначаючим рядом і |
позначаючи паралель, і деякий пробіл або знак = перед чистим опором.
Формули
- Опір одного резистора є
R1
- Чистий опір двох резисторів послідовно
R1 + R2
- Чистий опір двох резисторів паралельно
1 / (1/R1 + 1/R2)
- Відстань між апроксимувати значенням опору і цільовим значенням може бути обчислено як псевдо-логарифмическим відстань, а не лінійна відстані:
dist = abs(Rapprox / Rtarget - 1)
. Наприклад, 200 ближче до 350, ніж до 100. - Кращий показник відстані - це справжня логарифмічна відстань
dist = abs(log(Rapprox/Rtarget))
, але оскільки це не було зазначено в первісному запитанні, ви можете використовувати будь-яке вимірювання.
Оцінка балів
Оцінка оцінюється символами коду, за звичайними правилами гольфу. Виграє найнижчий рахунок.
Приклад
У нас є такі резистори, які [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700]
бажають націлити 510
Ом. Програма повинна вивести 143 конфігурації, приблизно, як показано (ви можете змінити формат, але переконайтесь, що значення легко визначається):
680 | 2200 519.444
1000 | 1000 500.
150 + 330 480.
220 + 330 550.
470 470
680 | 1500 467.89
680 | 3300 563.819
100 + 470 570.
220 + 220 440.
100 + 330 430.
470 | 4700 427.273
680 | 4700 594.052
1000 | 1500 600.
470 | 3300 411.406
680 | 1000 404.762
150 + 470 620.
...
many more rows
...
2200 + 4700 6900.
3300 + 4700 8000.
4700 + 4700 9400.
У цьому прикладі найкраще наближення 510 Ом дають паралельно резистори 680- та 2200 Ом.
Кращий з кожної мови дотепер (1 червня 2014 року):
- J - 70 char
- APL - 102 char
- Mathematica - 122 char
- Ruby - 154 char
- Javascript - 156 char
- Джулія - 163 чарів
- Perl - 185 char
- Python - 270 char