Liệt kê tất cả các lưới số nguyên có thể có các ràng buộc


17

Vấn đề

Xét một ô vuông 3 x 3 số nguyên không âm. Đối với mỗi hàng i, tổng của các số nguyên được đặt thành r_i. Tương tự cho mỗi cột j, tổng số nguyên trong cột đó được đặt thành c_j.

Nhiệm vụ là viết mã để liệt kê tất cả các phép gán số nguyên khác nhau có thể vào lưới cho các ràng buộc tổng của hàng và cột. Mã của bạn sẽ xuất ra một nhiệm vụ tại một thời điểm.

Đầu vào

Mã của bạn sẽ có 3 số nguyên không âm chỉ định các ràng buộc hàng và 3 số nguyên không âm chỉ định các ràng buộc cột. Bạn có thể giả sử rằng những điều này là hợp lệ, nghĩa là các ràng buộc tổng hoặc hàng bằng tổng các ràng buộc của cột. Mã của bạn có thể làm điều này theo bất kỳ cách nào thuận tiện.

Đầu ra

Mã của bạn sẽ xuất ra các lưới 2d khác nhau mà nó tính toán theo bất kỳ định dạng nào mà con người bạn có thể đọc được. Tất nhiên càng đẹp thì càng tốt. Đầu ra không được chứa các lưới trùng lặp.

Thí dụ

Nếu tất cả các ràng buộc hàng và cột là chính xác 1thì chỉ có 6các khả năng khác nhau. Đối với hàng đầu tiên, bạn có thể đặt một 1trong bất kỳ ba cột đầu tiên, cho hàng thứ hai hiện có 2các lựa chọn thay thế và hàng cuối cùng bây giờ hoàn toàn được xác định bởi hai cột trước. Mọi thứ khác trong lưới nên được đặt thành 0.

Nói đầu vào là 2 1 0cho các hàng và 1 1 1cho các cột. Sử dụng định dạng đầu ra đáng yêu của APL, các lưới số nguyên có thể là:

┌─────┬─────┬─────┐
│0 1 1│1 0 1│1 1 0│
│1 0 0│0 1 0│0 0 1│
│0 0 0│0 0 0│0 0 0│
└─────┴─────┴─────┘

Bây giờ nói đầu vào là 1 2 3cho các hàng và 3 2 1cho các cột. Các lưới số nguyên có thể là:

┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│0 0 1│0 0 1│0 0 1│0 1 0│0 1 0│0 1 0│0 1 0│1 0 0│1 0 0│1 0 0│1 0 0│1 0 0│
│0 2 0│1 1 0│2 0 0│0 1 1│1 0 1│1 1 0│2 0 0│0 1 1│0 2 0│1 0 1│1 1 0│2 0 0│
│3 0 0│2 1 0│1 2 0│3 0 0│2 1 0│2 0 1│1 1 1│2 1 0│2 0 1│1 2 0│1 1 1│0 2 1│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

Câu trả lời:


9

APL (Dyalog) , 42 byte

{o/⍨(⍵≡+/,+⌿)¨o←3 3∘⍴¨(,o∘.,⊢)⍣8⊢o←⍳1+⌈/⍵}

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

Sử dụng ⎕IO←0được mặc định trên nhiều hệ thống. Các thứ khác trong tiêu đề chỉ là in đẹp cho ma trận (hiển thị hình hộp).

Đầu vào là danh sách sáu giá trị, hàng tổng hợp trước, sau đó là tổng cột.

Làm sao?

o←⍳1+⌈/⍵- ođưa phạm vi 0đến mức tối đa ( ⌈/) của đầu vào

,o∘.,⊢- sản phẩm cartesian với ovà flatten ( ,)

⍣8 - lặp đi lặp lại tám lần

3 3∘⍴¨ - định hình mỗi danh sách 9 mục thành ma trận 3 × 3

¨o←- lưu các ma trận này ovà cho mỗi ma trận

+/,+⌿- kiểm tra xem các hàng tổng ( +/) được nối với cột tổng ( +⌿)

⍵≡ - tương ứng với đầu vào

o/⍨- bộ lọc o(mảng ma trận) theo các giá trị trung thực


Câu trả lời rất đẹp này cần một lời giải thích (xin vui lòng).

@Lembik thêm lời giải thích
Uriel

Cảm ơn. Vì vậy, bạn liệt kê tất cả các ma trận có thể và kiểm tra những ma trận phù hợp với các ràng buộc có vẻ như. Không phải là hiệu quả nhất, nhưng nó hoạt động.

