Обчисліть опір 4-смугового кольорового резистора


29

Резистори зазвичай мають кольорові смуги , які використовуються для ідентифікації їх опору в Омах . У цьому виклику ми розглянемо лише звичайні 4-смугові, загарячі, осьово-відвідні резистори. Ми виразимо їх як:

xyzt

Де xє перша смуга для першої значної фігури, yє друга смуга для другої значущої фігури, zтретя смуга для множника і tє четвертою смугою для допуску .

Кожен із xyztсимволів являє собою букву, яка скорочує колір смуги:

K = Black
N = Brown
R = Red
O = Orange
Y = Yellow
G = Green
B = Blue
V = Violet
A = Gray
W = White
g = Gold
s = Silver
_ = None

Так, наприклад, NKOgє якийсь конкретний резистор.

Опір можна обчислити за допомогою цієї таблиці:

Кодова таблиця кольорів резистора

Як випливає з таблиці:

  • xі yможуть бути будь-які літери , за винятком g, sі _.
  • zможе бути будь-що, крім _.
  • Ми обмежимося tлише бути g, sабо _.

( Ось зручний калькулятор опору, який працює з таким самим набором резисторів, який ми є. )

Опір, 10 * x + yкратне кратному z, до відхилення tвідсотків.

Наприклад, для обчислення опору NKOg, ми бачимо, що:

  1. N означає Коричневий для 1.
  2. K означає Чорний за 0.
  3. Oозначає Помаранчевий за 10 3 .
  4. g означає Золото на ± 5%.

Отже, опір (10*1 + 0)*10^310000 Ω ±5%.

Виклик

Напишіть програму або функцію, яка містить 4 символьні ряди форми xyztі друкує або повертає опір у формі [resistance] Ω ±[tolerance]%.

  • Резистор може бути "догори дном", тобто у зворотному порядку tzyx. Наприклад, як NKOgі gOKNповинні виробляти 10000 Ω ±5%.
  • Опір завжди в рівних омах, ніколи в кілометрах, мегомах тощо.
  • Ωможе бути замінений ohms, наприклад 10000 ohms ±5%.
  • ±може бути замінений +/-, наприклад 10000 Ω +/-5%.
  • Зазначити нулі праворуч від десяткової крапки - це добре. (наприклад 10000.0 Ω +/-5%)
  • Ви можете припустити, що введення завжди дійсне ( xі yніколи gs_; zніколи _; tтільки gs_).
  • Всі 10 × 10 × 12 × 3 = 3600 можливих резисторів (2 × 3600 можливих входів) потрібно підтримувати, навіть якщо деякі поєднання кольорових смуг не створюються в реальному житті.

Виграє найкоротший код у байтах.

Приклади

  1. gOKN10000 ohms +/-5%
  2. KKR_0 Ω +/-20%
  3. ggKN1 ohms ±5%
  4. ggGO3.5 Ω ±5%
  5. ssGO0.350 Ω ±10%
  6. GOOs53000 ohms +/-10%
  7. YAK_48.0 ohms +/-20%
  8. _WAV78000000000 Ω ±20%
  9. gBBB66000000.000 ohms ±5%
  10. _RYR2400.00 ohms ±20%

Якщо вам сподобаються мої виклики, подумайте про те, щоб перевірити блокові стада бота!

Відповіді:



9

CJam, 53 51 50 байт

" Ω ±"l_W%e<)iB%5*F-'%@"gKNROYGBVAW"f#:(2/'e*s~o

Спробуйте в Інтернеті .

(Дякуємо @ user23013 за байт)


Я почав у Python, але

eval("%d%de%d"%tuple("gKNROYGBVAW".find(x)-1for x in L))

було надто дорого ...


2
:(2/'e*s~рятує [.
jimmy23013

@ User23013 Ах спасибі, я намагався купу способів вставляючи , eде це необхідно, але я ніколи не думав , /і*
Sp3000

4

Пітон 3, 130 114 байт

def f(v):
 a,b,c,d=["_sgKNROYGBVAW".index(x)-3for x in v[::(1,-1)[v[0]in'sg_']]]
 return "%s Ω ±%s%%"%((10*a+b)*10**c,2.5*2**-d)

редагувати: @ Sp3000 вказує, що впорядкування можна краще виявити за допомогою, min(v,v[::-1])а не v[::(1,-1)[v[0]in'sg_']](збереження 10 байтів), не перевіряйте індекс _і не видаляйте зайву пробіл.

def f(v):a,b,c,d=["sgKNROYGBVAW".find(x)-2for x in min(v,v[::-1])];return"%s Ω ±%s%%"%((10*a+b)*10**c,2.5*2**-d)

Дякую - я зрозумів про об'єднання ліній, але пропустив хитрість використання min()для виявлення правильного впорядкування - приємно.
хроніт

3

Perl, 93 байти

#!perl -lp
ord>90and$_=reverse;s/./-3+index zsgKNROYGBVAW,$&/ge;$_=s/..\K/e/*$_." Ω ±"./.$/*5*$&."%"

1

Haskell, 135 132 130 байт

r y|y<"["=p[k|j<-y,(c,k)<-zip"_ sgKNROYGBVAW"[-4..],c==j]
r y=r.reverse$y
p[a,b,c,d]=show((a*10+b)*10**c)++" Ω ±"++show(-5*d)++"%"

Пояснення:

r y|y<"["=            If first letter of argument is a capital
p[..]                 Call p on the list created
[k|                   Make a list of all k
   j<-y               Draw character j from input
       ,(c,k)<-       With (c,k) being a pair from
               zip    A list of pairs of corresponding elements from the lists:
"_ sgKNROYGBVAW"       The space at 2nd position is to match '_' with -4, but 's' with -2
[-4..]                 An infinite list starting at -4
,c==j]                Only use element k if j equals the character c

r y=r.reverse$y       If first call fails, call again with reversed argument.

p[a,b,c,d]=           Assign the first four elements of the argument to a,b,c,d respectively.
show                  Turn (number) into string
10**c                 10 to the power of c
++                    Concatenate strings
-5*d                  This works for the tolerance because '_' makes d=-4

Завдяки німі я поголив ще 2 байти.

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