Введение
При создании проекта электроники схема может потребовать резистор необычного значения (скажем, 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 символов
- APL - 102 символа
- Mathematica - 122 символа
- Рубин - 154 символа
- Javascript - 156 символов
- Юлия - 163 символа
- Perl - 185 символов
- Python - 270 знаков