Tạo ma trận nhị phân khác biệt với phản xạ


14

Dưới đây là tất cả các ma trận nhị phân 2x2

#0  #1  #2  #3  #4  #5  #6  #7  #8  #9  #10 #11 #12 #13 #14 #15
--  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  
00  00  00  00  01  01  01  01  10  10  10  10  11  11  11  11  
00  01  10  11  00  01  10  11  00  01  10  11  00  01  10  11  

Hai ma trận vuông nhị phân là tương đương theo quan hệ ~nếu một có thể được ánh xạ lên nhau bằng bất kỳ số lượng phản xạ trong các trục ngang hoặc dọc .

#1 ~ #2dưới sự phản chiếu trong trục dọc, do đó chúng ta chỉ cần giữ một trong số chúng (không quan trọng cái nào). Tương tự như vậy #3 ~ #12, #6 ~ #9và như vậy.

MỤC TIÊU là tạo ra một chương trình lấy một đầu vào duy nhất Nvà in ra nhiều N x Nma trận nhị phân tồn tại sao cho tất cả các ma trận trong đầu ra đều khác biệt theo quan hệ trên.

Trong mã giả sóng tay, một giải pháp được chấp nhận sẽ là

define M[i] = N by N matrix with bit pattern equal to i

for i = 0 to (2^(N^2)) - 1
    valid = true
    for j = i+1 to (2^(N^2)) - 1
        if (equivalent(M[i], M[j]))
            valid = false
            break
    if (valid)
        print (M[i])

Đối với đầu vào, N=2một đầu ra hợp lệ sẽ là

00  00  00  01  10  01  11
00  01  11  01  01  11  11

Nhưng bằng cách chọn các ma trận khác nhau từ cùng một lớp tương đương, một đầu ra hợp lệ khác sẽ là

00  10  11  11  11  10  01
00  00  00  10  11  10  10

Thứ tự của các ma trận không thành vấn đề, sự lựa chọn cụ thể từ các ma trận tương đương không quan trọng, và khoảng trắng không quan trọng, hãy tạo ra các ma trận theo cách bạn muốn miễn là nó có thể đọc được.

Đầu ra phải đầy đủ.

Mã ngắn nhất sẽ thắng.

EDIT: đây là bài golf đầu tiên của tôi và tôi đã thay đổi suy nghĩ về các tiêu chí chiến thắng.

Mã ngắn nhất trong một ngôn ngữ không được thiết kế đặc biệt cho sự chiến thắng / đánh gôn .

Tôi hy vọng nó không phải là nghi thức xấu để thay đổi tiêu chí hậu hoc này, nhưng tôi nghĩ làm theo ngôn ngữ "bình thường" là một đề xuất thú vị hơn nhiều .


5
Chào mừng đến với PPCG! Đây là một thử thách đầu tiên thú vị, nhưng tôi khuyên bạn nên cho phép mọi người xuất kết quả theo định dạng linh hoạt (ví dụ: mỗi ma trận dưới dạng danh sách các danh sách). Bằng cách đó, mọi người có thể tập trung vào cốt lõi rất thú vị của thử thách (tìm ma trận duy nhất theo đối xứng) thay vì phải lo lắng về việc định dạng đầu ra (có thể dễ dàng lấy nhiều byte và làm cho việc chơi golf trở thành thử thách chính ít hơn quan trọng).
Martin Ender

Cảm ơn phản hồi, cả hai bạn, tôi đã chỉnh sửa câu hỏi cho phù hợp.
spraff

2
Tôi đã cố gắng bao gồm các phép quay như một sự tương đương. Tôi cũng bị cám dỗ bao gồm đảo ngược từng bit như một sự tương đương. Tôi cũng bị cám dỗ bao gồm các hoán vị của các hàng / cột như một sự tương đương. Cuối cùng, tôi đã đưa ra một quyết định tùy tiện để giữ các yêu cầu khá đơn giản. Hãy đăng một biến thể.
spraff

1
Chúng tôi đã thảo luận này trong quá khứ và cai trị chống lại trừ hoặc xử phạt ngôn ngữ nhất định trong các cuộc thi golf mã, có nghĩa là thách thức rằng làm như vậy cần được xem xét off topic. Hơn nữa, câu trả lời được chấp nhận là câu trả lời chiến thắng thử thách , có nghĩa là mã ngắn nhất cho các câu hỏi golf mã. Tóm tắt: Nếu bạn không muốn chấp nhận bất kỳ câu trả lời nào cả , sau đó thì không. Tuy nhiên, nếu bạn chấp nhận một câu trả lời, nó phải là câu trả lời ngắn nhất.
Dennis

