Вычислить сопротивление 4-полосного цветового резистора


29

Резисторы обычно имеют цветные полосы , которые используются для определения их сопротивления в Омах . В этой задаче мы рассмотрим только обычные четырехполосные, загар, резисторы с осевым выводом. Мы выразим их как:

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

Python 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)

edit: @ 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.