Calcul de la résistance (Nerd Sniping)


10

Bons golfeurs,

Notre défi d'aujourd'hui est inspiré des bandes dessinées XKCD 356 et 370 . Nous allons écrire un programme pour calculer la résistance d'un groupe de résistances. Un avertissement que cela est presque assez difficile pour justifier d'être un défi de code, mais je pense qu'il y a un certain art à écrire des programmes légèrement plus complexes dans un format golfique. Le plus petit nombre de personnages gagne.

Le calcul de la résistance repose sur les deux formules suivantes:

  • Si les résistances sont en série, la résistance est la somme de la résistance de chaque résistance
  • Si les résistances sont en parallèle, la résistance est l'inverse de la somme de l'inverse de la résistance de chaque résistance

Donc - par exemple:

Exemple de calcul de résistance

Votre défi est de calculer, dans le moins de caractères possible, la résistance d'un groupe de jusqu'à 64 résistances. Mes excuses pour la complexité, en particulier des règles d'entrée. J'ai essayé de les définir de manière à ce que chaque langue soit utilisable.

  • Chaque résistance sera connectée à 2 ou plusieurs autres résistances.

  • L'entrée est garantie pour être valide, avec seulement une entrée et un point de sortie, qui se connecteront

  • Le réseau sera parallèle en série pour éviter d'exiger plus de maths que ce qui est présenté

  • L'entrée se fera par fichier, argument ou stdin, selon ce qui est approprié pour votre langue.

  • L'entrée consistera en une série d'instructions séparées par des sauts de ligne ou des virgules avant constituées d'un entier de la résistance de la résistance et d'espaces séparant les ID des résistances auxquelles un côté de la résistance est connecté.

  • L'ID de la première résistance sera 1, incrémentant de un pour chaque résistance successive

  • Le départ aura toujours un ID de 0

  • La résistance finale aura toujours une résistance de 0 ohms et n'aura que les connexions définies dans sa ligne

Par exemple:

Exemple 2

Pourrait être représenté comme

3 0
6 1
1 0
5 0
0 2 3 4
  • La sortie peut être vers stdout ou fichier. Il peut être représenté de l'une des manières suivantes:
    • Un nombre avec un minimum de 2 décimales, suivi d'une nouvelle ligne
    • Une fraction composée d'un entier (le numérateur), d'une barre oblique et d'un autre entier (le dénominateur), suivie d'une nouvelle ligne. Il n'est pas nécessaire que la fraction soit dans sa forme la plus basse - 4/4 ou 10/8 sont, par exemple, acceptables. La fraction doit être précise au 1/100. Il n'y a aucun bonus pour être parfaitement précis - cela est fourni est une béquille pour permettre aux langues sans opérations à virgule fixe ou flottante de rivaliser.

J'espère que cela couvre tous les points. Bonne chance!


/n'est pas une barre oblique inverse. Voulez-vous dire `\ 'ou une barre oblique?
John Dvorak

Sommes-nous autorisés à produire des résultats incorrects si l'entrée n'est pas un réseau série parallèle?
John Dvorak

1
le pont de Wheatstone n'est pas parallèle en série si vous remplacez le voltmètre central par une résistance
John Dvorak

1
les résistances seront-elles toujours connectées à celles ayant un ID inférieur ou peuvent-elles être entrées dans n'importe quel ordre? Est 1 2/1 0/0 1valide?
John Dvorak

9
L'exemple parallèle est faux. Ce devrait être 15/23, pas 15/8.
Peter Taylor

Réponses:


6

APL 190

Origine de l'index 1. La première boucle (s) combine toutes les résistances câblées en série, la seconde (p) celles câblées en parallèle et la répétition à la première boucle pour combiner toutes les résistances parallèles maintenant en série. La spécification de la résistance finale zéro semble être redondante.

r←¯1↓⍎¨(c≠'/')⊂c        
o←⊃↑¨r                  
r←⊃1↓¨r                 
s:→(0=+/n←1=+/×r)/p     
n←↑n/i←⍳↑⍴r             
o[n-1]←+/o[n-0 1]       
o←(i←n≠i)/o             
r←i⌿r                   
r←r-r≥n                 
→s                      
p:n←1⍪2≠/r[;1]          
r←((⍴r),1)⍴r←¯1++\n~0   
o←∊1÷¨+/¨1÷¨n⎕penclose o
→(1<⍴o)/s               
3⍕o                     
' '  

Testé sur les exemples de la question plus un peu plus compliqué:

      Input: '5 0/3 1/1 2/0 2'
 9.000

      Input: '3 0/1 0/5 0/0 1 2 3'
 0.652

      Input: '3 0/6 1/1 0/5 0/0 2 3 4'
 0.763

      Input: '2 0/2 1/2 0/2 0/2 4/2 5/2 2 3 6/2 7/2 2 3 6/0 8 9'
 2.424

Toujours étonné par les réponses APL - ils ont l'air absolument fous. La dernière résistance était juste de donner quelque chose pour que les autres résistances se connectent - une liaison d'extrémité factice. Bien joué!
lochok

Je pense que vous pouvez enregistrer quelques caractères. Remplacez les deux premières lignes par o←⊃↑¨r←¯1↓⍎¨(c≠'/')⊂c. Ce modèle est applicable à quelques endroits.
FUZxxl

5

Python, 329 caractères

import sys
N=[[1]]+[map(int,x.split())for x in sys.stdin]
N[-1][0]=1
n=len(N)
S=[set([i])for i in range(2*n)]
for x in range(n):
 C=S[2*x]
 for y in N[x][1:]:C|=S[2*y+1]
 for x in C:S[x]|=C
V=[0]*(2*n-1)+[1]
for k in range(999):
 for i in range(1,2*n-1):V[i]+=sum((V[j^1]-V[i])/N[j/2][0]for j in S[i])/9./len(S[i])
print 1/V[1]-2

Calcule la résistance en faisant une relaxation de tension sur le circuit. Tout d'abord, il claque une résistance de 1 ohm au début et change la dernière résistance de 0 ohm à 1 ohm. Il règle ensuite la tension d'entrée sur 0 et la tension de sortie sur 1 volt. Après avoir simulé le flux de courant à travers le réseau, la résistance du réseau est calculée en utilisant la chute de tension aux bornes de la première résistance de 1 ohm.

Chaque résistance reçoit deux numéros, le numéro de sa borne gauche et le numéro de sa borne droite. La borne gauche de la résistance r est 2 * r et sa borne droite est 2 * r + 1. L'entrée est utilisée pour calculer Sles ensembles de terminaux qui sont connectés ensemble. Chaque borne reçoit une tension V[t]et une relaxation est effectuée en augmentant la tension si le courant circule net dans un ensemble de bornes et en abaissant la tension si le courant s'écoule net.


2

(Ceci est un commentaire, mais je ne peux pas faire de l'art ascii dans un vrai commentaire ...)

Comment quelque chose comme ça est-il entré?

    --1--     --3--
   /     \   /     \
---       ---       --0--
   \     /   \     /
    --2--     --4--

En particulier, à quoi sont connectés 3 et 4? 1 ou 2, ou les deux 1 et 2?


Un et deux
lochok
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.