1
@Lembik yup, đó là ngắn nhất. Tôi có thể quản lý một mục hiệu quả hơn một chút bằng cách lấy tất cả các danh sách 3 mục có thể khớp với tổng, sau đó chọn những mục phù hợp với tổng hàng đầu tiên, sau đó chọn những mục (cho mỗi kết hợp trước đó) khớp với tổng cột đầu tiên, và cứ thế qua lại. Đó sẽ là thuật toán chung không vũ lực.
Uriel

@EriktheOutgolfer cảm ơn, tôi luôn quên cập nhật số byte của mình
Uriel

7

Husk , 20 17 byte

fȯ=⁰mΣS+Tπ3π3Θḣ▲⁰

-3 byte nhờ @ H.PWiz

Đưa đầu vào dưới dạng danh sách xsmã hóa các ràng buộc [r_1,r_2,r_3,c_1,c_2,c_3], hãy thử trực tuyến!

Giải trình

Phương pháp tiếp cận mạnh mẽ: P Tạo tất cả các lưới 3x3 với các mục [0..max xs]:

f(=⁰mΣS+T)π3π3Θḣ▲⁰  -- input ⁰, for example: [1,1,1,1,1,1]
                ▲⁰  -- max of all constraints: 1
               ḣ    -- range [1..max]: [1]
              Θ     -- prepend 0: [0,1]
            π3      -- 3d cartesian power: [[0,0,0],...,[1,1,1]]
          π3        -- 3d cartesian power: list of all 3x3 matrices with entries [0..max] (too many)
f(       )          -- filter by the following predicate (eg. on [[0,0,1],[1,0,0],[0,1,0]]):
      S+            --   append to itself, itself..: [[0,0,1],[1,0,0],[0,1,0],..
        T           --   .. transposed:             ..[0,1,0],[0,0,1],[1,0,0]]
      mΣ            --   map sum: [1,1,1,1,1,1]
    =⁰              --   is it equal to the input: 1

6

Brachylog , 17 byte

{~⟨ṁ₃{ℕᵐ+}ᵐ²\⟩≜}ᶠ

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

CẢNH BÁO: ĐẦU RA UGLY! Đừng lo lắng, nó vẫn có thể đọc được, tôi không bắt buộc phải tính đến bao nhiêu. ;)

Vì một số lý do, nó phải dài hơn nhiều so với những gì tôi mong đợi có ý nghĩa (13 byte):

⟨ṁ₃{ℕᵐ+}ᵐ²\⟩ᶠ

Phiên bản sau này, nếu nó hoạt động, sẽ lấy đầu vào từ đầu ra (tức là đối số dòng lệnh) thay thế.


@Riker Đọc phần "Đầu ra" của OP. Chắc chắn, nó vẫn có các dấu ngoặc ngăn cách các lưới, nó cũng có thể tước chúng và đầu ra vẫn không bị mất bất kỳ dữ liệu nào ...
Erik the Outgolfer 6/12/17

4

Python 2 , 149 145 142 141 138 136 byte

lambda s:[i for i in product(range(max(sum(s,[]))+1),repeat=9)if[map(sum,(i[j:j+3],i[j/3::3]))for j in 0,3,6]==s]
from itertools import*

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

Lấy đầu vào là một danh sách các danh sách: [[r1, c1], [r2, c2], [r3, c3]]


4

Haskell, 94 88 84 79 byte

q=mapM id.(<$"abc")
f r=[k|k<-q$q$[0..sum r],(sum<$>k)++foldr1(zipWith(+))k==r]

Lấy tổng của các hàng và cột dưới dạng một danh sách 6 phần tử phẳng [r1,r2,r3,c1,c2,c3].

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

q=mapM id.(<$"abc")         -- helper function 

f r =                       -- 
  [k | k <-   ,    ]        -- keep all k
    q$q$[0..sum r]          --   from the list of all possible matrices with
                            --   elements from 0 to the sum of r
                            -- where
    (sum<$>k) ++            --   the list of sums of the rows followed by
    foldr1(zipWith(+))k     --   the list of sums of the columns
    == r                    -- equals the input r

Khi các yếu tố của ma trận để kiểm tra tăng lên tổng r, mã không hoàn thành trong thời gian hợp lý cho các tổng hàng / cột lớn. Đây là phiên bản tăng tối đa rnhanh hơn, nhưng dài hơn 4 byte: Hãy thử trực tuyến!


3

Toán học, 81 byte