1
Cuối cùng, ngôn ngữ Jkhông một ngôn ngữ chơi golf, nhưng một cấp cao, có mục đích chung, hiệu suất cao ngôn ngữ lập trình đã tồn tại suốt 25 năm qua. Ngay cả với các quy tắc hiện tại của bạn, bạn vẫn chấp nhận câu trả lời sai.
Dennis

Câu trả lời:


1

J, 66 56 53 byte

[:~.,~{.@/:~@(2:_&(][:,(;|.;|."1)&>)<)@$"#.2#:@i.@^*:

Tìm kiếm lực lượng vũ phu.

Sử dụng

   f =: [:~.,~{.@/:~@(2:_&(][:,(;|.;|."1)&>)<)@$"#.2#:@i.@^*:
   f 2
┌───┬───┬───┬───┬───┬───┬───┐
│0 0│0 0│0 0│0 1│0 1│0 1│1 1│
│0 0│0 1│1 1│0 1│1 0│1 1│1 1│
└───┴───┴───┴───┴───┴───┴───┘
   # f 3
168
   # f 4
16576

Giải trình

[:~.,~{.@/:~@(2:_&(][:,(;|.;|."1)&>)<)@$"#.2#:@i.@^*:  Input: integer n
                                                   *:  Square n
                                           2      ^    Compute m = 2 ^ (n ^ 2)
                                               i.@     Make a range [0, m)
                                            #:@        Convert each to binary digits
    ,~                                                    Pair, make [n, n]
                                       $"#.            Reshape each binary list
                                                          to a matrix with size [n, n]
             (                       )@                Operate on each
                                    <                    Box it, call x
              2:                                         The constant 2
                _&(                )                     Repeat that many times on x
                       (        )&>                        For each box
                            |."1                             Reverse by column
                         |.                                  Reverse by row
                           ;                                 Join them
                        ;                                    Join with initial
                    [:,                                    Flatten
                   ]                                       Return that as the new x
         /:~@                                          Sort each
      {.@                                              Take the head of each
[:~.                                                   Unique and return

4

Thạch , 19 byte

Ṛ€;U;
2ḶṗṗµWdz¡Ṃµ€Q

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

Làm thế nào nó hoạt động

2ḶṗṗµWdz¡Ṃµ€Q  Main link. Argument: n (integer)

2Ḷ             Unlength 2; yield [0, 1].
  ṗ            Cartesian product; construct all vectors of {0, 1}^n.
   ṗ           Cartesian product; construct all vectors of ({0, 1}^n)^n.
               This yields A, the array of all binary n×n matrices.
    µ     µ€   Begin a new, monadic chain and apply it to all matrices M in A.
     W           Wrap; yield [M].
      dz¡        Call the helper link n times, initially with argument [M], then
                 on the previous return value.
         Ṃ       Take the minimum of the results.
               This replaces all matrices with the lexicographical minimum of their
               equivalence classes, mapping equivalent matrices to the same matrix.
            Q  Unique; deduplicate the resulting array of matrices.

Ṛ€;U;          Helper link. Argument: L (array of matrices)

Ṛ€             Reverse the order of the rows of each M in L.
   U           Reverse the order of the columns of each M in L.
  ;            Concatenate the resulting matrix arrays.
    ;          Concatenate the result with L.

2

Pyth - 24 23 21 byte

Muốn tìm cách tốt hơn để có được tất cả các phản ánh.

Cảm ơn @ Pietu1998 đã chơi golf cho tôi 2 byte!

hM.gS+K_Bk_MMKcRQ^`T*

Hãy thử trực tuyến tại đây .

Sẽ chờ đợi để chơi golf trước khi giải thích đầy đủ, nhưng về cơ bản nó tạo ra tất cả các ma trận nhị phân có thể, sau đó .gphân loại chúng theo danh sách được sắp xếp của tất cả các phản xạ có thể, sau đó chỉ lấy một từ mỗi nhóm.


Nếu tôi chạy nó với đối số 3, đầu ra bắt đầu [['000', '000', '00'],ghi chú số 0 bị thiếu ở cuối.
spraff

@spraff rất tiếc, tôi đã làm ^2Qthay Q^2. sửa lỗi cũng tiết kiệm cho tôi một byte: D
Maltysen

@spraff đã sửa nó.
Maltysen

Tôi khá chắc chắn rằng bạn có thể làm _MMthay vì mC_Cd.
PurkkaKoodari

@ Pietu1998 oh yeah, cảm ơn!
Maltysen

1

Haskell, 100 byte

import Data.List
r=reverse
e#n=mapM id$e<$[1..n]
f n=nubBy(\a b->elem a[r b,r<$>b,r$r<$>b])$"01"#n#n

Ví dụ sử dụng: f 2-> [["00","00"],["00","01"],["00","11"],["01","01"],["01","10"],["01","11"],["11","11"]].

Làm thế nào nó hoạt động:

e#n=mapM id$e<$[1..n]        -- helper function: creates a list of all combinations
                             -- of the elements of e of length n
                             -- "01" # 2 -> ["00","01","10","11"]

                   "01"#n#n  -- creates all binary n x n matrices
nubBy                        -- remove duplicates according to the equivalence
                             -- relation
   \a b ->                   -- a equals b if
       a elem                -- a is an element of
         [r b,r<$>b,r$r<$>b] -- the list of reflections of b 

1

JavaScript (ES6), 195 byte

n=>[...Array(p=1<<n*n)].map(_=>(p++).toString(2).slice(1)).filter((s,i,a)=>![1,0,1].some(c=>a.indexOf((c?b.reverse():b=b.map(s=>[...s].reverse().join``)).join``)<i,b=s.match(eval(`/.{${n}}/g`))))

Trả về các chuỗi đại diện cho tất cả các mục ma trận được nối, ví dụ: 111101111đại diện cho ma trận 3 × 3 của 1s với một 0ở giữa. Giải trình:

n=>[...Array(p=1<<n*n)].map(            Enumerate all binary matrices
 _=>(p++).toString(2).slice(1)          Convert to padded binary
).filter((s,i,a)=>![1,0,1].some(        Check reflections of each matrix
 c=>a.indexOf((c?b.reverse():           Reverse the order of lines
  b=b.map(s=>[...s].reverse().join``    Or reverse each line
  )).join``)<i,                         Has this been seen before?
 b=s.match(eval(`/.{${n}}/g`))))        Reshape string into a square

Hàm số nhị phân-đệ quy có độ dài chính xác như nhau:.map(f=(x=p++)=>x>1?f(x>>1)+x%2:"")
Sản phẩm ETH

1

Toán học, 94 byte

DeleteDuplicatesBy[{0,1}~Tuples~{#,#},Sort@Join[Join@@Outer[Reverse,{#},{1,2,{1,2}},1],{#}]&]&

1
Xin chào! Cảm ơn câu trả lời. Tôi không hiểu rõ về Mathicala, vì vậy bạn có thể thêm một chút giải thích về những gì đang xảy ra không? (Tôi đã đăng điều tương tự trên câu trả lời gần đây khác của bạn. Đưa ra một số lời giải thích là một kỳ vọng mạnh mẽ cho câu trả lời trên trang web này)
isaacg

0

JavaScript (ES6), 184

Điều này hóa ra khá giống với Neil, nhưng tất cả trong tất cả các mánh khóe trong javascript không quá đa dạng.

n=>eval("r=x=>[...x].reverse();for(l='',i=m=1<<n*n;i<m+m;i++)a=i.toString(2).slice(1).match(eval(`/.{${n}}/g`)),[b=a.map(x=>r(x).join``),r(a),r(b)].some(x=>~l.search(x))?0:l+=a+`\n`")

Ít chơi gôn

n=>{
  r = x =>[...x].reverse();
  for(l = '', i = m = 1<<n*n; i < m+m; i++)
    a = i.toString(2).slice(1).match(eval(`/.{${n}}/g`)), // base matrix as an array of strings
    b = a.map(x => r(x).join``), // horizontal reflection
    c = r(a), // vertical reflection
    d = r(b), // both reflections
    // check if already found 
    [b, c, d].some(x => ~l.search(x)) // using search, arrays are converted to comma separated strings 
      ? 0 
      : l += a+`\n` // add new found to list (again as a comma separated string)
  return l
}

Kiểm tra Cẩn thận, ngay cả đối với đầu vào 4, thời gian chạy quá dài

f=n=>eval("r=x=>[...x].reverse();for(l='',i=m=1<<n*n;i<m+m;i++)a=i.toString(2).slice(1).match(eval(`/.{${n}}/g`)),[b=a.map(x=>r(x).join``),r(a),r(b)].some(x=>~l.search(x))?0:l+=a+`\n`")

function update() {
  var i=+I.value;
  
  result = f(i)
  count = result.split('\n').length
  O.textContent = count+'\n'+result
}

update()
Input <select id=I onchange="update()"><option>2<option>3<option>4<option>5</select>
<pre id=O></pre>

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.