introduction
Lors de la construction d'un projet électronique, un schéma peut nécessiter une résistance d'une valeur inhabituelle (disons, 510 ohms). Vous vérifiez votre bac de pièces et constatez que vous n'avez pas de résistances de 510 ohms. Mais vous avez de nombreuses valeurs communes au-dessus et en dessous de cette valeur. En combinant des résistances en parallèle et en série, vous devriez être en mesure d'approximer assez bien la résistance de 510 ohms.
Tâche
Vous devez écrire une fonction ou un programme qui accepte une liste de valeurs de résistance (résistances que vous stockez) et une valeur cible (que vous souhaitez approximer). Le programme doit considérer:
- Résistances individuelles
- Deux résistances en série
- Deux résistances en parallèle
Le programme doit calculer toutes les combinaisons possibles de 1 et 2 résistances à partir de la liste de stock (y compris deux copies de la même valeur de résistance), calculer leur série et leur résistance parallèle, puis trier les configurations en fonction de leur approximation de la valeur cible.
Le format de sortie doit être une configuration par ligne, avec une +
série |
dénotant et dénotant parallèle, et un peu d'espace ou un signe = avant la résistance nette.
Formules
- La résistance d'une résistance est
R1
- La résistance nette de deux résistances en série est
R1 + R2
- La résistance nette de deux résistances en parallèle est
1 / (1/R1 + 1/R2)
- La distance entre une valeur approchée de la résistance et de la valeur cible peut être calculée comme distance de pseudo-logarithmique, non linéaire distance:
dist = abs(Rapprox / Rtarget - 1)
. Par exemple, 200 est plus proche de 350 que de 100. - Une meilleure mesure de distance est la vraie distance logarithmique
dist = abs(log(Rapprox/Rtarget))
, mais comme cela n'était pas spécifié dans la question d'origine, vous êtes libre d'utiliser l'une ou l'autre mesure.
Notation
Le score est mesuré en caractères de code, selon les règles de golf habituelles. Le score le plus bas l'emporte.
Exemple
Nous avons les résistances suivantes en stock [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700]
et souhaitons cibler les 510
ohms. Le programme devrait produire 143 configurations, approximativement comme indiqué (vous pouvez changer le format, mais assurez-vous que la signification est facilement déterminée):
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.
Dans cet exemple, la meilleure approximation de 510 ohms est donnée par des résistances de 680 et 2200 ohms en parallèle.
Le meilleur de chaque langue jusqu'à présent (1er juin 2014):
- J - 70 car
- APL - 102 car.
- Mathematica - 122 caractères
- Rubis - 154 car.
- Javascript - 156 caractères
- Julia - 163 caractères
- Perl - 185 caractères
- Python - 270 caractères