Wie viele Partitionen enthalten nur perfekte Quadrate?

16

Bestimmen Sie bei einer nicht negativen Ganzzahl oder einer Liste von Ziffern, auf wie viele Arten die Zahl durch Verketten von Quadratzahlen gebildet werden kann, die führende Nullen haben können.

Beispiele

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]

Regeln

  • Es gelten Standardlücken
  • Das ist also gewinnt die kürzeste Antwort in Bytes
HyperNeutrino
quelle
1
Sandbox Post
HyperNeutrino
Können wir Eingaben als Ziffernliste nehmen?
Totalhuman
warum ist 1 -> 1 aber 0 -> 0?
Jonah
@Jonah Typo ... xD
HyperNeutrino
1
@totallyhuman Sicher.
HyperNeutrino

Antworten:

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]

Probieren Sie es online!

Wahrscheinlich noch nicht gut golfen, aber das ist ein überraschend schwieriges Problem

Weizen-Assistent
quelle
7

Gelee , 8 Bytes

ŒṖḌƲẠ€S

Ein monadischer Link, der eine Liste von Ziffern aufnimmt und eine nicht negative Ganzzahl zurückgibt.

Probieren Sie es online! oder sehen Sie sich die Testsuite an .

Wie?

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

Definiert eine Funktion f, die eine Zeichenfolge akzeptiert und einen Gleitkommawert zurückgibt. Sehr langsam. Probieren Sie es online!

Erläuterung

Ich verwende meinen Haskell-Tipp zum Berechnen aller Partitionen eines Strings mit mapMund words. Das Snippet mapM(\c->[[c],c:" "])xersetzt jedes Zeichen 'c'einer Zeichenfolge xdurch die Zeichenfolge mit einem "c"oder zwei Elementen "c "und gibt die Liste aller möglichen Kombinationen zurück. Wenn ich eines der Ergebnisse nehme y, es verkette und das Ergebnis aufrufe words, wird es an den von eingefügten Stellen aufgeteilt mapM. Auf diese Weise xerhalte ich alle Partitionen von in zusammenhängende Teilzeichenfolgen. Dann zähle ich nur die Ergebnisse, bei denen jedes Partitionselement ein perfektes Quadrat ist (indem ich es in der Liste finde [0,1,4,9,..,x^2]). Eine Einschränkung ist, dass jede Partition zweimal mit und ohne Leerzeichen gezählt wird, also nehme ich die Summe von0.5s statt 1s; Aus diesem Grund ist der Ergebnistyp ein 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.
Zgarb
quelle
4

Pyth , 16 Bytes

lf!f!sI@sjkY2T./

Testsuite .

Undichte Nonne
quelle
4

Python 3 , 148 139 135 134 Bytes

10 Bytes dank 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)

Probieren Sie es online!

Undichte Nonne
quelle
Ich würde das noch einmal überprüfen, aber ich glaube, es funktioniert. 140 Zeichen.
Arnold Palmer
Ich vermasselte und ließ ein Leerzeichen zwischen %1und for...
Arnold Palmer
Durch Ersetzen [[a[0]]]durch [a[:1]]wird ein Byte gespeichert
Arnold Palmer
Gemeinsam haben wir Haskell überholt.
Undichte Nonne
Das Beste ist, dass es teilweise dank Sets war, die ich nie benutzt hatte, bis du gestern auf meiner Schildkrötenantwort gepostet hast .
Arnold Palmer
2

Mathematica, 141 Bytes

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


Eingabe (eine Liste von Ziffern)

[{1,6,4}]

J42161217
quelle
Ich denke , dass dies die falsche Antwort für 1649 gibt: ich drei Partitionen rechnen , dass make Quadrate (nämlich {1,64,9}, {16,4,9}und {16,49}) , aber Ihre Funktion zurück 4.
Keinen Baum
Außerdem ist mir aufgefallen, dass Sie Konstruktionen wie Table[(function of s[[i]]),{i,Length[s=(stuff)]}]ein paar Mal verwenden. Sie können dieses bis zu normalerweise Golf spielen (function of #)&/@(stuff).
Kein Baum
1
@Notatree du hast absolut recht! Ich habe viele Änderungen vorgenommen, bin Ihren Anweisungen gefolgt und es funktioniert wie ein Zauber! danke
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}])

Probieren Sie es online!

Bearbeiten: 10 Bytes wegen ArnoldPalmer gespeichert

Chas Brown
quelle
1
Können Sie ein Byte speichern, indem Sie .5anstelle von verwenden 0.5?
Numbermaniac
Du kannst. Sie können auch einige Bytes mit dem gleichen Trick speichern, den ich für den Python 3-Beitrag von Leaky Nun angewendet habe. Außerdem hat Ihre Antwort nicht die Anzahl der Elemente gedruckt, sondern die Elemente selbst, daher habe ich das hinzugefügt. Wenn Sie die Ausgabe beibehalten möchten, die Sie haben, sind es minus 5 zusätzliche Bytes. 163 Bytes
Arnold Palmer
Netter Trick mit Setverständnis, Arnold.
Chas Brown