Створюйте двійкові матриці, які відрізняються відбиттями


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бінарних матриць, скільки існує, щоб усі матриці у виводі були чіткими у вказаному вище співвідношенні.

У псевдокоді, що розмахує рукою, прийнятне рішення було б

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

Порядок матриць не має значення, конкретний вибір з еквівалентних матриць не має значення, а пробіл не має значення, виведіть матриці, як вам подобається, поки вони читаються людиною.

Вихід повинен бути вичерпним.

Найкоротший код виграє.

EDIT: це мій перший пост у гольфі, і я передумав щодо критеріїв виграшу.

Найкоротший код мовою, спеціально не розробленою для лаконічності / перемоги в гольфі .

Я сподіваюся, що непогано змінити цей критерій після критеріїв, але я вважаю, що це зробити "нормальною" мовою - набагато цікавіше пропозиція.


5
Ласкаво просимо до PPCG! Це хороший перший виклик, але я б рекомендував дозволити людям виводити результат у гнучкому форматі (наприклад, кожна матриця як список списків). Таким чином люди можуть зосередитись на дуже цікавій суті завдання (знайти унікальні матриці до симетрії), а не турбуватися про форматування результату (який міг би легко взяти стільки ж байтів і зробити гольф головним викликом менше важливо).
Мартін Ендер

Дякую за відгук, ви обидва, я відповідним чином відредагував це питання.
спрей

2
Мене спокусило включити обертання як еквівалент. Я також спокусився включити інвертування кожного біта як еквівалентність. Я також спокусився включити перестановки рядків / стовпців як еквівалент. Врешті-решт, я прийняв довільне рішення, щоб зберегти вимоги досить просто. Сміливо публікуйте варіацію.
спрей

1
Ми обговорювали це в минулому , і винесли рішення проти виключення або покарань певних мов в змаганнях коду для гольфу, а це означає , що виклик, зробити це слід розглядати не по темі. Крім того, прийнята відповідь - це відповідь, яка перемагає виклик , що означає найкоротший код для кодових питань про гольф. Підводячи підсумок: Якщо ви не хочете приймати будь - яку відповідь на всі , то немає. Однак якщо ви приймаєте відповідь, вона повинна бути найкоротшою.
Денніс

1
Нарешті, мова J - це не мова для гольфу, а високомовна, високопродуктивна мова програмування загального призначення, яка існує вже 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 whoops, я зробив ^2Qзамість цього Q^2. fix врятує мене і байт: D
Мальтісен

@spraff виправив це.
Малтісен

Я впевнений, що ви можете це зробити _MMзамість цього mC_Cd.
PurkkaKoodari

@ Pietu1998 о так, дякую!
Малтісен

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

Рекурсивна функція число-до-бінарної .map(f=(x=p++)=>x>1?f(x>>1)+x%2:"")
рівномірної

1

Математика, 94 байти

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

1
Привіт JHM! Дякую за відповідь. Я не дуже добре розумію Mathematica, тому ви можете додати трохи пояснень щодо того, що відбувається? (Я те саме написав у вашій іншій нещодавній відповіді. Дати пояснення - це сильне очікування відповідей на цьому веб-сайті)
isaacg

0

JavaScript (ES6), 184

Це виявилося досить схожим на Ніла, але в цілому мішок хитрощів у 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`")

Менше гольфу

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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.