Perl,39 37 42 39 +1 = 40字节
使用一种新方法,我设法减少了大量字节。与-n
标志一起运行。在运行时反复接受输入,相应地打印0或1。
我必须添加5个字节,因为我意识到没有它,该代码适用于1234567900987654321之类的输入,这不是吉萨编号。由于吉萨棉数字永远不会包含数字0(并且所有假阳性必然会包含数字0),因此这5个字节说明了这一点。
say!/0/*($_- s/..?/1/gr**2)=~/^(.)\1*$/
说明:
say!/0/*($_- s/..?/1/gr**2)=~/^(.)\1*$/ #$_ contains input by default.
!/0/ #Ensure that the initial text doesn't contain the number 0
* #Since both halves of this line return either 0 or 1, multiplying them together only yields 1 if both are true (which we want).
s/ / /gr #Perform a substitution regex on $_ (see below)
#/g means keep replacing, /r means don't modify original string; return the result instead
..? #Replace 1 or 2 characters (2, if possible)...
1 #...with the number 1
**2 #Square this number...
($_- ) #...and subtract it from the input
=~ #Do a regex match on the result
/^ $/ #Make sure the regex matches the WHOLE string
(.) #Match any character...
\1* #...followed by itself 0 or more times
say #Finally, output the result of the whole line of code.
替换正则表达式的目的是构造一个1的字符串,其长度是输入长度的一半,四舍五入。因此,输入12321
会产生字符串111
,然后将其平方(下面的解释)。偶数长度的输入将产生的字符串太小,无法确保最终的正则表达式成功。
该代码起作用的原因是由于以下原因:
1 = 1**2
121 = 11**2
12321 = 111**2
1234321 = 1111**2
123454321 = 11111**2
12345654321 = 111111**2
1234567654321 = 1111111**2
123456787654321 = 11111111**2
12345678987654321 = 111111111**2
我们可以清楚地看到,RHS中1的数目等于LHS大小的一半的1/2以上。(如果我们截断则再多1个)。另外:
567898765-123454321 = 444444444,仅重复4次。因此,当我们从数字中减去平方时,如果得到一个位数,则原始数字为吉萨数。
旧代码和旧方法(58 +1 = 59字节)
@Dada节省了1个字节
运行带有-n
标志的管道,使用echo
say$_==($;=join"",/(.)/..($==y///c/2+/(.)/)-1).$=.reverse$
计算由长度和前导整数确定的唯一吉萨棉编号,并查看它是否与输入匹配。
如果它是Giza编号,则作为echo -n "123454321" | perl -M5.010 -n giza.pl
Return 运行1
,否则返回null。