Có bao nhiêu phân vùng chỉ chứa các hình vuông hoàn hảo?


16

Cho một số nguyên không âm hoặc một danh sách các chữ số, xác định xem có bao nhiêu số có thể được hình thành bằng cách ghép các số vuông, có thể có các số 0 đứng đầu.

Ví dụ

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]

Quy tắc

  • Áp dụng sơ hở tiêu chuẩn
  • Đây là vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng


Chúng ta có thể lấy đầu vào là một danh sách các chữ số?
hoàn toàn là

tại sao là 1 -> 1 mà là 0 -> 0?
Giô-na

@Jonah Typo ... xD
HyperNeutrino

1
@totallyhuman Chắc chắn rồi.
HyperNeutrino

Câu trả lời:


7

Haskell , 135 byte

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]

Hãy thử trực tuyến!

Có lẽ chưa chơi golf tốt nhưng đây là một vấn đề khó khăn đáng ngạc nhiên


7

Thạch , 8 byte

ŒṖḌƲẠ€S

Một liên kết đơn âm lấy một danh sách các chữ số và trả về một số nguyên không âm.

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm .

Làm sao?

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

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

Xác định hàm flấy một chuỗi và trả về float. Rất chậm. Hãy thử trực tuyến!

Giải trình

Tôi đang sử dụng mẹo Haskell của mình để tính toán tất cả các phân vùng của một chuỗi với mapMwords. Đoạn mã mapM(\c->[[c],c:" "])xthay thế mọi ký tự s thay vì s; đây là lý do tại sao loại kết quả là một float.'c' của chuỗi xbằng chuỗi một phần tử "c"hoặc chuỗi hai phần tử "c "và trả về danh sách tất cả các kết hợp có thể. Nếu tôi lấy một trong các kết quả, ynối nó và gọi wordskết quả, nó sẽ được phân chia tại các khoảng trắng được chèn bởi mapM. Theo cách này, tôi có được tất cả các phân vùng xthành các chuỗi liên tiếp. Sau đó, tôi chỉ đếm những kết quả trong đó mỗi phần tử phân vùng là một hình vuông hoàn hảo (bằng cách tìm thấy nó trong danh sách [0,1,4,9,..,x^2]). Một lưu ý là mỗi phân vùng được tính hai lần, có và không có dấu cách, vì vậy tôi lấy tổng của0.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

Trăn 3 , 148 139 135 134 byte

10 byte nhờ 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)

Hãy thử trực tuyến!


Tôi sẽ kiểm tra lại điều này, nhưng tôi tin rằng nó hoạt động. 140 ký tự.
Arnold Palmer

Tôi ngớ ngẩn và để lại một khoảng trống giữa %1for...
Arnold Palmer

Thay thế [[a[0]]]bằng [a[:1]]sẽ tiết kiệm một byte
Arnold Palmer

Chúng tôi cùng nhau vượt qua Haskell.
Nữ tu bị rò rỉ

Phần tốt nhất là, một phần, nhờ vào các bộ, mà tôi chưa bao giờ sử dụng cho đến khi bạn đăng trên câu trả lời rùa của tôi ngày hôm qua.
Arnold Palmer

2

Toán học, 141 byte

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


đầu vào (một danh sách các chữ số)

[{1,6,4}]


Tôi nghĩ rằng điều này sẽ cho câu trả lời sai cho 1649: Tôi đếm ba phân vùng đó làm cho hình vuông (cụ thể là {1,64,9}, {16,4,9}{16,49}) nhưng lợi nhuận chức năng của bạn 4.
Không phải là một cây

Ngoài ra, tôi đã nhận thấy bạn sử dụng các công trình như Table[(function of s[[i]]),{i,Length[s=(stuff)]}]một vài lần; bạn thường có thể chơi golf này xuống (function of #)&/@(stuff).
Không phải là một cái cây

1
@Notatree bạn hoàn toàn đúng! Tôi đã thực hiện nhiều thay đổi, làm theo hướng dẫn của bạn và nó hoạt động như một cơ duyên! cảm ơn
J42161217

2

Python 2 , 173 163 byte

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

Hãy thử trực tuyến!

Chỉnh sửa: Đã lưu 10 byte do ArnoldPalmer


1
Bạn có thể lưu một byte bằng cách sử dụng .5thay vì 0.5?
numbermaniac

Bạn có thể. Bạn cũng có thể lưu một số byte bằng thủ thuật tương tự mà tôi đã rút ra trên bài đăng Python 3 của Leaky Nun. Ngoài ra, câu trả lời của bạn không in số lượng phần tử, nhưng bản thân các phần tử, vì vậy tôi đã thêm nó vào. Nếu bạn muốn giữ đầu ra bạn có, nó sẽ trừ thêm 5 byte. 163 byte
Arnold Palmer

Thủ thuật hay với sự hiểu biết thiết lập, Arnold.
Chas Brown
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.