Calcule la resistencia de una resistencia codificada por color de 4 bandas

29

Las resistencias comúnmente tienen bandas codificadas por colores que se utilizan para identificar su resistencia en ohmios . En este desafío solo consideraremos las resistencias normales de 4 bandas, bronceado, de plomo axial. Los expresaremos como:

xyzt

Donde xestá la primera banda para la primera figura significativa, yes la segunda banda para la segunda figura significativa, zla tercera banda para el multiplicador, y tes la cuarta banda para la tolerancia .

Cada uno xyztrepresenta una letra que abrevia el color de la banda:

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

Entonces, por ejemplo, NKOges una resistencia particular.

La resistencia se puede calcular con la ayuda de esta tabla:

Tabla de códigos de color de resistencia

Como sugiere la tabla:

  • xy ypuede ser cualquier letra A excepción g, sy _.
  • zpuede ser cualquier cosa excepto _.
  • Se restringirá ta ser única g, so _.

( Aquí está una calculadora resistencia práctico que trata de exactamente el mismo conjunto de resistencias somos. )

La resistencia es multiplicada por 10 * x + yel zmultiplicador, a una tolerancia del tporcentaje.

Por ejemplo, para calcular la resistencia de NKOg, vemos que:

  1. N significa marrón para 1.
  2. K significa negro para 0.
  3. Osignifica naranja para 10 3 .
  4. g significa oro para ± 5%.

Entonces la resistencia es (10*1 + 0)*10^310000 Ω ±5%.

Reto

Escriba un programa o función que tome una cadena de 4 caracteres del formulario xyzte imprima o devuelva la resistencia en el formulario [resistance] Ω ±[tolerance]%.

  • La resistencia puede estar "al revés", es decir, en el orden inverso tzyx. Por ejemplo, ambos NKOgy gOKNdeberían producir 10000 Ω ±5%.
  • La resistencia siempre está en ohmios simples, nunca kilohms, megaohms, etc.
  • Ωpuede ser reemplazado con ohms, por ej 10000 ohms ±5%.
  • ±puede ser reemplazado con +/-, por ej 10000 Ω +/-5%.
  • Tener ceros a la derecha de un punto decimal está bien. (por ejemplo 10000.0 Ω +/-5%)
  • Puede suponer que la entrada siempre es válida ( xy ynunca gs_; znunca _; tsolo gs_).
  • Todos los 10 × 10 × 12 × 3 = 3600 resistencias posibles (2 × 3600 entradas posibles) deben ser compatibles, incluso si algunas combinaciones de bandas de color no se producen en la vida real.

El código más corto en bytes gana.

Ejemplos

  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%

Si y sólo si usted disfruta de mis retos, considera chequear Módulo Bot rebaños!

Pasatiempos de Calvin
fuente

Respuestas:

10

CJam, 59 58 56 50 bytes

r_W%e>"sgKNROYGBVAW"f#2f-~A*+A@#*" Ω ±"@[KA5]='%

Pruébelo en línea en el intérprete de CJam .

Dennis
fuente
9

CJam, 53 51 50 bytes

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

Pruébalo en línea .

(Gracias a @ user23013 por un byte)


Empecé en Python, pero

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

era demasiado caro ...

Sp3000
fuente
2
:(2/'e*s~guarda el [.
jimmy23013
@ user23013 Ah, gracias, he estado intentando un montón de formas de insertar el lugar edonde es necesario, pero nunca pensé en /y*
Sp3000
4

Python 3, 130 114 bytes

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)

editar: @ Sp3000 señala que el orden se puede detectar mejor con (en min(v,v[::-1])lugar de v[::(1,-1)[v[0]in'sg_']]ahorrar 10 bytes), no verificar el índice _y eliminar algunos espacios en blanco innecesarios.

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)
cronitis
fuente
Gracias. Me di cuenta de la concatenación de las líneas, pero me perdí el truco de usar min()para detectar el orden correcto. Genial.
cronitis
3

Perl, 93 bytes

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

Haskell, 135 132 130 bytes

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

Explicación:

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

Gracias a nimi, eliminé otros 2 bytes.

AplusKminus
fuente