多少个分区仅包含完美正方形?


16

给定一个非负整数或一列数字,请通过将可能有前导零的平方数级联来确定以几种方式形成数字。

例子

input -> output # explanation
164 -> 2 # [16, 4], [1, 64]
101 -> 2 # [1, 01], [1, 0, 1]
100 -> 3 # [100], [1, 00], [1, 0, 0]
1 -> 1 # [1]
0 -> 1 # [0]
164900 -> 9 # [1, 64, 9, 0, 0], [1, 64, 9, 00], [1, 64, 900], [16, 4, 900], [16, 4, 9, 0, 0], [16, 4, 9, 00], [16, 49, 0, 0], [16, 49, 00], [16, 4900]

规则



我们可以将输入作为数字列表吗?
totallyhuman

为什么1-> 1但0-> 0?
乔纳

@Jonah Typo ... xD
HyperNeutrino

1
@totallyhuman当然。
HyperNeutrino

Answers:


7

Haskell,135个字节

s x=any((x==).(^2))[0..x]
c(a:b:x)=a*10+b:x
c x=x
h[x]=1>0
h x=(s.head)x
f x@(_:_:_)|y<-until h c x=f(tail y)+f(c y)
f x=sum[1|any s x]

在线尝试!

可能打得不好,但这是一个非常困难的问题


7

果冻,8 字节

ŒṖḌƲẠ€S

单数链接,获取数字列表并返回非负整数。

在线尝试!或查看测试套件

怎么样?

ŒṖḌƲẠ€S - Link: list of digits              e.g. [4,0,0,4]
ŒṖ       - all partitions                         [[4,0,0,4],[4,0,[0,4]],[4,[0,0],4],[4,[0,0,4]],[[4,0],0,4],[[4,0],[0,4]],[[4,0,0],4],[4,0,0,4]]
  Ḍ      - convert from decimal list (vectorises) [[4,0,0,4],[4,0,   4 ],[4,    0,4],[4,      4],[   40,0,4],[   40,    4],[    400,4],     4004]
   Ʋ    - is square? (vectorises)                [[1,1,1,1],[1,1,   1 ],[1,    1,1],[1,      1],[    0,1,1],[    0,    1],[      1,1],        0]
     Ạ€  - all truthy? for €ach                   [        1,          1,          1,          1           0,            0,          1,        0]
       S - sum                                    5

6

Haskell,88个字节

f x=sum[0.5|y<-mapM(\c->[[c],c:" "])x,all((`elem`map(^2)[0..read x]).read).words$id=<<y]

定义一个f接受字符串并返回浮点数的函数。非常慢。 在线尝试!

说明

我正在使用Haskell技巧来通过mapM和计算字符串的所有分区words。该代码段mapM(\c->[[c],c:" "])x用一个元素的字符串或两个元素的字符串替换'c'字符串的每个字符,并返回所有可能组合的列表。如果我采用其中一个结果,则将其连接起来并调用结果,它将在插入的空格处分割。通过这种方式,我可以获得连续子字符串的所有分区。然后,我只计算每个分区元素是一个完美正方形的结果(通过在列表中找到它)。需要注意的是,每个分区都被计数两次,带或不带尾随空格,因此我将x"c""c "ywordsmapMx[0,1,4,9,..,x^2]0.5s而不是1s; 这就是为什么结果类型是浮点数的原因。

f x=                       -- Define f x as
 sum[0.5|                  -- the sum of 0.5 for
  y<-                      -- every y drawn from
  mapM(\c->[[c],c:" "])x,  -- this list (explained above)
                           -- (y is a list of one- and two-element strings)
  all(...)                 -- such that every element of
                 id=<<y]   -- concatenated y
          .words$          -- split at spaces satisfies this:
                           -- (the element is a string)
   (...).read              -- if we convert it to integer
    `elem`                 -- it is an element of
    map(^2)                -- the squares of
    [0..read x]            -- the numbers in this list.


4

Python 3中148个 139 135 134字节

10个字节感谢Arnold Palmer。

def f(a):
 s=[a[:1]]
 for i in a[1:]:s=sum([[x+[i],x[:-1]+[x[-1]*10+i]]for x in s],[])
 return sum({n**.5%1for n in x}=={0}for x in s)

在线尝试!


我会仔细检查,但我相信它会起作用。 140个字符。
阿诺德·帕尔默

我很无聊,在%1和之间留了一个空隙for……
阿诺德·帕尔默

替换[[a[0]]][a[:1]]会节省一个字节
Arnold Palmer

我们在一起超越了Haskell。
Leaky Nun

最好的部分是,这要归功于套子,直到您昨天在我的乌龟答案上发布之前,我才用过它。
阿诺德·帕尔默

2

Mathematica,141个字节

Count[FreeQ[IntegerQ/@Sqrt[FromDigits/@#],1<0]&/@(FoldPairList[TakeDrop,s,#]&/@Flatten[Permutations/@IntegerPartitions[Length[s=#]],1]),1>0]&


输入(数字列表)

[{1,6,4}]


我想,这给出了1649错误的答案,我数三个分区,使广场(即{1,64,9}{16,4,9}{16,49}),但你的函数返回4
不是树

另外,我注意到您使用Table[(function of s[[i]]),{i,Length[s=(stuff)]}]了几次构造。你通常可以打下来到(function of #)&/@(stuff)
不是一棵树

1
@Notatree,您绝对正确!我进行了许多更改,按照您的指示进行操作,它就像一个魅力!谢谢
J42161217

2

Python 2中173个 163字节

lambda s:len([l for l in[''.join(sum(zip(s,[','*(n>>i&1)for i in range(len(s))]+['']),())).split(',')for n in range(2**~-len(s))]if {int(x)**.5%1for x in l}=={0}])

在线尝试!

编辑:由于ArnoldPalmer保存了10个字节


1
您可以使用.5代替来保存一个字节0.5吗?
numbermaniac

您可以。您也可以使用我在Leaky Nun的Python 3帖子中介绍的相同技巧来保存一些字节。另外,您的答案不是打印元素的数量,而是元素本身,因此我在其中添加了内容。如果要保留输出,则需要减去5个字节。 163字节
阿诺德·帕尔默

集合理解力不错,Arnold。
Chas Brown
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.