Quantas partições contêm apenas quadrados perfeitos?


16

Dado um número inteiro não negativo ou uma lista de dígitos, determine de quantas maneiras o número pode ser formado concatenando números quadrados, que podem ter zeros à esquerda.

Exemplos

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]

Regras

  • As brechas padrão se aplicam
  • Isso é então a resposta mais curta em bytes vence


Podemos considerar a entrada como uma lista de dígitos?
totallyhuman

por que 1 -> 1 mas 0 -> 0?
Jonah

@Jonah Typo ... xD
HyperNeutrino

1
@totallyhuman Claro.
HyperNeutrino

Respostas:


7

Haskell , 135 bytes

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]

Experimente online!

Provavelmente ainda não está bem jogado, mas esse é um problema surpreendentemente difícil


7

Gelatina , 8 bytes

ŒṖḌƲẠ€S

Um link monádico que obtém uma lista de dígitos e retorna um número inteiro não negativo.

Experimente online! ou veja a suíte de testes .

Quão?

ŒṖḌƲẠ€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 bytes

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

Define uma função fque pega uma string e retorna um float. Muito devagar. Experimente online!

Explicação

Estou usando minha dica Haskell para calcular todas as partições de uma string com mapMe words. O trecho mapM(\c->[[c],c:" "])xsubstitui todos os caracteres 'c'de uma cadeia de caracteres pela cadeia de xum elemento "c"ou pela cadeia de dois elementos "c "e retorna a lista de todas as combinações possíveis. Se eu pegar um dos resultados y, concatene-o e chame s em vez de s; é por isso que o tipo de resultado é flutuante.words o resultado, ele será dividido nos espaços inseridos por mapM. Dessa maneira, eu obtenho todas as partições de xem substrings contíguos. Depois, apenas conto os resultados em que cada elemento da partição é um quadrado perfeito (encontrando-o na lista [0,1,4,9,..,x^2]). Uma ressalva é que cada partição é contada duas vezes, com e sem espaço à direita, então eu tomo a soma de0.51

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 bytes

10 bytes graças a 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)

Experimente online!


Eu checaria isso, mas acredito que funciona. 140 caracteres.
Arnold Palmer

I gozado e deixou um espaço entre %1e for...
Arnold Palmer

Substituir [[a[0]]]com [a[:1]]vai salvar um byte
Arnold Palmer

Juntos, vencemos Haskell.
Leaky Nun

A melhor parte é que foi, em parte, graças a conjuntos, que eu nunca tinha usado até que você postou na minha resposta de tartaruga ontem.
26917 Arnold Palmer

2

Mathematica, 141 bytes

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


entrada (uma lista de dígitos)

[{1,6,4}]


Eu acho que isso dá a resposta errada para 1649: eu conto três partições que quadrados Marca (ou seja {1,64,9}, {16,4,9}e {16,49}), mas seus função retorna 4.
não uma árvore

Além disso, notei que você usou construções como Table[(function of s[[i]]),{i,Length[s=(stuff)]}]algumas vezes; normalmente você pode jogar isso até (function of #)&/@(stuff).
Não uma árvore

1
@ Nototree você está absolutamente certo! Fiz muitas alterações, segui suas instruções e funciona como um encanto! graças
J42161217

2

Python 2 , 173 163 bytes

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

Experimente online!

Editar: salvou 10 bytes devido ao ArnoldPalmer


1
Você pode salvar um byte usando em .5vez de 0.5?
numbermaniac

Você pode. Você também pode salvar alguns bytes com o mesmo truque que utilizei na postagem em Python 3 do Leaky Nun. Além disso, sua resposta não imprimiu o número de elementos, mas os próprios elementos, então eu adicionei isso. Se você deseja manter a saída que possui, são menos 5 bytes extras. 163 bytes
Arnold Palmer

Bom truque com compreensão, Arnold.
Chas Brown
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.