4バンドの色分けされた抵抗の抵抗を計算する


29

抵抗器は一般に、抵抗値オームで識別するために使用される色分けされたバンドを持っています。この課題では、通常の4バンド、タン、アキシャルリード抵抗のみを考慮します。それらを次のように表現します。

xyzt

ここで、x最初の有効数字の最初のバンドであり、y第二の有効数字のための第2バンド、あるz乗算器のための第3バンド、及び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特定の抵抗器があります。

抵抗は、次の表を使用して計算できます。

抵抗色コード表

表が示すように:

  • xyを除く任意の文字することができgs_
  • z以外のものを指定できます_
  • 私たちは、制限するだろうtだけであることをgsまたは_

これは、私たちとまったく同じ抵抗器セットを扱う便利な抵抗計算機です。

抵抗がある10 * x + yzの許容範囲に、乗数tの割合。

たとえば、の抵抗を計算するにはNKOg、次のことがわかります。

  1. N 1はブラウンを意味します。
  2. K 0は黒を意味します。
  3. O10 3のオレンジを意味します。
  4. g ±5%の金を意味します。

したがって、抵抗は(10*1 + 0)*10^310000 Ω ±5%です。

チャレンジ

フォームの4文字の文字列を取り込んxyztで、フォームに抵抗を出力または返すプログラムまたは関数を作成します[resistance] Ω ±[tolerance]%

  • 抵抗器は「逆さま」、つまり逆順でもよいtzyx。たとえば、との両方NKOggOKN生成する必要があり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%

IFFあなたは私の挑戦を楽しんで、チェックアウトを検討ブロックビルボット群れを!

回答:



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)

編集: @ 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、135132130バイト

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

nimiのおかげで、さらに2バイト削りました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.