สร้างเมทริกซ์ไบนารีที่แตกต่างกันตามการสะท้อนกลับ


14

นี่คือเมทริกซ์ไบนารี 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  

สองตารางการฝึกอบรมไบนารีเทียบเท่าภายใต้ความสัมพันธ์~ถ้าใครสามารถแมปบนอื่น ๆ โดยหมายเลขใด ๆ ของการสะท้อนความเห็นในแกนนอนหรือแนวตั้ง

#1 ~ #2ภายใต้การไตร่ตรองในแกนตั้งดังนั้นเราจะต้องเก็บหนึ่งในนั้นไว้ (ไม่เป็นไร) ในทำนองเดียวกัน#3 ~ #12, #6 ~ #9และอื่น ๆ

เป้าหมายคือการสร้างโปรแกรมที่รับอินพุตเดี่ยวNและพิมพ์N x Nเมทริกซ์ไบนารีจำนวนมากเท่าที่มีอยู่เช่นเมทริกซ์ทั้งหมดในเอาต์พุตจะแตกต่างกันภายใต้ความสัมพันธ์ข้างต้น

ในปลอม pseudocode มือโซลูชั่นที่ยอมรับได้จะเป็น

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

สำหรับอินพุตN=2หนึ่งเอาต์พุตที่ถูกต้องจะเป็น

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

แต่ด้วยการเลือกเมทริกซ์ที่แตกต่างจากคลาสความเท่ากันผลลัพธ์อื่นที่ถูกต้องก็คือ

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

ลำดับของเมทริกซ์ไม่สำคัญตัวเลือกเฉพาะจากเมทริกซ์เทียบเท่าไม่สำคัญและช่องว่างไม่สำคัญเอาท์พุทเมทริกซ์ แต่คุณชอบตราบเท่าที่มนุษย์อ่านได้

ผลลัพธ์จะต้องครบถ้วนสมบูรณ์

รหัสที่สั้นที่สุดชนะ

แก้ไข: นี่คือโพสต์กอล์ฟครั้งแรกของฉันและฉันเปลี่ยนใจในเกณฑ์การชนะ

รหัสสั้นที่สุดในภาษาที่ไม่ได้ออกแบบมาโดยเฉพาะเพื่อความกระชับ /ชนะกอล์ฟ

ฉันหวังว่ามันไม่ได้เป็นมารยาทที่ไม่ดีในการเปลี่ยนเกณฑ์การโพสต์นี้ แต่ฉันคิดว่าการทำในภาษา "ปกติ" เป็นข้อเสนอที่น่าสนใจมากขึ้น


5
ยินดีต้อนรับสู่ PPCG! นี่เป็นความท้าทายครั้งแรกที่ดี แต่ฉันขอแนะนำให้คนอื่นแสดงผลลัพธ์ในรูปแบบที่ยืดหยุ่น (เช่นแต่ละเมทริกซ์เป็นรายการของรายการ) ด้วยวิธีนี้ผู้คนสามารถมุ่งความสนใจไปที่แก่นแท้ของความท้าทาย (การค้นหาเมทริกซ์ที่ไม่ซ้ำใครจนถึงสมมาตร) แทนที่จะต้องกังวลเกี่ยวกับการจัดรูปแบบเอาต์พุต (ซึ่งอาจใช้เวลาเพียงไบต์จำนวนมาก สำคัญ).
Martin Ender

ขอบคุณสำหรับคำติชมทั้งสองท่านฉันได้แก้ไขคำถามตามนั้น
spraff

2
ฉันถูกล่อลวงให้ใส่การหมุนในลักษณะที่เท่ากัน ฉันถูกล่อลวงให้รวมการสลับค่าแต่ละบิตเป็นค่าเท่ากัน ฉันถูกล่อลวงให้รวมการเรียงสับเปลี่ยนของแถว / คอลัมน์เข้าด้วยกันด้วย ในที่สุดฉันตัดสินใจโดยพลการเพื่อให้ข้อกำหนดเป็นเรื่องง่าย โพสต์รูปแบบต่างๆได้ฟรี
spraff

