Centrosimmetrizzazione minima


11

Correlato attivamente.

Obiettivo: data una matrice di numeri interi positivi , genera la matrice centrosimmetrica più piccola che contiene M (questa matrice può contenere anche numeri interi non positivi).MM

Una matrice centrosimmetrica è una matrice quadrata con simmetria rotazionale dell'ordine 2, ovvero rimane la stessa matrice dopo averla ruotata due volte. Ad esempio, una matrice centrosimmetrica ha l'elemento in alto a sinistra uguale a quello in basso a destra e l'elemento sopra il centro uguale a quello sotto il centro. Una visualizzazione utile può essere trovata qui .

Più formalmente, data una matrice , produrre una matrice quadrata N tale che N è centrosimmetrico e M N , e non v'è altra matrice quadrata K tale che dim K < dim N .MNNMNKdimK<dimN

è un sottoinsieme di B (notazione: A B ) se e solo se ogni valore A i , j appare nell'indice B i + i , j + j per alcune coppie di numeri interi ( i , j ) .ABABAi,jBi+i,j+j(i,j)

Nota : alcune matrici hanno molteplici soluzioni (ad es. [[3,3],[1,2]]Essere risolte come [[2,1,0],[3,3,3],[0,1,2]]o [[3,3,3],[1,2,1],[3,3,3]]); è necessario produrre almeno una delle soluzioni valide.

Casi test

input
example output

[[1, 2, 3],
 [4, 5, 6]]
[[1, 2, 3, 0],
 [4, 5, 6, 0],
 [0, 6, 5, 4],
 [0, 3, 2, 1]]

[[9]]
[[9]]

[[9, 10]]
[[9, 10],
 [10, 9]]

[[100, 200, 300]]
[[100, 200, 300],
 [  0,   0,   0],
 [300, 200, 100]]

[[1, 2, 3],
 [4, 5, 4]]
[[1, 2, 3],
 [4, 5, 4]
 [3, 2, 1]]

[[1, 2, 3],
 [5, 6, 5],
 [3, 2, 1]]
[[1, 2, 3],
 [5, 6, 5],
 [3, 2, 1]]

[[4, 5, 4],
 [1, 2, 3]]
[[3, 2, 1],
 [4, 5, 4],
 [1, 2, 3]]

[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 9, 9, 9, 9, 9, 9, 9],
 [1, 1, 1, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 1]]
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9],
 [1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1],
 [9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1],
 [9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]

Perché le matrici centrosimmetriche devono essere quadrate?
Ad Hoc Garf Hunter il

@WW in senso generale, suppongo che non debba esserlo. Per questa domanda, tuttavia, devono essere quadrati per definizione
Conor O'Brien,

Mi chiedevo perché hai fatto quella scelta
Ad Hoc Garf Hunter il

2
@WW è stata una semplificazione che ho pensato fosse utile per chiarezza
Conor O'Brien,

Risposte:


8

Brachylog , 12 byte

ṁ↔ᵐ↔?aaᵐ.&≜∧

Provalo online!

Contrariamente alla maggior parte delle risposte di Brachylog, questo prende l'input attraverso la variabile Output .e produce il risultato attraverso la variabile Input ?(confuso, lo so).

Spiegazione

ṁ              We expect a square matrix
 ↔ᵐ↔?          When we reverse the rows and then the matrix, we get the initial matrix back
    ?a         Take an adfix (prefix or suffix) of that square matrix
      aᵐ       Take an adfix of each row of that adfix matrix
        .      It must be the input matrix
         &≜    Assign values to cells which are still variables (will assign 0)
           ∧   (disable implicit unification between the input and the output)

8 byte, fornisce tutte le matrici valide

Tecnicamente, questo programma funziona anche:

ṁ↔ᵐ↔?aaᵐ

Ma questo lascerà come variabili le celle che possono assumere qualsiasi valore (mostrano come _XXXXX, che è un nome di variabile Prolog interno). Quindi tecnicamente questo è ancora meglio di quello che viene chiesto, ma immagino che non sia quello che la sfida richiede.


Vorrei che l'etichetta fosse ritardata ...
Erik the Outgolfer,

@EriktheOutgolfer L'etichettatura istantanea è ancora utile quando dobbiamo enumerare le cose, quindi idealmente avremmo bisogno di due predicati diversi ...
Fatalizzare il

4

JavaScript (ES6), 192 180 177 byte

f=(m,v=[w=0],S=c=>v.some(c))=>S(Y=>S(X=>!m[w+1-Y]&!m[0][w+1-X]&!S(y=>S(x=>(k=(m[y-Y]||0)[x-X],g=y=>((r=a[y]=a[y]||[])[x]=r[x]||k|0)-k)(y)|g(w-y,x=w-x)),a=[])))?a:f(m,[...v,++w])

Provalo online!

Algoritmo

w=0

  • Mw+1
  • (X,Y)m

    Esempio:

w=2,(X,Y)=(0,1),m=(4,5,41,2,3)M=(0,0,04,5,41,2,3)
  • Testiamo se possiamo completare la matrice in modo che sia centrosimmetrica.

    Esempio:

M=(3,2,14,5,41,2,3)
  • w


1

Python 2 , 242 227 226 byte

r=range
def f(m):
 w,h=len(m),len(m[0]);W=max(w,h)
 while 1:
	for x in r(1+W-w):
	 for y in r(1+W-h):
		n=n=eval(`[W*[0]]*W`);exec"for i in r(w):n[i+x][y:y+h]=m[i]\nN=n;n=[l[::-1]for l in n[::-1]]\n"*2
		if n==N:return n
	W+=1

Provalo online!


Salvato:

  • -1 byte, grazie a Jonathan Frech

n=[W*[0]for _ in r(W)]può essere n=eval(`[W*[0]]*W`).
Jonathan Frech,

@JonathanFrech Thanks :)
TFeld

1

Clojure 254 byte

(defn e[l m](let[a map v reverse r repeat t concat c count f #(v(a v %))h(fn[x](t(a #(t %(r(- l(c(first x)))0))x)(r(- l(c m))(r l 0))))k(fn[x](a(fn[v w](a #(if(= %2 0)%1 %2)v w))x(f x)))n(k(h m))o(k(h(f m)))z #(= %(f %))](if(z n)n(if(z o)o(e(inc l)m)))))

Jinkies, Scoob

Provalo online!

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.