Menghitung Resistance (Nerd Sniping)

10

Pegolf Sore yang Baik,

Tantangan kami untuk hari ini terinspirasi oleh komik XKCD 356 dan 370 . Kita akan menulis sebuah program untuk menghitung resistansi sekelompok resistor. Sebuah peringatan bahwa ini hampir cukup sulit untuk menjamin menjadi tantangan kode, namun saya pikir ada seni tertentu untuk menulis program yang sedikit lebih kompleks dalam format golf. Jumlah karakter terendah menang.

Menghitung hambatan bergantung pada dua rumus berikut:

  • Jika resistor dalam seri, resistansi adalah jumlah dari resistansi masing-masing resistor
  • Jika resistor secara paralel, resistansi adalah kebalikan dari jumlah kebalikan dari resistansi masing-masing resistor

Jadi - misalnya:

Contoh penghitungan hambatan

Tantangan Anda adalah, dalam jumlah karakter seminimal mungkin, menghitung hambatan grup hingga 64 resistor. Saya minta maaf atas kerumitannya, terutama aturan input. Saya telah berusaha mendefinisikannya sedemikian rupa sehingga setiap bahasa dapat digunakan.

  • Setiap resistor akan terhubung ke 2 atau lebih resistor lainnya.

  • Input dijamin valid, dengan hanya satu entri dan satu titik keluar, yang akan terhubung

  • Jaringan akan seri-paralel untuk mencegah membutuhkan lebih banyak matematika dari apa yang disajikan

  • Masukan akan melalui file, argumen atau stdin, tergantung pada apa yang sesuai untuk bahasa Anda.

  • Input akan terdiri dari serangkaian pernyataan terpisah garis baru atau garis miring ke depan yang terdiri dari bilangan bulat dari resistor, dan spasi yang memisahkan ID dari resistor yang terhubung dengan satu sisi resistor.

  • ID dari resistor pertama adalah 1, bertambah satu untuk setiap resistor berturut-turut

  • Awal akan selalu memiliki ID 0

  • Resistor terakhir akan selalu memiliki hambatan 0 ohm, dan hanya memiliki koneksi yang ditentukan pada garisnya

Sebagai contoh:

Contoh 2

Dapat direpresentasikan sebagai

3 0
6 1
1 0
5 0
0 2 3 4
  • Output bisa ke stdout atau file. Itu dapat diwakili dalam salah satu cara berikut:
    • Angka dengan minimal 2 tempat desimal, diikuti oleh baris baru
    • Sebagian kecil yang terdiri dari integer (pembilang), garis miring ke depan dan bilangan bulat lainnya (penyebut), diikuti oleh baris baru. Fraksi tidak harus dalam bentuk terendah - 4/4 atau 10/8, misalnya dapat diterima. Fraksi harus akurat dalam 1/100. Tidak ada bonus untuk menjadi sangat akurat - ini disediakan adalah penopang untuk memungkinkan bahasa tanpa operasi fixed atau floating point untuk bersaing.

Saya harap itu mencakup semua poin. Semoga berhasil!

lochok
sumber
/bukan backslash. Apakah maksud Anda `\` atau garis miring?
John Dvorak
Apakah kami diizinkan untuk menghasilkan hasil yang salah jika inputnya bukan jaringan seri-paralel?
John Dvorak
1
yang jembatan Wheatstone tidak seri-paralel jika Anda mengganti voltmeter pusat dengan resistor
John Dvorak
1
akankah resistor selalu menghubungkan mereka dengan ID yang lebih rendah atau mereka dapat dimasukkan dalam urutan apa pun? Apakah 1 2/1 0/0 1valid
John Dvorak
9
Contoh paralelnya salah. Itu harus 15/23, bukan 15/8.
Peter Taylor

Jawaban:

6

APL 190

Asal indeks 1. Loop pertama menggabungkan semua resistor yang terhubung seri, kedua (p) yang terhubung secara paralel dan mengulang ke loop pertama untuk menggabungkan resistor paralel yang sekarang dalam seri. Spesifikasi dari resistor nol akhir nampak berlebihan.

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

Diuji atas contoh-contoh dalam pertanyaan plus yang sedikit lebih rumit:

      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
sumber
Selalu kagum dengan jawaban APL - mereka terlihat benar-benar gila. Resistor terakhir hanya untuk memberikan sesuatu untuk resistor lain untuk terhubung - link akhir tiruan. Sudah selesai dilakukan dengan baik!
lochok
Saya pikir Anda dapat menyimpan beberapa karakter. Ganti dua baris pertama dengan o←⊃↑¨r←¯1↓⍎¨(c≠'/')⊂c. Pola ini berlaku di beberapa tempat.
FUZxxl
5

Python, 329 karakter

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

Hitung resistansi dengan melakukan relaksasi tegangan pada sirkuit. Pertama, ia menekan resistor 1 ohm ke awal dan mengubah resistor terakhir dari 0 ohm menjadi 1 ohm. Kemudian mengatur tegangan input ke 0 dan tegangan output ke 1 volt. Setelah mensimulasikan aliran arus melalui jaringan, resistansi jaringan dihitung menggunakan penurunan tegangan pada resistor 1 ohm pertama.

Setiap resistor diberi dua angka, nomor untuk terminal kiri dan nomor untuk terminal kanannya. Terminal kiri resistor r adalah 2 * r dan terminal kanannya adalah 2 * r + 1. Input digunakan untuk menghitung S, set terminal yang terhubung bersama. Setiap terminal diberi tegangan V[t]dan relaksasi dilakukan dengan menaikkan tegangan jika arus mengalir ke terminal dan menurunkan tegangan jika arus mengalir keluar.

Keith Randall
sumber
2

(Ini komentar, tapi aku tidak bisa melakukan ascii art dalam komentar sungguhan ...)

Bagaimana hal seperti ini diinput?

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

Secara khusus, apa yang terhubung dengan 3 dan 4? 1 atau 2, atau keduanya 1 dan 2?

Keith Randall
sumber
Baik satu dan dua
lochok