มีพาร์ติชั่นกี่ตัวที่มีสี่เหลี่ยมสมบูรณ์แบบเท่านั้น?


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
Jonah

@Jonah Typo ... xD
HyperNeutrino

1
@tallyallyhuman แน่นอน
HyperNeutrino

คำตอบ:



7

เยลลี่ 8 ไบต์

ŒṖḌƲẠ€S

ลิงก์ monadic ที่รับรายการตัวเลขและส่งคืนจำนวนเต็มแบบไม่ลบ

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

ŒṖḌƲẠ€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'ของสตริงxด้วยสตริงหนึ่งองค์ประกอบ"c"หรือสตริงสององค์ประกอบ"c "และส่งกลับรายการของชุดค่าผสมที่เป็นไปได้ทั้งหมด ถ้าผมใช้เวลาหนึ่งในผลy, concatenate มันและโทรในผลที่ได้ก็จะเป็นแยกที่ช่องว่างแทรกโดยwords mapMด้วยวิธีนี้ฉันได้พาร์ทิชันทั้งหมดของxเป็นสารตั้งต้นที่ต่อเนื่องกัน จากนั้นฉันก็นับผลลัพธ์เหล่านั้นโดยที่แต่ละองค์ประกอบพาร์ติชันเป็นรูปสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบ (โดยการค้นหาในรายการ[0,1,4,9,..,x^2]) ข้อแม้คือแต่ละพาร์ติชันถูกนับสองครั้งโดยมีและไม่มีช่องว่างท้ายดังนั้นฉันจึงรวมผลรวมของ0.5s แทน1s; นี่คือสาเหตุที่ประเภทผลลัพธ์เป็นแบบลอย

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 ไบต์

10 ไบต์ขอบคุณ 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)

ลองออนไลน์!


ฉันต้องการตรวจสอบอีกครั้ง แต่ฉันเชื่อว่ามันใช้งานได้ 140 ตัวอักษร
Arnold Palmer

ฉันโง่และออกจากช่องว่างระหว่าง%1และfor...
Arnold Palmer

การแทนที่[[a[0]]]ด้วย[a[:1]]จะช่วยประหยัดไบต์
Arnold Palmer

เราร่วมกันเอาชนะ Haskell
Leun Nun

ส่วนที่ดีที่สุดคือมันเป็นส่วนที่ต้องขอบคุณชุดซึ่งฉันไม่เคยใช้จนกว่าคุณโพสต์บนคำตอบเต่าของฉันเมื่อวานนี้
Arnold Palmer

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: ฉันนับสามพาร์ทิชันที่ทำให้สี่เหลี่ยม (คือ{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

Python 2 , 173 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 ไบต์เนื่องจาก ArnoldPalmer


1
คุณสามารถบันทึก byte โดยใช้.5แทนได้0.5หรือไม่?
numbermaniac

คุณสามารถ. คุณสามารถบันทึกไบต์ด้วยเคล็ดลับเดียวกับที่ฉันดึงไว้ในโพสต์ Python 3 ของ Leaky Nun นอกจากนี้คำตอบของคุณไม่ได้พิมพ์จำนวนองค์ประกอบ แต่องค์ประกอบเองดังนั้นฉันจึงเพิ่มสิ่งต่อไปนี้หากคุณต้องการเก็บเอาท์พุทที่คุณมีอยู่มันจะลบ 5 ไบต์พิเศษ 163 bytes
Arnold Palmer

เคล็ดลับที่ดีกับชุดความเข้าใจอาร์โนลด์
Chas Brown
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.