这个问题是基于,A337517,最近的一个带有关键字“尼斯”的OEIS序列。
a(n)是由一个具有精确n单元电阻的电路产生的不同电阻的数目。
序列开始为1, 2, 4, 9, 23, 57, 151, 427, 1263, 3823, 11724, 36048, 110953, 342079
。
此挑战的目标是编写一个程序,该程序采用正整数n
,并输出可能由n单元电阻构成的电阻,这些电阻以分数(或浮动、有序对表示分数,或以另一种本质上类似的格式表示)编写,如下所示:
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 = 6在TIO上的输入。
1.
1.
1.
发布于 2020-11-08 00:09:49
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中由页脚输出)的结果:
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)])
https://codegolf.stackexchange.com/questions/214638
复制相似问题