首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >完美车牌

完美车牌
EN

Code Golf用户
提问于 2017-04-03 04:38:22
回答 3查看 2K关注 0票数 33

完美牌照

从几年前开始,我在开车时做了一个小游戏:检查附近的车牌是否“完美”。这是相对罕见的,但当你找到一个令人兴奋的。

要检查车牌是否完美:

  1. 用A= 1,B= 2,.Z= 26。
  2. 取每一个连续的数字块,并与它们相加;将这些和相乘在一起。

如果第1部分和第2部分中的值相等,祝贺您!你找到了一个完美的车牌!

示例

代码语言:javascript
运行
复制
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%地理解它们的正确性,哈哈)

代码语言:javascript
运行
复制
N < 2: 0
N = 2: 18
N = 3: 355
N = 4: 8012 

Notes

如果它在某种程度上使问题在您的语言中变得更简单,您可以输出给定N的完美车牌的比例,使其至少达到2位有效数字。

代码语言:javascript
运行
复制
N < 2: 0
N = 2: 0.0138888...
N = 3: 0.0076088...
N = 4: 0.0047701...

或者,您可以输出等效值mod 256。

代码语言:javascript
运行
复制
N < 2: 0
N = 2: 18
N = 3: 99
N = 4: 76

最短的胜利!

EN

回答 3

Code Golf用户

发布于 2017-04-04 02:45:00

Python3.6,150个字节

代码语言:javascript
运行
复制
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

结果:

代码语言:javascript
运行
复制
f(2) = 18
f(3) = 355
f(4) = 8012
f(5) = 218153

附解释的非高尔夫版本:

代码语言:javascript
运行
复制
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个字母)。该函数对树进行递归搜索,将数字和字母的值进行累加。

代码语言:javascript
运行
复制
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循环转换为发电机和:

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
sum(f(n-1, *args) for c in range(-26, 10)),

args在哪里:

代码语言:javascript
运行
复制
((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,缩短变量名,并简化表达式。

票数 9
EN

Code Golf用户

发布于 2017-04-07 09:52:13

[化]双模拟,71字节

全程序体。N N≥4的提示需要大量的内存和计算。

代码语言:javascript
运行
复制
+/((+/⊢⍳∩)∘⎕A=(×/'\d+'⎕S{+/⍎¨⍵.Match}))¨l/⍨∧⌿∨/¨c∘.∊l←,(∊c←⎕D⎕A)∘.,⍣⎕⊂⍬

在网上试试!

票数 3
EN

Code Golf用户

发布于 2017-09-05 10:54:34

Pyth,55字节

代码语言:javascript
运行
复制
FNQI<xrG1N0=+ZsN).?=+YZ=Z0;qu*G?HH1Y1sm?<xrG1d00hxrG1dQ
票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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