Introdução
Ao construir um projeto de eletrônica, um esquema pode exigir um resistor de valor incomum (por exemplo, 510 ohms). Você verifica o compartimento de peças e descobre que não possui resistores de 510 ohm. Mas você tem muitos valores comuns acima e abaixo desse valor. Ao combinar resistores em paralelo e em série, você poderá aproximar o resistor de 510 ohm razoavelmente bem.
Tarefa
Você deve escrever uma função ou programa que aceite uma lista de valores de resistores (resistores que você armazena) e um valor alvo (que você pretende aproximar). O programa deve considerar:
- Resistores individuais
- Dois resistores em série
- Dois resistores em paralelo
O programa deve calcular todas as combinações possíveis de 1 e 2 resistores da lista de estoques (incluindo duas cópias do mesmo valor de resistor), calcular suas séries e resistências paralelas e, em seguida, classificar as configurações de acordo com a proximidade com o valor alvo.
O formato de saída deve ser uma configuração por linha, com uma +
série e |
paralelo, e algum espaço ou um sinal = antes da resistência líquida.
Fórmulas
- A resistência de um resistor é
R1
- A resistência líquida de dois resistores em série é
R1 + R2
- A resistência líquida de dois resistores em paralelo é
1 / (1/R1 + 1/R2)
- A distância entre um valor da resistência e o valor aproximado alvo pode ser calculada como a distância pseudo-logarítmica, não linear distância:
dist = abs(Rapprox / Rtarget - 1)
. Por exemplo, 200 está mais perto de 350 do que em 100. - Uma medida de distância melhor é a distância logarítmica verdadeira
dist = abs(log(Rapprox/Rtarget))
, mas como isso não foi especificado na pergunta original, você pode usar qualquer uma das medidas.
Pontuação
A pontuação é medida em caracteres de código, de acordo com as regras usuais de golfe. Menor pontuação ganha.
Exemplo
Temos os seguintes resistores em estoque [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700]
e queremos atingir 510
ohms. O programa deve produzir 143 configurações, aproximadamente como mostrado (você pode alterar o formato, mas verifique se o significado é facilmente determinado):
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.
Neste exemplo, a melhor aproximação de 510 ohms é dada pelos resistores de 680 e 2200 ohms em paralelo.
Melhor de cada idioma até agora (1 de junho de 2014):
- J - 70 char
- APL - 102 char
- Mathematica - 122 char
- Rubi - 154 caracteres
- Javascript - 156 caracteres
- Julia - 163 char
- Perl - 185 car
- Python - 270 caracteres