Introducción
Al construir un proyecto de electrónica, un esquema puede requerir una resistencia de un valor inusual (por ejemplo, 510 ohmios). Verifica su depósito de piezas y descubre que no tiene resistencias de 510 ohmios. Pero tiene muchos valores comunes por encima y por debajo de este valor. Al combinar resistencias en paralelo y en serie, debería poder aproximar la resistencia de 510 ohmios bastante bien.
Tarea
Debe escribir una función o programa que acepte una lista de valores de resistencia (resistencias que tenga) y un valor objetivo (que pretende aproximar). El programa debe considerar:
- Resistencias individuales
- Dos resistencias en serie.
- Dos resistencias en paralelo
El programa debe calcular todas las combinaciones posibles de 1 y 2 resistencias de la lista de existencias (incluidas dos copias del mismo valor de resistencia), calcular su resistencia en serie y en paralelo, luego clasificar las configuraciones de acuerdo a qué tan bien se aproximan al valor objetivo.
El formato de salida debe ser una configuración por línea, con una +
serie que |
denota y un paralelo que denota, y algo de espacio o un signo = antes de la resistencia neta.
Fórmulas
- La resistencia de una resistencia es
R1
- La resistencia neta de dos resistencias en serie es
R1 + R2
- La resistencia neta de dos resistencias en paralelo es
1 / (1/R1 + 1/R2)
- La distancia entre un valor de resistencia aproximado y el valor objetivo se puede calcular como la distancia pseudo-logarítmica, no lineal distancia:
dist = abs(Rapprox / Rtarget - 1)
. Por ejemplo, 200 está más cerca de 350 que de 100. - Una mejor medida de distancia es la verdadera distancia logarítmica
dist = abs(log(Rapprox/Rtarget))
, pero como no se especificó en la pregunta original, puede utilizar cualquiera de las dos medidas.
Tanteo
La puntuación se mide en caracteres de código, según las reglas de golf habituales. La puntuación más baja gana.
Ejemplo
Tenemos las siguientes resistencias en stock [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700]
y deseamos apuntar a 510
ohmios. El programa debe generar 143 configuraciones, aproximadamente como se muestra (puede cambiar el formato, pero asegúrese de que el significado se determine fácilmente):
680 | 2200 519.444
1000 | 1000 500.
150 + 330 480.
220 + 330 550.
470 470
680 | 1500 467.89
680 | 3300 563.819
100 + 470 570.
220 + 220 440.
100 + 330 430.
470 | 4700 427.273
680 | 4700 594.052
1000 | 1500 600.
470 | 3300 411.406
680 | 1000 404.762
150 + 470 620.
...
many more rows
...
2200 + 4700 6900.
3300 + 4700 8000.
4700 + 4700 9400.
En este ejemplo, la mejor aproximación de 510 ohmios viene dada por resistencias de 680 y 2200 ohmios en paralelo.
Lo mejor de cada idioma hasta ahora (1 de junio de 2014):
- J - 70 char
- APL - 102 char
- Mathematica - 122 char
- Ruby - 154 char
- Javascript - 156 caracteres
- Julia - 163 char
- Perl - 185 char
- Python - 270 char