从几年前开始,我在开车时做了一个小游戏:检查附近的车牌是否“完美”。这是相对罕见的,但当你找到一个令人兴奋的。
要检查车牌是否完美:
如果第1部分和第2部分中的值相等,祝贺您!你找到了一个完美的车牌!
License plate: AB3C4F
Digits -> 3 * 4
= 12
Chars -> A + B + C + F
= 1 + 2 + 3 + 6
= 12
12 == 12 -> perfect!
License plate: G34Z7T
Digits -> (3 + 4) * 7
= 49
Chars -> G + Z + T
= 7 + 26 + 20
= 53
49 != 53 -> not perfect!
License plate: 10G61
Digits -> (1 + 0) * (6 + 1)
= 7
Chars -> G
= 7
7 == 7 -> perfect!
挑战
我以5和6的车牌为例,但这个程序对任何车牌长度都是有效的。您的挑战是,对于给定的长度N,返回该长度的完美车牌数。就质询而言,有效的车牌是数字0-9和字符and的任意组合。版面必须同时包含一个字符和一个数字,才能被认为是完美的。为了检查目的,下面是我得到的值(尽管我不能100%地理解它们的正确性,哈哈)
N < 2: 0
N = 2: 18
N = 3: 355
N = 4: 8012
如果它在某种程度上使问题在您的语言中变得更简单,您可以输出给定N的完美车牌的比例,使其至少达到2位有效数字。
N < 2: 0
N = 2: 0.0138888...
N = 3: 0.0076088...
N = 4: 0.0047701...
或者,您可以输出等效值mod 256。
N < 2: 0
N = 2: 18
N = 3: 99
N = 4: 76
最短的胜利!
发布于 2017-04-04 02:45:00
f=lambda n,t=-1,p=-1,a=0:sum(f(n-1,*((t,c+p*(p>=0),a),((t<0 or t)*(p<0 or p),-1,a-c))[c<0])for c in range(-26,10))if n else 0<(t<0 or t)*(p<0 or p)==a
结果:
f(2) = 18
f(3) = 355
f(4) = 8012
f(5) = 218153
附解释的非高尔夫版本:
digits=[*range(10)]
letters=[*range(1,27)]
def f(n, dt=-1, dp=-1, lt=0):
if n:
for d in digits:
yield from f(n - 1,
dt,
d if dp < 0 else dp + d,
lt
)
for l in letters:
yield from f(n - 1,
dp if dt < 0 else dt if dp < 0 else dt*dp,
-1,
lt + l
)
else:
yield 0 < lt == (dt<0 or dt)*(dp<0 or dp)
问题归结为搜索一棵树,其中树的每一层对应于车牌号码中的一个位置,每个节点有36个子节点(10个数字和26个字母)。该函数对树进行递归搜索,将数字和字母的值进行累加。
n is the number of levels to search.
dp accumulates the sum of a group of digits.
dt accumulates the product of the digit sums.
lt accumulates the sum of the letter values.
For dp and dt, a value < 0 indicates it is not initialized.
高尔夫包括,将for循环转换为发电机和:
sum(f(n-1,
dt,
d if dp < 0 else dp + d,
lt) for d in digits)
+
sum(f(n-1,
dp if dt<0 else dt if dp<0 else dt*dp,
-1,
lt+l) for l in letters)
然后把发电机组合起来。将字母,A到Z,as -1到-26,数字编码为0到9。
sum(f(n-1, *args) for c in range(-26, 10)),
args在哪里:
((dp if dt<0 else dt if dp<0 else dt*dp, -1, lt-l) if c <0 else
(dt, d if dp<0 else dp+d, lt))
剩下的工作是将函数转换为lambda,缩短变量名,并简化表达式。
发布于 2017-04-07 09:52:13
发布于 2017-09-05 10:54:34
FNQI<xrG1N0=+ZsN).?=+YZ=Z0;qu*G?HH1Y1sm?<xrG1d00hxrG1dQ
https://codegolf.stackexchange.com/questions/115007
复制相似问题