Oblicz rezystancję 4-pasmowego kolorowego rezystora

29

Rezystory zwykle mają kolorowe paski , które służą do identyfikacji ich rezystancji w omach . W tym wyzwaniu rozważymy tylko normalne 4-pasmowe, tanowe oporniki osiowo-ołowiowe. Wyrażymy je jako:

xyzt

Gdzie xjest pierwsze pasmo dla pierwszej cyfry znaczącej, yto drugie pasmo dla drugiej cyfry znaczącej, ztrzecie pasmo dla mnożnika i tjest czwartym pasmem dla tolerancji .

Każda z nich xyztreprezentuje literę, która skraca kolor paska:

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

Na przykład NKOgjest jakiś konkretny opornik.

Opór można obliczyć za pomocą tej tabeli:

Tabela kodów kolorów rezystorów

Jak sugeruje tabela:

  • xi ymogą być dowolne litery except g, soraz _.
  • zmoże być cokolwiek oprócz _.
  • Będziemy ograniczać tsię tylko g, sczy _.

( Oto przydatny kalkulator rezystancji, który obsługuje dokładnie taki sam zestaw rezystorów, jak my. )

Opór jest pomnożony 10 * x + yprzez zmnożnik, z tolerancją tprocentową.

Na przykład, aby obliczyć opór NKOg, widzimy, że:

  1. N oznacza brązowy dla 1.
  2. K oznacza czarny dla 0.
  3. Ooznacza pomarańczowy dla 10 3 .
  4. g oznacza złoto za ± 5%.

Tak więc opór wynosi (10*1 + 0)*10^310000 Ω ±5%.

Wyzwanie

Napisz program lub funkcję, która pobiera 4-znakowy ciąg formularza xyzti wyświetla lub zwraca opór w formularzu [resistance] Ω ±[tolerance]%.

  • Rezystor może być „do góry nogami”, tj. W odwrotnej kolejności tzyx. Na przykład oba NKOgi gOKNpowinny produkować 10000 Ω ±5%.
  • Rezystancja jest zawsze wyrażona w zwykłych omach, nigdy w kiloomach, megaomach itp.
  • Ωmożna zastąpić ohmsnp 10000 ohms ±5%.
  • ±można zastąpić +/-np 10000 Ω +/-5%.
  • Końcowe zera po prawej stronie przecinka dziesiętnego jest w porządku. (np. 10000.0 Ω +/-5%)
  • Możesz założyć, że dane wejściowe są zawsze prawidłowe ( xi ynigdy gs_; znigdy _; ttylko gs_).
  • Wszystkie 10 × 10 × 12 × 3 = 3600 możliwych rezystorów (2 × 3600 możliwych wejść) muszą być obsługiwane, nawet jeśli niektóre kombinacje pasm kolorów nie są produkowane w rzeczywistości.

Najkrótszy kod w bajtach wygrywa.

Przykłady

  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%

IFF lubisz moje wyzwaniom, należy rozważyć checking out budulcem Bot stad!

Hobby Calvina
źródło

Odpowiedzi:

9

CJam, 53 51 50 bajtów

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

Wypróbuj online .

(Dzięki @ user23013 za bajt)


Zaczynałem w Pythonie, ale

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

było za drogie ...

Sp3000
źródło
2
:(2/'e*s~ratuje [.
jimmy23013
@ user23013 Ah dzięki, Próbowałem kilka sposobów wkładania e, gdzie jest to konieczne, ale nigdy nie myślałem o /i*
SP3000
4

Python 3, 130 114 bajtów

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 wskazuje, że kolejność można lepiej wykryć za pomocą ( min(v,v[::-1])zamiast v[::(1,-1)[v[0]in'sg_']]10 bajtów), nie sprawdzaj indeksu _i usuwaj niepotrzebne białe znaki.

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)
chronitis
źródło
Dzięki - zdałem sobie sprawę z połączenia linii, ale przegapiłem sztuczkę polegającą min()na wykryciu prawidłowego uporządkowania - miło.
chronitis
3

Perl, 93 bajty

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

Haskell, 135 132 130 bajtów

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)++"%"

Wyjaśnienie:

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

Dzięki nim ogoliłem kolejne 2 bajty.

AplusKminus
źródło