Kaç bölüm yalnızca mükemmel kareler içerir?


16

Negatif olmayan bir tamsayı veya bir rakam listesi verildiğinde, önünde sıfırlar olabilen kare sayılarını birleştirerek sayının kaç yolla oluşturulabileceğini belirleyin.

Örnekler

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]

kurallar

  • Standart Loopholes Uygula
  • Bu bu nedenle bayttaki en kısa cevap kazanır


Girdileri bir rakam listesi olarak alabilir miyiz?
totallyhuman

neden 1 -> 1 ama 0 -> 0?
Jonah

@Jonah Typo ... xD
HyperNeutrino

1
@totallyhuman Tabii.
HyperNeutrino

Yanıtlar:


7

Haskell , 135 bayt

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]

Çevrimiçi deneyin!

Muhtemelen henüz golf iyi değil ama bu şaşırtıcı derecede zor bir problem


7

Jöle , 8 bayt

ŒṖḌƲẠ€S

Rakamların listesini alan ve negatif olmayan bir tam sayı döndüren monadik bir bağlantı.

Çevrimiçi deneyin! veya test takımına bakın .

Nasıl?

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

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

fDize alan ve kayan nokta döndüren bir işlevi tanımlar . Çok yavaş. Çevrimiçi deneyin!

açıklama

Ben kullanıyorum benim Haskell ucu ile bir dize tüm bölümleri hesaplanmasında mapMve words. Snippet , bir dizenin mapM(\c->[[c],c:" "])xher karakterini tek öğeli dize veya iki öğeli dize ile değiştirir ve olası tüm birleşimlerin listesini döndürür. Sonuçlardan birini alırsam, onu birleştirir ve sonucu çağırırsanız , tarafından eklenen boşluklara bölünür . Bu şekilde bitişik alt dizelerin tüm bölümlerini elde ederim . Sonra sadece her bir bölüm öğesinin mükemmel bir kare olduğu sonuçları sayıyorum (listede bularak ). Bir uyarı, her bölümün arka boşluklu ve boşluksuz iki kez sayılmasıdır, bu yüzden'c'x"c""c "ywordsmapMx[0,1,4,9,..,x^2]0.5s yerine 1s; bu nedenle sonuç türü bir şamandıradır.

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 bayt

Arnold Palmer sayesinde 10 bayt.

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)

Çevrimiçi deneyin!


Bunu iki kez kontrol ederdim, ama işe yaradığına inanıyorum. 140 karakter.
Arnold Palmer

Ben goofed arasında bir boşluk bıraktı %1ve for...
Arnold Palmer

Değiştirme [[a[0]]]ile [a[:1]]bir byte kurtaracak
Arnold Palmer

Birlikte Haskell'i geride bıraktık.
Leaky Nun

En iyi yanı, kısmen, dün kaplumbağa cevabımı gönderene kadar hiç kullanmamış olduğum setler sayesinde olmasıydı .
Arnold Palmer

2

Mathematica, 141 bayt

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


girdi (basamak listesi)

[{1,6,4}]


Bunun 1649 için yanlış cevap verir düşünüyorum: Üç bölümleri sayımı yapmak kareler (yani {1,64,9}, {16,4,9}ve {16,49}) ancak fonksiyon döner 4.
Değil bir ağaç

Ayrıca, Table[(function of s[[i]]),{i,Length[s=(stuff)]}]birkaç kez gibi yapılar kullandığınızı fark ettim ; genellikle aşağı golf olabilir (function of #)&/@(stuff).
Bir ağaç değil

1
@Notatree kesinlikle haklısın! Birçok değişiklik yaptım, talimatlarını takip ettim ve bir cazibe gibi çalışıyor! teşekkürler
J42161217

2

Python 2 , 173163 bayt

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

Çevrimiçi deneyin!

Düzenleme: ArnoldPalmer nedeniyle 10 bayt kaydedildi


1
.5Bunun yerine kullanarak bir bayt kaydedebilir misiniz 0.5?
numbermaniac

Yapabilirsin. Ayrıca, Leaky Nun'in Python 3 gönderisinde aldığım hile ile bazı baytlar kaydedebilirsiniz. Ayrıca, cevabınız elemanların sayısını değil, elemanların kendilerini bastı, bu yüzden ekledim. Sahip olduğunuz çıktıyı tutmak istiyorsanız, eksi 5 bayt. 163 bayt
Arnold Palmer

Set anlayışı ile güzel numara Arnold.
Chas Brown
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.