Widerstandsberechnung (Nerd Sniping)

10

Guten Nachmittag Golfer,

Unsere heutige Herausforderung ist von den XKCD-Comics 356 und 370 inspiriert . Wir werden ein Programm schreiben, um den Widerstand einer Gruppe von Widerständen zu berechnen. Eine Warnung, dass dies fast schwierig genug ist, um eine Code-Herausforderung zu rechtfertigen, aber ich denke, dass es eine gewisse Kunst ist, etwas komplexere Programme in einem Golfformat zu schreiben. Die niedrigste Anzahl von Charakteren gewinnt.

Die Berechnung des Widerstands basiert auf den folgenden zwei Formeln:

  • Wenn die Widerstände in Reihe geschaltet sind, ist der Widerstand die Summe des Widerstands jedes Widerstands
  • Wenn die Widerstände parallel sind, ist der Widerstand die Umkehrung der Summe der Umkehrung des Widerstands jedes Widerstands

Also - zum Beispiel:

Beispiel für die Berechnung des Widerstands

Ihre Herausforderung besteht darin, mit möglichst wenigen Zeichen den Widerstand einer Gruppe von bis zu 64 Widerständen zu berechnen. Ich entschuldige mich für die Komplexität, insbesondere der Eingaberegeln. Ich habe versucht, sie so zu definieren, dass jede Sprache verwendet werden kann.

  • Jeder Widerstand wird mit 2 oder mehr anderen Widerständen verbunden.

  • Die Eingabe ist garantiert gültig, mit nur einem Eingangs- und einem Austrittspunkt, die eine Verbindung herstellen

  • Das Netzwerk wird serienparallel sein, um zu verhindern, dass mehr Mathematik erforderlich ist als dargestellt

  • Die Eingabe erfolgt über Datei, Argument oder Standard, je nachdem, was für Ihre Sprache geeignet ist.

  • Der Eingang besteht aus einer Reihe von Zeilenumbrüchen, die aus einer Ganzzahl des Widerstands des Widerstands bestehen, und Leerzeichen, die die IDs der Widerstände trennen, mit denen eine Seite des Widerstands verbunden ist.

  • Die ID des ersten Widerstands ist 1 und wird für jeden aufeinanderfolgenden Widerstand um eins erhöht

  • Der Start hat immer eine ID von 0

  • Der Endwiderstand hat immer einen Widerstand von 0 Ohm und nur die in seiner Leitung definierten Anschlüsse

Zum Beispiel:

Beispiel 2

Könnte dargestellt werden als

3 0
6 1
1 0
5 0
0 2 3 4
  • Die Ausgabe kann in Standard oder Datei erfolgen. Es kann auf eine der folgenden Arten dargestellt werden:
    • Eine Zahl mit mindestens 2 Dezimalstellen, gefolgt von einer neuen Zeile
    • Ein Bruch, der aus einer Ganzzahl (dem Zähler), einem Schrägstrich und einer weiteren Ganzzahl (dem Nenner) besteht, gefolgt von einer neuen Zeile. Die Fraktion muss nicht diejenige sein, die in ihrer niedrigsten Form vorliegt - 4/4 oder 10/8 sind beispielsweise akzeptabel. Der Bruch muss innerhalb von 1/100 genau sein. Es gibt keinen Bonus für die perfekte Genauigkeit - dies ist eine Krücke, mit der Sprachen ohne Fest- oder Gleitkommaoperationen miteinander konkurrieren können.

Ich hoffe, das deckt alle Punkte ab. Viel Glück!

Lochok
quelle
/ist kein Backslash. Meinten Sie "\" oder einen Schrägstrich?
John Dvorak
Dürfen wir falsche Ergebnisse erzielen, wenn der Eingang kein seriell-paralleles Netzwerk ist?
John Dvorak
1
Die Wheatstone-Brücke ist nicht seriell parallel, wenn Sie das Mittelvoltmeter durch einen Widerstand ersetzen
John Dvorak
1
Werden Widerstände immer an solche mit einem niedrigeren ID angeschlossen oder können sie in beliebiger Reihenfolge eingegeben werden? Ist 1 2/1 0/0 1gültig?
John Dvorak
9
Das parallele Beispiel ist falsch. Es sollte 15/23 sein, nicht 15/8.
Peter Taylor

Antworten:

6

APL 190

Indexursprung 1. Die erste (n) Schleife (n) kombiniert alle in Reihe geschalteten Widerstände, die zweite (p) die parallel geschalteten Widerstände und die Wiederholung zur ersten Schleife, um alle jetzt in Reihe geschalteten parallelen Widerstände zu kombinieren. Die Spezifikation des endgültigen Nullwiderstands scheint redundant zu sein.

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                     
' '  

Getestet über die Beispiele in der Frage sowie ein etwas komplizierteres:

      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
Graham
quelle
Immer wieder begeistert von APL-Antworten - sie sehen absolut verrückt aus. Der letzte Widerstand sollte nur den anderen Widerständen etwas zum Anschließen geben - eine Dummy-Endverbindung. Gut gemacht!
Lochok
Ich denke, Sie können ein paar Zeichen speichern. Ersetzen Sie die ersten beiden Zeilen durch o←⊃↑¨r←¯1↓⍎¨(c≠'/')⊂c. Dieses Muster ist an einigen Stellen anwendbar.
FUZxxl
5

Python, 329 Zeichen

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

Berechnet den Widerstand durch Spannungsrelaxation an der Schaltung. Zuerst wird ein 1-Ohm-Widerstand an den Start angeschlossen und der letzte Widerstand von 0 Ohm auf 1 Ohm geändert. Dann setzt es die Eingangsspannung auf 0 und die Ausgangsspannung auf 1 Volt. Nach der Simulation des Stromflusses durch das Netzwerk wird der Netzwerkwiderstand anhand des Spannungsabfalls am ersten 1-Ohm-Widerstand berechnet.

Jeder Widerstand erhält zwei Nummern, die Nummer für seinen linken Anschluss und die Nummer für seinen rechten Anschluss. Der linke Anschluss des Widerstands r ist 2 * r und sein rechter Anschluss ist 2 * r + 1. Der Eingang wird verwendet, um Sdie Sätze von Klemmen zu berechnen , die miteinander verbunden sind. Jeder Klemme erhält eine Spannung V[t]und eine Entspannung erfolgt durch Erhöhen der Spannung, wenn der Strom netto in einen Klemmensatz fließt, und Verringern der Spannung, wenn der Strom netto fließt.

Keith Randall
quelle
2

(Dies ist ein Kommentar, aber ich kann keine ASCII-Kunst in einem echten Kommentar machen ...)

Wie wird so etwas eingegeben?

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

Womit sind insbesondere 3 und 4 verbunden? 1 oder 2 oder sowohl 1 als auch 2?

Keith Randall
quelle
Sowohl eins als auch zwei
Lochok