这是受2016 ARML竞赛团队问题#6的启发。
这是挑战:
您将获得一个“通配符序列”,它是一个数字序列和另一个字符。字符串通过以下伪代码匹配此通配符序列:
w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]
哪里?是您选择的角色。
就正则表达式而言,只需想象'?'
是'.'
。
挑战在于找到所有十进制字符串表示形式都与该通配符序列匹配的平方数(要求最大为100万)。很明显,“通配符”可以是您选择的任何ASCII字符,只要它不是数字即可。
例如,4096
匹配4**6
和,4*9*
但4114
都不匹配。
输入项
输入将作为与regex匹配的序列给出[0-9?]+
。它可以是ASCII字符的字符串,字符数组或字节数组。
输出量
输出将是一个任意分隔的数字列表/集合/数组,它们是完美的平方并与通配符序列匹配。
有效输入的示例:
1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]
有效输出示例:
[1, 4, 9]
1 4 9
1, 4, 9
1-4-9
等等
技术指标
- 您可能无法使用内置函数来查找特定范围内的正方形列表
- 适用标准漏洞
- 您必须能够处理1000000(100万)
- 如果提供输入
1******
,则打印正确[1000000]
。打印也正确[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
- 通配符序列永远不会以通配符开头;也就是说,它们将始终匹配相同长度的字符串。
测试用例
4**6 -> [4096, 4356]
1**1 -> [1521, 1681]
1** -> [100, 121, 144, 169, 196]
9****9 -> [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9*** -> [919681, 929296]
1**0* -> [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4 -> [91204, 94864, 97344]
获奖
最短(有效)(有效)提交截止日期为2月14日,并以最早提交的获胜者打破平局。
25
有效答案,***
而不是*2*
?
{4, "w", "w", 6}
(或更好{4, w, w, 6}
)),而不是一个字符数组(如{"4", "w", "w", "6"}
?)?
?
答案者要选择的内容。