Wprowadzenie
Podczas budowy projektu elektronicznego schemat może wymagać rezystora o nietypowej wartości (powiedzmy 510 omów). Sprawdzasz pojemnik na części i okazuje się, że nie masz rezystorów 510 omów. Ale masz wiele wspólnych wartości powyżej i poniżej tej wartości. Łącząc rezystory równolegle i szeregowo, powinieneś być w stanie dość dobrze przybliżyć rezystor 510 Ω.
Zadanie
Musisz napisać funkcję lub program, który akceptuje listę wartości rezystorów (zapas rezystorów) i wartość docelową (którą chcesz przybliżyć). Program musi uwzględniać:
- Indywidualne rezystory
- Dwa rezystory w szeregu
- Dwa oporniki równolegle
Program powinien obliczyć wszystkie możliwe kombinacje rezystorów 1 i 2 z listy zapasów (w tym dwie kopie tej samej wartości rezystora), obliczyć ich szeregową i równoległą rezystancję, a następnie posortować konfiguracje według tego, jak dobrze przybliżają wartość docelową.
Format wyjściowy powinien mieć jedną konfigurację na linię, z +
szeregiem |
oznaczającym i oznaczającym równolegle oraz pewną spacją lub znakiem = przed oporem netto.
Formuły
- Rezystancja jednego opornika wynosi
R1
- Rezystancja netto dwóch rezystorów szeregowych wynosi
R1 + R2
- Rezystancja netto dwóch równoległych rezystorów wynosi
1 / (1/R1 + 1/R2)
- Odległość między aproksymacją wartości oporu oraz wartości zadanej może być obliczona jako pseudo-odległości logarytmicznym nie liniowa odległość:
dist = abs(Rapprox / Rtarget - 1)
. Na przykład 200 jest bliższe 350 niż 100. - Lepszą miarą odległości jest prawdziwa odległość logarytmiczna
dist = abs(log(Rapprox/Rtarget))
, ale ponieważ nie zostało to określone w pierwotnym pytaniu, możesz dowolnie stosować dowolny pomiar.
Punktacja
Wynik mierzony jest znakami kodu, zgodnie ze zwykłymi zasadami golfa. Najniższy wynik wygrywa.
Przykład
W magazynie mamy następujące rezystory [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700]
i chcemy kierować 510
omy. Program powinien wypisać 143 konfiguracje, w przybliżeniu jak pokazano (możesz zmienić format, ale upewnij się, że znaczenie jest łatwe do ustalenia):
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.
W tym przykładzie najlepsze przybliżenie 510 omów podane jest równolegle przez rezystory 680 i 2200 omów.
Najlepsze z dotychczasowych języków (1 czerwca 2014 r.):
- J - 70 znaków
- APL - 102 znak
- Mathematica - 122 znaków
- Ruby - 154 znak
- JavaScript - 156 znaków
- Julia - 163 char
- Perl - 185 znaków
- Python - 270 znaków