pengantar
Ketika membangun sebuah proyek elektronik, sebuah skema mungkin memerlukan resistor dengan nilai yang tidak biasa (katakanlah, 510 ohm). Anda memeriksa nampan bagian Anda dan menemukan bahwa Anda tidak memiliki resistor 510-ohm. Tetapi Anda memiliki banyak nilai umum di atas dan di bawah nilai ini. Dengan menggabungkan resistor secara paralel dan seri, Anda harus dapat memperkirakan resistor 510-ohm dengan cukup baik.
Tugas
Anda harus menulis fungsi atau program yang menerima daftar nilai-nilai resistor (resistor yang Anda stok) dan nilai target (yang Anda perkirakan merupakan perkiraan). Program harus mempertimbangkan:
- Resistor individu
- Dua resistor secara seri
- Dua resistor secara paralel
Program harus menghitung semua kombinasi yang mungkin dari resistor 1 dan 2 dari daftar stok (termasuk dua salinan dari nilai resistor yang sama), menghitung hambatan seri dan paralelnya, kemudian mengurutkan konfigurasi berdasarkan seberapa baik mereka memperkirakan nilai target.
Format output harus berupa satu konfigurasi per baris, dengan +
seri yang |
menunjukkan dan paralel yang menunjukkan, dan beberapa spasi atau tanda = sebelum resistansi bersih.
Formula
- Resistansi satu resistor adalah
R1
- Resistansi bersih dari dua resistor secara seri adalah
R1 + R2
- Resistansi bersih dua resistor secara paralel adalah
1 / (1/R1 + 1/R2)
- Jarak antara nilai resistansi didekati dan nilai target dapat dihitung sebagai jarak pseudo-logaritmik, tidak linear jarak:
dist = abs(Rapprox / Rtarget - 1)
. Misalnya, 200 lebih dekat ke 350 daripada ke 100. - Ukuran jarak yang lebih baik adalah jarak logaritmik yang sebenarnya
dist = abs(log(Rapprox/Rtarget))
, tetapi karena ini tidak ditentukan dalam pertanyaan asli, Anda bebas untuk menggunakan pengukuran mana pun.
Mencetak gol
Skor diukur dalam karakter kode, per aturan golf biasa. Skor terendah menang.
Contoh
Kami memiliki resistor berikut dalam stok [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700]
dan ingin menargetkan 510
ohm. Program harus menghasilkan 143 konfigurasi, kira-kira seperti yang ditunjukkan (Anda dapat mengubah format, tetapi pastikan artinya mudah ditentukan):
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.
Dalam contoh ini, perkiraan terbaik 510 ohm diberikan oleh resistor 680- dan 2200-ohm secara paralel.
Terbaik dari setiap bahasa sejauh ini (1 Juni 2014):
- J - 70 char
- APL - 102 char
- Mathematica - 122 char
- Ruby - 154 char
- Javascript - 156 char
- Julia - 163 char
- Perl - 185 char
- Python - 270 char
Jawaban:
J -
867170 charSaya tidak akan repot-repot menjelaskan setiap detail kecil karena banyak kode dihabiskan untuk menyinkronkan hasil dari fungsi yang berbeda, tapi inilah inti dari golf:
;@((<@,.{:)\)
memungkinkan setiap pasangan resistor, untuk dihubungkan baik secara paralel maupun seri.[:,/(<,.+`|,.+/;+&.%/)"1@
kemudian menghubungkannya, secara paralel dan seri, membuat daftar besar kemungkinan koneksi.(;a:,<)"0,
menambahkan kemungkinan menggunakan hanya satu resistor dengan sendirinya untuk perkiraan.(]/:[|@<:@%~2{::"1])
mengurutkan daftar kombinasi resistor dengan jarak pseudolog (|@<:@%
) antara target dan resistansi yang dihasilkan dari setiap kombinasi.Dan inilah cara menggunakannya:
Anda tidak hanya harus melihat 10 pertama seperti yang saya lakukan di atas, tetapi ini adalah fungsi dan J REPL memotong nilai pengembalian yang sangat besar, dan output penuh untuk contoh ini memiliki 287 baris. Anda dapat memaksakan semuanya untuk STDOUT dengan sesuatu seperti
tmoutput toCRLF , LF ,.~ ": blah rouv blah
pada Windows — jatuhkantoCRLF
pada Linux — tetapirouv
merupakan fungsi dan secara internal, semua baris ada.catatan:
Pertanyaannya sepertinya telah diubah tepat di bawah hidung kita, dan sekarang jarak log didefinisikan sebagai
abs(log(Rapprox/Rtarget))
bukanabs(Rapprox/Rtarget-1)
. Untuk memperbaikinya di golf saya, kita dapat mengubah|@<:@%
to|@^.@%
:<:
is Decrement while^.
is Logarithm.sumber
Mathematica,
151122 karakterMengharapkan resistansi target untuk disimpan
r
dan daftar resistor yang tersedia dil
.Lebih sedikit golf:
Format output berbeda dari yang disarankan tetapi konfigurasi mudah ditentukan. Outputnya adalah daftar konfigurasi. Setiap konfigurasi adalah salah satu dari bentuk berikut:
Jadi tiga elemen pertama dari keluaran dibaca
Jika Anda baik-baik saja dengan angka rasional, saya dapat menyimpan dua karakter dari menghilangkan
N@
. Artinya, elemen pertama (misalnya) akan dikembalikan sebagai4675/9
ganti519.444
.sumber
APL (102)
Ini mengambil target perlawanan sebagai argumen kiri dan daftar resistor yang tersedia sebagai argumen yang tepat.
Penjelasan:
V←{
...}
:V
adalah fungsi yang:Z/⍨≤/¨Z←,∘.,⍨⍵
: menemukan setiap kombinasi unik dari dua nilai di⍵
,Z←,∘.,⍨⍵
: gabungkan setiap nilai⍵
dengan setiap nilai dalam⍵
, simpan dalamZ
,Z/⍨≤/¨Z
: pilih dariZ
kombinasi di mana nilai pertama kurang dari atau sama dengan nilai kedua⍺{
...}⍺⍺/¨
: dan kemudian menerapkan fungsi berikut, diikat dengan fungsi kiri (⍺⍺
) di sebelah kanan dan argumen kiri (⍺
) di sebelah kiri, untuk setiap pasangan:⍺,⍺⍺,⍵,'=',⍺⍵⍵⍵
, argumen kiri, diikuti oleh argumen terikat kiri, diikuti oleh argumen kanan, diikuti oleh=
, diikuti oleh fungsi kanan (⍵⍵
) diterapkan pada kedua argumen. (Ini adalah fungsi pemformatanX [configuration] Y [equals] (X [fn] Y)
,.)⊃¨
: dan kemudian hapus kotak setiap elemen.{⍵,' =',⍵}¨⍵
: untuk setiap elemen⍵
, buat konfigurasi untuk masing-masing resistor. (⍵
, tidak ada, tidak ada=
,,⍵
).('+'+V⍵)
: gunakanV
fungsi untuk membuat semua konfigurasi serial (karakter adalah'+'
dan fungsi+
).'|'{÷+/÷⍺⍵}V⍵
: gunakanV
fungsi untuk membuat semua konfigurasi paralel (karakter adalah'|'
dan fungsinya adalah{÷+/÷⍺⍵}
, kebalikan dari jumlah invers argumen).K←↑
: buat ini menjadi matriks dan simpan diK
.0 4↓K
: jatuhkan 4 kolom pertama dariK
, hanya menyisakan nilai resistansi.|¯1+⍺÷⍨
: hitung jarak antara⍺
dan setiap konfigurasi.K[⍋
...;]
: urutkanK
berdasarkan jarak.sumber
510 code_here 100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700
⍎
), I / O (⎕
), atau variabel sistem apa pun (bahkan⎕UCS
dan⎕A
tidak berfungsi) sehingga sebagian besar program APL tidak akan berjalan. Ini benar-benar akan memberikan SYNTAX ERROR jika salah satu fungsi yang dinonaktifkan digunakan. Fakta bahwa ini terjadi tidak menggunakan salah satu dari banyak fungsi yang tidak didukung TryAPL, adalah suatu kebetulan.Python 3 -
250247270 byteJalankan seperti ini:
(yaitu, daftar resistor yang dibatasi ruang, dengan nilai target di akhir)
Keluaran:
Saya akan mengatakan bahwa keluaran, katakan,Tidak bisa diterima Biaya saya byte. Sekarang saya mengurutkan tuple sebelum melemparkannya ke set, jika tidak solusinya identik.680|2200
dan2200|680
secara terpisah masih cukup jelas. Jika ini tidak dapat diterima, saya dapat mengubahnya, tetapi akan dikenakan biaya byte.sumber
import sys;r=sys.args[1:]
, gunakanr=input().split()
dan katakan bahwa Anda harus memberikan nilai pada stdin. Akhirnya: Anda menggunakan1/sum(1/int(n)for n in b)
bukan1/sum(map(lambda n:1/int(n),b)
. Semua dalam semua, itu harusnya 274 karakterRuby 2.1,
156154 byteTidak Disatukan:
Apa fungsinya:
e
dalama
;a
, komputasi nilai-nilai tunggal, seri, dan paralel sebagai kunci untuk nilai-nilai cetak dalam hashc
;z
untuk setiap kuncic
; dan,e[1]
untuk setiap tombole[0]
dic
, mencetake[1]=e[0]
.Penggunaan sampel:
s[[100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700], 510]
Output sampel:
sumber
JavaScript (ECMAScript 6) - 186 Karakter
Memasukkan:
R
kekuatan resistor; danT
, target perlawanan.Keluaran:
Array array (diurutkan berdasarkan jarak dari
T
) masing-masing berisi:p
,s
atau 0 jika resistor paralel, seri atau soliter; danPenjelasan:
sumber
Julia -
179163 byteIni berfungsi sama dengan versi lama, tetapi argumen dalam pernyataan cetak telah diatur sedikit berbeda untuk mengurangi jumlah tanda kurung siku yang diperlukan. Menghemat 4 byte Menyerap penciptaan vektor spasi ke dalam argumen cetak menghemat 2 byte tambahan. Itu juga telah beralih dari menggunakan "menemukan" untuk mendapatkan indeks yang relevan untuk menggunakan bentuk logis. Menghemat 6 byte. Menyerap perhitungan vektor indeks ke dalam penyesuaian A disimpan 2 byte lagi. Akhirnya, mengganti endof (v) dengan jumlah (v) disimpan 2 byte lebih. Total penghematan: 16 byte.
Versi lama:
Dalam fungsi, inilah yang dilakukannya:
Output sampel:
sumber
Javascript (E6) 156
162 164 186Edit Terakhir Dengan asumsi semua nilai resistor> 0, Anda dapat menggunakannya untuk kondisi loop
Penggunaan:
F(510, [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700])
Tidak disatukan
sumber
Javascript, 248 byte
Penggunaan:
r(510, [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700]);
Keluaran
sumber
Perl,
213199185 byte213 byte:
199 byte:
185 byte:
Lewati semua resistor yang tersedia sebagai argumen. Target perlawanan harus menjadi yang terakhir:
Bagaimana cara kerjanya (kode lama)
Tentukan subrutin
S
danP
untuk menghitung nilai penjumlahan dan paralel dari dua resistor.Setel
$"
ke "," untuk menginterpolasi@ARGV
di dalamglob
operator<{S,P}({@i},{@i})= S({@i})=>
menghasilkan cartesian dari semua kemungkinan:S (100.100), S (100.150), S (100.220), ... P (100.100), P (100.150) ... S (100), S (150) ...
Gabungkan
s///ee
dengangrep
untuk mengevaluasi resistensi yang setara dan menyaring pengulangan yang tidak diinginkan (dilakukan oleh(??{$2<$3})
dan/\d$/
sort
oleh kebugaran dihitung dalam subrutint
Perubahan kode baru
Hindari penggunaan
s///ee
, gunakan regex yang lebih pendek dengan pemeriksaan bersyarat daneval
di dalamgrep
Ganti pengulangan dari
"{@i}" with
$ i`Perkenalkan
$x
,$y
alih-alih$2
,$3
Menggantikan
split/=/,pop
dengan$_[0]=~s!!!r
Tidak perlu untuk tertinggal
;
eval;
setara denganeval $_;
Tambahkan
=
bersamaeval
-ed jawaban alih-alih mendeklarasikannya di depanKeluaran:
P
mewakili resistor secara paralel,S
mewakili resistor secara seri.sumber
S(100)=100
danS(1000)=1000
.