Select[0~Range~Max[s=#,t=#2]~g~3~(g=Tuples)~3,(T=Total)@#==s&&T@Transpose@#==t&]&

tìm thấy tất cả các ma trận 3x3 với các phần tử 0..Max và chọn đúng các ma trận
này có nghĩa là (Max+1)^9các ma trận phải được kiểm tra

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


Bạn có thể thêm một lời giải thích xin vui lòng.

3
@Lembik Tôi sẽ, sau khi bạn thêm một số trường hợp thử nghiệm và thực hiện thử thách này "rõ ràng" cho tất cả những người here.I bình chọn để mở lại nhưng bạn dường như không cố gắng để làm điều này bất kỳ tốt hơn cho tất cả những ai cần sự giúp đỡ
J42161217

Thêm vào câu hỏi bây giờ.

Điều gì vẫn chưa rõ ràng? / Gridcũng làm việc với TIO, sử dụng ToString. Hãy thử trực tuyến!
dùng202729

@ user202729 không có gì với tôi, nhưng các trường hợp thử nghiệm bị thiếu
J42161217

3

R , 115 110 byte

function(S)for(m in unique(combn(rep(0:max(S),9),9,matrix,F,3,3)))if(all(c(rowSums(m),colSums(m))==S))print(m)

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

Đưa đầu vào là c(r1,r2,r3,c1,c2,c3) một vector, và in các ma trận thành thiết bị xuất chuẩn.

Nó khá giống với câu trả lời APL của Uriel , nhưng nó tạo ra các lưới 3x3 hơi khác một chút.

Để cho M=max(S)nó, nó tạo ra vector 0:M, sau đó repăn nó 9 lần, tức là [0..M, 0...M, ..., 0...M]chín lần. Sau đó, nó chọn tất cả các kết hợp của vectơ mới đó lấy 9 lần, sử dụng matrix, 3, 3để chuyển đổi mỗi kết hợp 9 thành 3x3ma trận và buộc simplify=Fphải trả về một danh sách thay vì một mảng. Sau đó, nó duy nhất danh sách này và lưu nó dưới dạng m.

Sau đó, nó lọc mcho những nơi mà tổng hàng / cột giống hệt với đầu vào, in ra những thứ đang và không làm gì cho những thứ không có.

Vì nó tính toán choose(9*(M+1),9)các lưới có thể khác nhau (nhiều hơn (M+1)^9khả năng), nên nó sẽ hết bộ nhớ / thời gian nhanh hơn câu trả lời hiệu quả hơn (nhưng ít chơi gôn hơn) dưới đây:

R , 159 byte

function(S,K=t(t(expand.grid(rep(list(0:max(S)),9)))))(m=lapply(1:nrow(K),function(x)matrix(K[x,],3,3)))[sapply(m,function(x)all(c(rowSums(x),colSums(x))==S))]

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


R rất hoan nghênh!

3

MATL , 35 22 byte

-13 byte nhờ Luis Mendo

X>Q:q9Z^!"@3et!hsG=?4M

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

Liên kết là một phiên bản của mã in độc đáo hơn một chút; phiên bản này sẽ chỉ in tất cả các ma trận với một dòng mới giữa chúng.

Đưa đầu vào là [c1 c2 c3 r1 r2 r3].

Rõ ràng, điều này tính toán sức mạnh X^của cartesian 0...max(input)với số mũ 9và hoán vị !. Sau đó, nó lặp "lại các cột, định hình lại từng cột @như một ma trận 3x3 3e, sao chép t, hoán vị !và nối chúng theo chiều ngang h. Sau đó, nó tính tổng các cột s, sẽ dẫn đến vector [c1 c2 c3 r1 r2 r3]. Chúng tôi thực hiện bình đẳng theo nguyên tố với đầu vào G=và nếu ?tất cả đều khác 0, chúng tôi khôi phục ma trận chính xác bằng cách chọn đầu vào cho hàm !bằng cách sử dụng 4M.


2

Mẻ, 367 byte

@echo off
for /l %%i in (0,1,%1)do for /l %%j in (%%i,1,%1)do for /l %%k in (%%i,1,%4)do call:c %* %%i %%j %%k
exit/b
:c
set/a"a=%1-%8,c=%4-%9,f=%8-%7,g=%9-%7,l=%5-f,m=%2-g,l^=m-l>>31&(m^l),m=%5+c-%3-f,m&=~m>>31
for /l %%l in (%m%,1,%l%)do set/a"b=%2-g-%%l,d=%5-f-%%l,e=%6-a-b"&call:l %7 %%l
exit/b
:l
echo %1 %f% %a%
echo %g% %2 %b%
echo %c% %d% %e%
echo(

Hình vuông 2 × 2 trên cùng bên trái buộc kết quả, vì vậy cách tiếp cận tốt nhất là tạo tất cả các giá trị cho số nguyên trên cùng bên trái, tất cả các giá trị hợp lệ cho tổng của số nguyên trên cùng bên trái và trên cùng, tất cả các giá trị hợp lệ cho tổng của đầu trên số nguyên bên trái và giữa bên trái và tính toán phạm vi của các giá trị hợp lệ cho số nguyên giữa, sau đó, đã lặp qua tất cả các phạm vi thích hợp, tính các giá trị còn lại từ các ràng buộc.


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.