Combien de partitions ne contiennent que des carrés parfaits?

16

Étant donné un entier non négatif ou une liste de chiffres, déterminez de combien de façons le nombre peut être formé en concaténant des nombres carrés, qui peuvent avoir des zéros en tête.

Exemples

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]

Règles

  • Les échappatoires standard s'appliquent
  • Il s'agit de donc la réponse la plus courte en octets l'emporte
HyperNeutrino
la source
1
Sandbox Post
HyperNeutrino
Pouvons-nous prendre la saisie comme une liste de chiffres?
2017 totalement humain
pourquoi 1 -> 1 mais 0 -> 0?
Jonah
@Jonah Typo ... xD
HyperNeutrino
1
@totallyhuman Bien sûr.
HyperNeutrino

Réponses:

7

Haskell , 135 octets

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]

Essayez-le en ligne!

Probablement pas encore bien joué mais c'est un problème étonnamment difficile

Post Rock Garf Hunter
la source
7

Gelée , 8 octets

ŒṖḌƲẠ€S

Un lien monadique prenant une liste de chiffres et renvoyant un entier non négatif.

Essayez-le en ligne! ou consultez la suite de tests .

Comment?

ŒṖḌƲẠ€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
Jonathan Allan
la source
6

Haskell , 88 octets

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

Définit une fonction fqui prend une chaîne et renvoie un flottant. Très lent. Essayez-le en ligne!

Explication

J'utilise mon astuce Haskell pour calculer toutes les partitions d'une chaîne avec mapMet words. L'extrait de code mapM(\c->[[c],c:" "])xremplace chaque caractère 'c'd'une chaîne xpar la chaîne à un élément "c"ou la chaîne à deux éléments "c "et renvoie la liste de toutes les combinaisons possibles. Si je prends l'un des résultats, le yconcatène et appelle wordsle résultat, il sera divisé aux espaces insérés par mapM. De cette façon, j'obtiens toutes les partitions dex en sous-chaînes contiguës. Ensuite, je compte simplement les résultats où chaque élément de partition est un carré parfait (en le trouvant dans la liste [0,1,4,9,..,x^2]). Une mise en garde est que chaque partition est comptée deux fois, avec et sans espace de fin, donc je prends la somme de0.5s au lieu de 1s; c'est pourquoi le type de résultat est un flottant.

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.
Zgarb
la source
4

Python 3 , 148 139 135 135 134 octets

10 octets grâce à 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)

Essayez-le en ligne!

Leaky Nun
la source
Je revérifierais cela, mais je crois que cela fonctionne. 140 caractères.
Arnold Palmer
J'ai gaffé et laissé un espace entre %1et for...
Arnold Palmer
Remplacer [[a[0]]]par [a[:1]]permettra d'économiser un octet
Arnold Palmer
Ensemble, nous avons surclassé Haskell.
Leaky Nun
La meilleure partie est que c'était en partie grâce à des ensembles, que je n'avais jamais utilisés jusqu'à ce que vous ayez publié ma réponse sur la tortue hier.
Arnold Palmer
2

Mathematica, 141 octets

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


entrée (une liste de chiffres)

[{1,6,4}]

J42161217
la source
Je pense que cela donne la mauvaise réponse pour 1649: je compte trois partitions qui font des carrés (à savoir {1,64,9}, {16,4,9}et {16,49}) mais votre fonction retourne 4.
Pas un arbre
De plus, je vous ai remarqué en utilisant des constructions comme Table[(function of s[[i]]),{i,Length[s=(stuff)]}]plusieurs fois; vous pouvez généralement jouer au golf jusqu'à (function of #)&/@(stuff).
Pas un arbre du
1
@Notatree, vous avez absolument raison! J'ai fait de nombreux changements, suivi vos instructions et ça marche comme un charme! merci
J42161217
2

Python 2 , 173 163 octets

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}])

Essayez-le en ligne!

Edit: 10 octets enregistrés grâce à ArnoldPalmer

Chas Brown
la source
1
Pouvez-vous enregistrer un octet en utilisant .5au lieu de 0.5?
numbermaniac
Vous pouvez. Vous pouvez également enregistrer quelques octets avec la même astuce que j'ai tirée sur le post Python 3 de Leaky Nun. En outre, votre réponse n'a pas imprimé le nombre d'éléments, mais les éléments eux-mêmes, alors j'ai ajouté cela. Si vous souhaitez conserver la sortie que vous avez, c'est moins 5 octets supplémentaires. 163 octets
Arnold Palmer
Belle astuce avec une compréhension d'ensemble, Arnold.
Chas Brown