完全な正方形のみを含むパーティションはいくつありますか?


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]

ルール

  • 標準的な抜け穴が適用されます
  • これはので、バイト単位の最短回答が勝ちます


入力を数字のリストとして受け取ることはできますか?
完全に人間

なぜ1-> 1だが0-> 0なのか?
ジョナ

@ジョナタイポ... xD
HyperNeutrino

1
@totallyhuman確かに。
ハイパーニュートリノ

回答:



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'、文字列のすべての文字をx1要素文字列"c"または2 要素文字列のいずれかに置き換え"c "、可能なすべての組み合わせのリストを返します。結果の1つを取得しy、それを連結wordsして結果を呼び出すと、で挿入されたスペースで分割されmapMます。この方法で、すべてのパーティションを取得xして、連続するサブストリングにします。次に、各パーティション要素が完全な正方形である結果を数えます(リストで見つけます[0,1,4,9,..,x^2])。警告は、各パーティションが2回カウントされることです。末尾のスペースがある場合とない場合があるため、0.5sの代わりに1s。これが、結果の型がfloatである理由です。

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の3148の 139 135 134バイト

Arnold Palmerのおかげで10バイト。

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文字。
アーノルドパーマー

私はgoofedとの間にスペースを左%1for...
アーノルド・パーマー

に置き換える[[a[0]]][a[:1]]バイトが節約されます
アーノルドパーマー

一緒になってHaskellを凌gしました。
リーキー修道女

最良の部分は、昨日私の亀の答えに投稿するまで使用したことがなかったセットのおかげでした。
アーノルドパーマー

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年のために間違った答えを与えると思う:私は、make(すなわち正方形という3つのパーティションを数え{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

パイソン2173の 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}])

オンラインでお試しください!

編集:アーノルドパルマーのために10バイトを保存しました


1
.5代わりにを使用してバイトを保存できます0.5か?
numbermaniac

あなたはできる。また、Leaky NunのPython 3投稿で取り上げたのと同じトリックを使用して、いくつかのバイトを節約することもできます。また、あなたの答えは要素の数ではなく要素自体を出力していませんでしたので、それを追加しました。もしあなたが持っている出力を保持したいなら、それは余分な5バイトです。 163バイト
アーノルドパーマー

アーノルド、セットの理解のいいトリック。
チャスブラウン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.