Genera matrici binarie che si distinguono per le riflessioni


14

Ecco tutte le matrici binarie 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  

Due matrici quadrate binarie sono equivalenti sotto la relazione ~se una può essere mappata sull'altra da un numero qualsiasi di riflessi negli assi orizzontale o verticale .

#1 ~ #2riflesso nell'asse verticale, quindi dobbiamo solo mantenere uno di questi (non importa quale). Allo stesso modo #3 ~ #12, #6 ~ #9e così via.

L'obiettivo è produrre un programma che accetta un singolo input Ne stampa tutte N x Nle matrici binarie esistenti in modo tale che tutte le matrici nell'output siano distinte in base alla relazione precedente.

Nello pseudocodice ondulato a mano, sarebbe una soluzione ammissibile

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

Per l'ingresso N=2sarebbe valido un output

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

Ma selezionando matrici diverse dalla stessa classe di equivalenza sarebbe un altro output valido

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

L'ordine delle matrici non ha importanza, la scelta particolare tra matrici equivalenti non ha importanza e gli spazi bianchi non contano, producono le matrici come preferisci purché sia ​​leggibile dall'uomo.

L'output deve essere esaustivo.

Il codice più corto vince.

EDIT: questo è il mio primo post di golf e ho cambiato idea sui criteri vincenti.

Codice più corto in una lingua non specificatamente progettata per le vittorie di conciseness / golf .

Spero che non sia una cattiva etichetta cambiare questo criterio post-hoc, ma penso che farlo in un linguaggio "normale" sia una proposta molto più interessante .


5
Benvenuti in PPCG! Questa è una bella prima sfida, ma consiglierei di consentire alle persone di produrre il risultato in un formato flessibile (ad esempio ogni matrice come un elenco di elenchi). In questo modo le persone possono concentrarsi sul nucleo molto interessante della sfida (trovare le matrici uniche fino alle simmetrie) invece di doversi preoccupare anche di formattare l'output (che potrebbe facilmente prendere altrettanti byte e ridurre il golf della sfida principale importante).
Martin Ender,

Grazie per il feedback, entrambi, ho modificato la domanda di conseguenza.
spruzzo

2
Sono stato tentato di includere le rotazioni come equivalenza. Sono stato anche tentato di includere l'inversione di ogni bit come equivalenza. Sono stato anche tentato di includere le permutazioni di righe / colonne come equivalenza. Alla fine, ho preso una decisione arbitraria per mantenere i requisiti abbastanza semplici. Sentiti libero di pubblicare una variante.
spruzzo

1
Ne abbiamo discusso in passato e ci siamo dichiarati contrari all'esclusione o alla penalizzazione di determinate lingue nelle competizioni di golf di codice, il che significa che la sfida in tal senso dovrebbe essere considerata fuori tema. Inoltre, la risposta accettata è la risposta che vince la sfida , il che significa il codice più breve per le domande di golf del codice. Riassumendo: Se non si desidera accettare una risposta a tutti , allora non farlo. Tuttavia, se si accetta una risposta, deve essere la più breve.
Dennis,

1
Infine, il linguaggio J non è un linguaggio da golf, ma un linguaggio di programmazione di alto livello, generico e ad alte prestazioni che esiste da 25 anni. Anche con le tue regole attuali, hai ancora accettato la risposta sbagliata.
Dennis,

Risposte:


1

J, 66 56 53 byte

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

Ricerca della forza bruta.

uso

   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

Spiegazione

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

Gelatina , 19 byte

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

Provalo online!

Come funziona

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

Vuoi cercare un modo migliore per ottenere tutti i riflessi.

Grazie a @ Pietu1998 per avermi golf 2 byte!

hM.gS+K_Bk_MMKcRQ^`T*

Provalo online qui .

Andare ad aspettare il golf prima di fare una spiegazione completa, ma fondamentalmente rende tutte le possibili matrici binarie, quindi le .gesegue il rooting dall'elenco ordinato di tutte le possibili riflessioni, quindi ne prende solo una da ciascun gruppo.


Se lo eseguo con argomento, 3l'output inizia a [['000', '000', '00'],notare lo zero mancante alla fine.
spruzzo

@spraff whoops, l'ho fatto ^2Qinvece di Q^2. fix mi salva anche un byte: D
Maltysen

@spraff ha risolto il problema.
Maltysen

Sono abbastanza sicuro che puoi fare _MMinvece di mC_Cd.
PurkkaKoodari,

@ Pietu1998 oh sì, grazie!
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

Esempio di utilizzo: f 2-> [["00","00"],["00","01"],["00","11"],["01","01"],["01","10"],["01","11"],["11","11"]].

Come funziona:

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

Restituisce le stringhe che rappresentano tutte le voci di matrice concatenate, ad esempio 111101111rappresenta una matrice 3 × 3 di 1s con 0a al centro. Spiegazione:

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

Una funzione ricorsiva da numero a binario ha esattamente la stessa lunghezza:.map(f=(x=p++)=>x>1?f(x>>1)+x%2:"")
ETHproductions

1

Mathematica, 94 byte

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

1
Ciao JHM! Grazie per la risposta. Non capisco molto bene Mathematica, quindi potresti aggiungere qualche spiegazione su cosa sta succedendo? (Ho pubblicato la stessa cosa sull'altra tua recente risposta. Dare qualche spiegazione è una forte aspettativa di risposte su questo sito)
isaacg

0

JavaScript (ES6), 184

Questo si è rivelato abbastanza simile a quello di Neil, ma tutto sommato la borsa dei trucchi in JavaScript non è così diversa.

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

Meno golf

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
}

Test Attenzione, anche per l'ingresso 4 il tempo di esecuzione è eccessivamente lungo

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>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.