Apakah Sirkuit Mungkin?

9

Tulis sebuah program atau fungsi yang mengambil input: semua resistor tersedia dan nilai resistansi dan menampilkan nilai kebenaran apakah mungkin untuk mendapatkan resistansi dengan menggunakan resistor tersebut.

Aturan:

Format apa pun untuk input akan dilakukan.

Akan ada setidaknya 1 resistor yang tersedia dan program Anda akan menghasilkan setidaknya 10 resistor yang tersedia.

Resistansi semua resistor yang tersedia dan resistansi yang diperlukan akan berupa bilangan bulat positif.

Untuk resistor yang tersedia jika nilai fraksional juga dimungkinkan, resistansi yang diperlukan mungkin merupakan nilai yang diperkirakan. (Lihat contoh)

Output harus berupa 2 nilai unik untuk Kemungkinan dan Tidak mungkin.

Resistor dapat dihubungkan dengan cara apa pun.

Resistansi Seri : Untuk resistansi n dalam seri: Hasil = R1 + R2 + R3 + .... Rn

Resistansi Paralel : Untuk resistensi n secara paralel: Hasil = 1 / (1 / R1 + 1 / R2 + 1 / R3 + .... + 1 / Rn)

Sirkuit mungkin tidak memerlukan semua resistor untuk mendapatkan resistansi yang diperlukan (output True jika itu yang terjadi).

Pemenang:

Ini adalah kode-golf sehingga kode-pendek menang.

Contoh:

R     List
110   220,220 -> True
440   220,220 -> True
550   400,300 -> False
3000  1000,3000 -> True
750   1000,3000 -> True
333   1000,1000,1000 -> True (1000||1000||1000=333.333)
667   1000,1000,1000 -> True ((1000+1000)||1000=666.6666)
8000  1000,1000,7000 -> True 
190   100,200,333,344,221 -> True 
193   105,200,333,344,221 -> True
400   200,100 -> False

Penjelasan untuk dua contoh terakhir: /physics/22252/resistor-circuit-that-isnt-parallel-or-series

Vedant Kandoi
sumber
Tentang apa 3 3 1, 3 3 2?
l4m2
1.5 dibulatkan menjadi 2, resistensi yang diperlukan tidak akan diberikan 0 (ditambahkan ke pertanyaan), 3 3 akan benar
Vedant Kandoi
Tantangan yang bagus, tapi saya cukup berurusan dengan EE karena ...
Saya kira Machematica menang?
14m2
2
Masalah ini lebih sulit daripada deskripsi yang membuatnya terdengar karena rangkaian resistor umum tidak dapat dipecah secara rekursif menjadi bagian seri dan paralel, dengan cara yang lebih rumit daripada dua kasus uji terakhir. 10 resistor harus cukup mudah untuk dijadikan contoh. Saya menduga bahwa tidak ada jawaban yang diposting saat ini yang berfungsi secara umum, dan jawaban yang benar perlu memiliki inversi matriks dalam beberapa bentuk.
xnor

Jawaban:

1

Python 3 , 253 byte

import functools
def p(l): return functools.reduce(lambda z,x:z+[y+[x]for y in z],l,[[]])
print(l[-1:][0]in[round(a)for a in[sum(a)for a in p([sum(a)for a in p(l)]+[1/sum(c)for c in[[1/b for b in a if b!=0]for a in p(l).copy()]if sum(c)!=0])]])

Saya mengambil PowerSet dari semua nilai resistor dan kemudian menghitung jumlah untuk seri dan 1 / jumlah (1 / nilai) untuk paralel dan kemudian saya mengambil PowerSet dari dua set ini. Ketika Anda mengambil jumlah semua himpunan bagian dan memasukkannya ke dalam himpunan maka himpunan himpunan ini berisi nilai atau tidak. -> mengembalikan Benar / Salah

@stephen terima kasih :)

SimonSchuler
sumber
2
Selamat datang di PPCG! Jika Anda perlu impor, mereka harus dimasukkan dalam kode Anda. Selain itu, Anda perlu mengambil input sendiri, daripada mengasumsikan input dalam variabel. Juga, b != 0-> b!=0.
Stephen
Sebagai Stephen saod, Anda tidak dapat mengambil input melalui variabel yang ditentukan sebelumnya, jika tidak, ini adalah cuplikan, yang tidak diizinkan. Anda harus mengubahnya ke salah satu fungsi, atau program lengkap
Jo King
1
Ini tidak berfungsi untuk test case ketiga (juga, bermain golf sedikit dan dengan input yang tepat. Jika Anda khawatir saya memecahkan sesuatu, kode asli Anda juga tidak berfungsi)
Jo King
sial Aku akan melihat :(
SimonSchuler
1

Japt , 52 byte

à má

ÈÊ<2?X:X¯1 ïXÅgW @[X+Y1/(1/XÄ/Y]Ãc
mmW c mr øV

Cobalah!

Ini yang sulit, dan saya harus melakukan beberapa hal aneh untuk membuatnya bekerja. Saya tidak dapat membuktikan secara matematis bahwa ini bekerja untuk semuanya, tetapi ini berfungsi untuk semua test case dan juga test case tambahan yang saya usulkan . Secara khusus, saya tahu bahwa fungsi yang saya definisikan disebut Wmemberikan hasil yang berbeda tergantung pada urutan resistor dalam inputnya, jadi saya menjalankannya pada setiap kemungkinan pemesanan dari setiap kombinasi resistor yang mungkin. Saya juga tahu bahwa itu akan menghasilkan daftar resistensi yang mungkin dibuat menggunakan resistor input. Saya tidak tahu dengan kepastian 100% bahwa kedua hal bersama-sama berakhir dengan setiap kemungkinan perlawanan.

Penjelasan:

à       Get each combination e.g. [1,2,3] -> [[1,2,3],[1,2],[1,3],[2,3],[1],[2],[3]]
  m     For each combination...
   á    Get each order e.g. [1,2,3] -> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

    Skip a line to avoid overwriting the target resistance

È                                     Define a function W taking an array input X:
 Ê<2?X                                  If X is only 1 resistor, return it as-is
            XÅgW                        Get the resistances from applying W to the tail of X
       X¯1 ï                            Pair the first resistor with each possible tail resistance
                 @[            ]Ã       For each pair get these two values:
                   X+Y                    Those resistances in series
                      1/(1/XÄ/Y           Those resistances in parallel
                                 c      Collapse all those resistances into a single flat list

mmW            For each combination and order, get the resistances using W
    c          Collapse to a single list of resistances
      mr       Round each one
         øV    Return true if the target resistance is in the list, false otherwise
Kamil Drakari
sumber
0

Ruby , 153 byte

f=->v,r{[r]-v==[]||r[1]&&[*2..v.size].any?{|n|v.permutation.any?{|l|[l[0,n].sum,(1.0/l[0,n].reduce(0){|s,x|s+1.0/x}).round].any?{|b|f[l[n..-1]+[b],r]}}}}

Cobalah online!

Kasar. Saya sungguh-sungguh.

GB
sumber