1
เราได้พูดถึงเรื่องนี้ในอดีตและจัดการกับการยกเว้นหรือลงโทษบางภาษาในการแข่งขันกอล์ฟรหัสซึ่งหมายความว่าความท้าทายที่ทำเช่นนั้นควรได้รับการพิจารณานอกหัวข้อ นอกจากนี้คำตอบที่ได้รับการยอมรับคือคำตอบที่ชนะการท้าทายซึ่งหมายถึงรหัสที่สั้นที่สุดสำหรับคำถามกอล์ฟ สรุป: หากคุณไม่ต้องการที่จะยอมรับคำตอบใด ๆที่ทุกคนแล้วทำไม่ได้ อย่างไรก็ตามหากคุณยอมรับคำตอบคำตอบนั้นจะต้องสั้นที่สุด
เดนนิส

1
สุดท้ายภาษาเจคือไม่เป็นภาษาการเล่นกอล์ฟ แต่ระดับสูงวัตถุประสงค์ทั่วไปที่มีประสิทธิภาพสูงภาษาการเขียนโปรแกรมที่มีอยู่เป็นเวลา 25 ปี แม้ว่ากฎปัจจุบันของคุณคุณยังคงยอมรับคำตอบที่ผิด
เดนนิส

คำตอบ:


1

J, 66 56 53 ไบต์

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

ค้นหากำลังดุร้าย

การใช้

   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

คำอธิบาย

[:~.,~{.@/:~@(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

เยลลี่ขนาด 19 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

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

อยากมองหาวิธีที่ดีกว่าในการสะท้อนทั้งหมด

ขอบคุณ @ Pietu1998 สำหรับการเล่นกอล์ฟฉัน 2 ไบต์!

hM.gS+K_Bk_MMKcRQ^`T*

ลองมันออนไลน์ได้ที่นี่

จะรอกอล์ฟก่อนที่จะทำคำอธิบายแบบเต็ม ๆ แต่มันก็ทำให้เมทริกซ์ไบนารี่เป็นไปได้ทั้งหมดแล้วเรา.gเตอร์พวกมันด้วยรายการที่เรียงลำดับของการสะท้อนที่เป็นไปได้ทั้งหมดแล้วใช้เพียงหนึ่งกลุ่มเท่านั้นจากแต่ละกลุ่ม


ถ้าฉันเรียกใช้ด้วยอาร์กิวเมนต์3ผลลัพธ์จะเริ่ม[['000', '000', '00'],จากศูนย์ที่หายไปในตอนท้าย
spraff

@spraff ขออภัยผมแทน^2Q Q^2การแก้ไขช่วยฉันด้วยเช่นกัน: D
Maltysen

@ spraff แก้ไขแล้ว
Maltysen

ผมค่อนข้างมั่นใจว่าคุณสามารถทำแทน_MM mC_Cd
PurkkaKoodari

@ Pietu1998 โอ้ใช่ขอบคุณ!
Maltysen

1

Haskell, 100 ไบต์

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

ตัวอย่างการใช้งาน: ->f 2[["00","00"],["00","01"],["00","11"],["01","01"],["01","10"],["01","11"],["11","11"]]

มันทำงานอย่างไร:

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

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`))))

ส่งคืนสตริงที่แสดงรายการเมทริกซ์ทั้งหมดที่ต่อกันเช่น111101111แทนเมทริกซ์ขนาด 3 × 3 ของ1s โดยมี a 0อยู่ตรงกลาง คำอธิบาย:

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

ฟังก์ชัน number-to-binary แบบเรียกซ้ำมีความยาวเท่ากัน:.map(f=(x=p++)=>x>1?f(x>>1)+x%2:"")
ETHproductions

1

Mathematica, 94 ไบต์

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

1
สวัสดี JHM! ขอบคุณสำหรับคำตอบ. ฉันไม่เข้าใจ Mathematica เป็นอย่างดีดังนั้นคุณสามารถเพิ่มคำอธิบายเล็กน้อยเกี่ยวกับสิ่งที่เกิดขึ้นได้หรือไม่? (ผมโพสต์ในสิ่งเดียวกันกับคำตอบล่าสุดอื่น ๆ ของคุณให้คำอธิบายบางอย่างเป็นความคาดหวังที่แข็งแกร่งสำหรับคำตอบเกี่ยวกับเว็บไซต์นี้.)
isaacg

0

JavaScript (ES6), 184

สิ่งนี้กลายเป็นว่าค่อนข้างคล้ายกับของ Neil แต่ในกลวิธีทั้งหมดใน javascript นั้นมีความหลากหลายไม่มากนัก

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`")

น้อย golfed

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
}

ทดสอบระวังแม้กระทั่งสำหรับอินพุต 4 เวลาทำงานนานเกินไป

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>

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