Giriş
Bir elektronik proje inşa ederken, şematik olağandışı bir değere direnç gösterebilir (örneğin, 510 ohm). Parça kutunuzu kontrol edin ve 510 ohm'luk direnç olmadığını görün. Ancak bu değerin üstünde ve altında birçok ortak değeriniz var. Dirençleri paralel ve seri olarak birleştirerek, 510-ohm'luk direnci oldukça iyi bir şekilde değerlendirebilmelisiniz.
Görev
Bir direnç değerleri listesi (stokladığınız dirençler) ve bir hedef değer (yaklaşık olarak hedeflediğiniz) kabul eden bir işlev veya program yazmalısınız. Program şunları göz önünde bulundurmalıdır:
- Bireysel dirençler
- Seri halinde iki direnç
- Paralel olarak iki direnç
Program, stok listesinden 1 ve 2 dirençlerin tüm olası kombinasyonlarını hesaplamalı (aynı direnç değerinin iki kopyası dahil), seri ve paralel direncini hesaplamalı ve sonra konfigürasyonları hedef değerine ne kadar yaklaştığına göre sıralamalıdır.
Çıktı formatı her satırda bir konfigürasyon olmalı, bir +
ifade dizisi ve |
paralel ifade ile bir miktar boşluk olmalı veya net dirençten önce bir boşluk veya bir = işareti olmalıdır.
Formüller
- Bir rezistansın direnci
R1
- Serideki iki rezistansın net direnci
R1 + R2
- Paralel olarak iki rezistansın net direnci
1 / (1/R1 + 1/R2)
- Bir yakınsanan direnç değeri ve hedef değer arasındaki mesafenin mesafe doğrusal, psödo-logaritmik mesafe olarak hesaplanabilir:
dist = abs(Rapprox / Rtarget - 1)
. Örneğin, 200, 350'ye, 100'den daha yakındır. - Daha iyi bir uzaklık ölçüsü gerçek logaritmik uzaklıktır
dist = abs(log(Rapprox/Rtarget))
, ancak orijinal soruda belirtilmediğinden, her iki ölçümü de kullanabilirsiniz.
puanlama
Skor her zamanki golf kurallarına göre kod karakterleriyle ölçülür. En düşük puan kazanır.
Örnek
Aşağıdaki dirençler stoklarımızda mevcuttur [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700]
ve 510
ohmları hedef almak istiyoruz . Program yaklaşık gösterildiği gibi 143 yapılandırma çıkarmalıdır (formatı değiştirebilirsiniz, ancak anlamın kolayca belirlendiğinden emin olun):
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.
Bu örnekte, en iyi 510 ohm yaklaşımı paralel olarak 680 ve 2200 ohm dirençlerle verilmiştir.
Şimdiye kadar her dilin en iyisi (1 Haziran 2014):
- J - 70 karakter
- APL - 102 karakter
- Mathematica - 122 karakter
- Yakut - 154 karakter
- Javascript - 156 karakter
- Julia - 163 karakter
- Perl - 185 karakter
- Python - 270 karakter