首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单位电阻总电阻

单位电阻总电阻
EN

Code Golf用户
提问于 2020-11-03 00:51:47
回答 1查看 508关注 0票数 16

这个问题是基于,A337517,最近的一个带有关键字“尼斯”的OEIS序列。

a(n)是由一个具有精确n单元电阻的电路产生的不同电阻的数目。

序列开始为1, 2, 4, 9, 23, 57, 151, 427, 1263, 3823, 11724, 36048, 110953, 342079

此挑战的目标是编写一个程序,该程序采用正整数n,并输出可能由n单元电阻构成的电阻,这些电阻以分数(或浮动、有序对表示分数,或以另一种本质上类似的格式表示)编写,如下所示:

代码语言:javascript
运行
复制
f(3) = [3/1, 3/2, 2/3, 1/3] 
     = [(3,1), (3,2), (2,3), (1,3)] 
     = [[3,1], [3,2], [2,3], [1,3]]

这是一个密码-高尔夫挑战,所以最短的代码获胜。您的程序需要能够处理n = 6TIO上的输入。

示例

  • 对于n = 1电阻,唯一的可能是一个具有1 \Omega总电阻的电路。
  • 对于n = 2电阻,只有a(2) = 2的可能性:
    1. 电阻按顺序排列,产生2 \Omega总电阻。
    2. 电阻器并联,产生\frac 12 \Omega总电阻。

  • 对于n = 3电阻,存在着电阻3 \Omega, \frac 32 \Omega, \frac 23 \Omega\frac 13 \Omega:的a(3) = 4可能性。

代码语言:javascript
运行
复制
1. ​
代码语言:javascript
运行
复制
1. ​
代码语言:javascript
运行
复制
1. ​
EN

回答 1

Code Golf用户

回答已采纳

发布于 2020-11-08 00:09:49

Python 2,734字节

代码语言:javascript
运行
复制
import fractions as F,itertools as I
r=range
s=set
P=lambda G,p=[0]:[x for a,b in G if(p[-1]==a)*(1-(b in p))for x in(P(G,p+[b])if b-1else[p+[b]])]
def R(G):
 G+=tuple((b,a)for a,b in G);B=s(b for a,b in G);n=1+max(B)
 if s(G)-s(x for p in P(G)for e in zip(p,p[1:])for x in[e,e[::-1]])or len(B)-n:return 0
 M=[[0]*(n+1)for _ in B];M[0][0],M[0][n],M[1][1]=[F.Fraction(1)]*3
 for a,b in G:M[a][a]+=a>1;M[a][b]-=a>1
 for i in r(n):
	for j in r(i,n):
	 if M[j][i]:break
	M[i],M[j]=M[j],M[i];M[i]=[x/M[i][i]for x in M[i]]
	for j in r(n):M[j]=[a-(j!=i)*b*M[j][i]for a,b in zip(M[j],M[i])]
 return 1/sum(M[a][n]-M[b][n]for a,b in G if a==0)
f=lambda n:s(map(R,I.combinations_with_replacement([(a,b)for a in r(n)for b in r(a,n+1)],n)))-s([0])

在网上试试!

我可能错过了很多打高尔夫球的机会,但至少还不到1000个字节!我本可以使用SymPy来减少行,但是转而使用纯python的答案。

图表示为边的列表。

P生成从顶点0到1的所有路径,用于确定是否有任何电阻器未使用(如果它们没有出现在任何路径中)。

R接受一个图并返回顶点0和1之间的电阻,如果图无效则返回0 (它有未使用的边/电阻或未使用的顶点)。它通过求解每个顶点的电压线性方程组来实现这一点。

f枚举所有图并以set的形式生成不同的电阻。从无效图中删除0

以下是1到6(在TIO中由页脚输出)的结果:

代码语言:javascript
运行
复制
f(1) = set([Fraction(1, 1)])
f(2) = set([Fraction(1, 2), Fraction(2, 1)])
f(3) = set([Fraction(3, 2), Fraction(3, 1), Fraction(1, 3), Fraction(2, 3)])
f(4) = set([Fraction(1, 4), Fraction(3, 4), Fraction(4, 1), Fraction(5, 2), Fraction(1, 1), Fraction(4, 3), Fraction(2, 5), Fraction(3, 5), Fraction(5, 3)])
f(5) = set([Fraction(3, 8), Fraction(7, 4), Fraction(4, 7), Fraction(5, 1), Fraction(5, 8), Fraction(7, 3), Fraction(5, 6), Fraction(2, 1), Fraction(3, 7), Fraction(8, 5), Fraction(1, 2), Fraction(6, 7), Fraction(7, 6), Fraction(1, 5), Fraction(1, 1), Fraction(5, 4), Fraction(4, 5), Fraction(7, 5), Fraction(6, 5), Fraction(7, 2), Fraction(2, 7), Fraction(8, 3), Fraction(5, 7)])
f(6) = set([Fraction(1, 2), Fraction(5, 9), Fraction(2, 1), Fraction(1, 3), Fraction(8, 13), Fraction(6, 1), Fraction(1, 1), Fraction(7, 12), Fraction(3, 11), Fraction(13, 5), Fraction(12, 5), Fraction(3, 1), Fraction(1, 6), Fraction(7, 11), Fraction(10, 3), Fraction(3, 4), Fraction(11, 13), Fraction(11, 10), Fraction(4, 9), Fraction(2, 9), Fraction(11, 5), Fraction(10, 7), Fraction(3, 10), Fraction(5, 6), Fraction(3, 2), Fraction(13, 7), Fraction(13, 11), Fraction(7, 10), Fraction(7, 9), Fraction(13, 8), Fraction(10, 9), Fraction(5, 4), Fraction(11, 8), Fraction(5, 11), Fraction(4, 5), Fraction(8, 11), Fraction(6, 11), Fraction(5, 13), Fraction(9, 10), Fraction(2, 3), Fraction(11, 4), Fraction(6, 5), Fraction(9, 4), Fraction(11, 7), Fraction(7, 13), Fraction(13, 6), Fraction(11, 3), Fraction(4, 3), Fraction(6, 13), Fraction(12, 7), Fraction(9, 5), Fraction(10, 11), Fraction(9, 7), Fraction(9, 2), Fraction(5, 12), Fraction(11, 6), Fraction(4, 11)])
票数 9
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/214638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档