Calcolo della resistenza (nerd sniping)


10

Good Afternoon Golfers,

La nostra sfida per oggi è ispirata ai fumetti XKCD 356 e 370 . Scriveremo un programma per calcolare la resistenza di un gruppo di resistori. Un avvertimento che questo è quasi abbastanza difficile da giustificare una sfida al codice, tuttavia penso che ci sia una certa arte nello scrivere programmi leggermente più complessi in un formato golf. Vince il minor numero di personaggi.

Il calcolo della resistenza si basa sulle seguenti due formule:

  • Se i resistori sono in serie, la resistenza è la somma della resistenza di ciascun resistore
  • Se i resistori sono in parallelo, la resistenza è l'inverso della somma dell'inverso della resistenza di ciascun resistore

Quindi - ad esempio:

Esempio di calcolo della resistenza

La tua sfida è, nel minor numero possibile di personaggi, calcolare la resistenza di un gruppo di un massimo di 64 resistori. Mi scuso per la complessità, in particolare per le regole di input. Ho tentato di definirli in modo tale che ogni lingua fosse utilizzabile.

  • Ciascun resistore sarà collegato a 2 o più altri resistori.

  • L'ingresso è garantito per essere valido, con una sola entrata e un punto di uscita, che si collegherà

  • La rete sarà parallela in serie per evitare di richiedere più calcoli di ciò che viene presentato

  • L'input avverrà tramite file, argomento o stdin, a seconda di ciò che è appropriato per la tua lingua.

  • L'input consisterà in una serie di istruzioni separate newline o forward slash costituite da un numero intero della resistenza del resistore e spazi che separano gli ID dei resistori a cui è collegato un lato del resistore.

  • L'ID del primo resistore sarà 1, incrementando di uno per ciascun resistore successivo

  • L'inizio avrà sempre un ID di 0

  • Il resistore finale avrà sempre una resistenza di 0 ohm e avrà solo i collegamenti definiti nella sua linea

Per esempio:

Esempio 2

Potrebbe essere rappresentato come

3 0
6 1
1 0
5 0
0 2 3 4
  • L'output può essere su stdout o file. Può essere rappresentato in uno dei seguenti modi:
    • Un numero con un minimo di 2 cifre decimali, seguito da una nuova riga
    • Una frazione costituita da un numero intero (il numeratore), una barra e un altro numero intero (il denominatore), seguito da una nuova riga. La frazione non deve necessariamente essere quella nella sua forma più bassa - 4/4 o 10/8 sono, per esempio, accettabili. La frazione deve essere accurata entro 1/100. Non ci sono bonus per essere perfettamente precisi - questo è fornito come una stampella per consentire alle lingue senza operazioni a virgola fissa o mobile di competere.

Spero che copra tutti i punti. In bocca al lupo!


/non è una barra rovesciata. Intendevi "\" o una barra?
John Dvorak,

È consentito produrre risultati errati se l'ingresso non è una rete parallela in serie?
John Dvorak,

1
il ponte di Wheatstone non è parallelo in serie se si sostituisce il voltmetro centrale con un resistore
John Dvorak

1
i resistori si collegheranno sempre a quelli con un ID inferiore o potrebbero essere inseriti in qualsiasi ordine? È 1 2/1 0/0 1valido?
John Dvorak,

9
L'esempio parallelo è sbagliato. Dovrebbe essere il 15/23, non il 15/8.
Peter Taylor

Risposte:


6

190 APL

Origine indice 1. Il primo / i loop / i combina tutti i resistori cablati in serie, il secondo (p) quelli cablati in parallelo e la ripetizione al primo loop per combinare eventuali resistori paralleli ora in serie. Le specifiche del resistore zero finale sembrano ridondanti.

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

Testato sugli esempi nella domanda più uno leggermente più complicato:

      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

Sempre stupiti dalle risposte APL: sembrano assolutamente pazzi. Il resistore finale era solo quello di dare qualcosa a cui gli altri resistori potessero connettersi: un collegamento terminale fittizio. Molto bene!
Lochok,

Penso che puoi salvare un paio di personaggi. Sostituisci le prime due righe con o←⊃↑¨r←¯1↓⍎¨(c≠'/')⊂c. Questo modello è applicabile in un paio di posti.
FUZxxl

5

Python, 329 caratteri

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

Calcola la resistenza eseguendo un rilassamento di tensione sul circuito. Innanzitutto si collega su una resistenza da 1 ohm all'inizio e cambia l'ultima resistenza da 0 ohm a 1 ohm. Quindi imposta la tensione di ingresso su 0 e la tensione di uscita su 1 volt. Dopo aver simulato il flusso di corrente attraverso la rete, la resistenza di rete viene calcolata utilizzando la caduta di tensione sul primo resistore da 1 ohm.

A ciascun resistore vengono dati due numeri, il numero per il suo terminale sinistro e il numero per il suo terminale destro. Il terminale sinistro del resistore r è 2 * r e il suo terminale destro è 2 * r + 1. L'ingresso viene utilizzato per calcolare S, gli insiemi di terminali collegati tra loro. A ciascun terminale viene assegnata una tensione V[t]e viene rilassato aumentando la tensione se la corrente fluisce in rete in un set di terminali e abbassando la tensione se la corrente fluisce in rete.


2

(Questo è un commento, ma non posso fare arte ASCII in un vero commento ...)

Come viene immesso qualcosa di simile?

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

In particolare, a cosa sono collegati 3 e 4? 1 o 2 o entrambi 1 e 2?


Sia uno che due
lochok il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.