Centrosymétrisation minimale

11

Relativement d'actualité.

Objectif: étant donné une matrice d'entiers positifs , sortir la plus petite matrice centrosymétrique qui contient (cette matrice peut également contenir des entiers non positifs).MMM

Une matrice centrosymétrique est une matrice carrée avec une symétrie de rotation d'ordre 2, c'est-à-dire qu'elle reste la même matrice après deux rotations. Par exemple, une matrice centrosymétrique a l'élément en haut à gauche identique à celui en bas à droite et l'élément au-dessus du centre identique à celui en dessous du centre. Une visualisation utile peut être trouvée ici .

Plus formellement, étant donné une matrice , produire une matrice carrée telle que est centrosymétrique et , et il n'y a pas d' autre matrice carrée telle que .N N M N K dim K < dim NMNNMNKdimK<dimN

B A B A i , j B i + i , j + j ( i , j )A est un sous-ensemble de (notation: ) si et seulement si chaque valeur apparaît à l'index pour une paire d'entiers .BABAi,jBi+i,j+j(i,j)

Remarque : certaines matrices ont plusieurs solutions (par exemple, [[3,3],[1,2]]être résolues en tant que [[2,1,0],[3,3,3],[0,1,2]]ou [[3,3,3],[1,2,1],[3,3,3]]); vous devez générer au moins une des solutions valides.

Cas de 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]]
Conor O'Brien
la source
Pourquoi les matrices centrosymétriques doivent-elles être carrées?
Ad Hoc Garf Hunter
@WW dans un sens général, je ne suppose pas que ce soit le cas. Pour cette question, cependant, ils doivent être carrés par définition
Conor O'Brien
Je me demandais pourquoi vous aviez fait ce choix
Ad Hoc Garf Hunter
2
@WW c'était une simplification que je pensais utile pour la clarté
Conor O'Brien

Réponses:

8

Brachylog , 12 octets

ṁ↔ᵐ↔?aaᵐ.&≜∧

Essayez-le en ligne!

Contrairement à la plupart des réponses Brachylog, cela prend l'entrée via la variable Output .et produit le résultat via la variable Input ?(déroutant, je sais).

Explication

ṁ              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 octets, donne toutes les matrices valides

Techniquement, ce programme fonctionne également:

ṁ↔ᵐ↔?aaᵐ

Mais cela laissera comme variables les cellules qui peuvent prendre n'importe quelle valeur (elles apparaissent comme _XXXXX, qui est un nom de variable Prolog interne). Donc, techniquement, c'est encore mieux que ce qui est demandé, mais je suppose que ce n'est pas ce que le défi demande.

Fatalize
la source
Je souhaite que l'étiquetage soit retardé ...
Erik the Outgolfer
@EriktheOutgolfer L'étiquetage instantané est toujours utile lorsque nous devons énumérer des choses, donc idéalement, nous aurions besoin de deux prédicats différents…
Fatalize
4

JavaScript (ES6), 192 180 177 octets

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

Essayez-le en ligne!

Algorithme

En commençant par :w=0

  • Nous considérons une matrice de conteneurs carrée de largeur .Mw+1
  • Nous considérons chaque paire telle sorte que la matrice d'entrée puisse tenir dans la matrice du conteneur lorsqu'elle est insérée à ces coordonnées.(X,Y)m

    Exemple:

w=2,(X,Y)=(0,1),m=(4,5,41,2,3)M=(0,0,04,5,41,2,3)
  • Nous testons si nous pouvons compléter la matrice de telle sorte qu'elle soit centrosymétrique.

    Exemple:

M=(3,2,14,5,41,2,3)
  • Nous incrémentons jusqu'à ce que nous trouvions une telle configuration valide.w
Arnauld
la source
1

Gelée , 27 octets

oZ0ṁz0o⁸ṚUŻ€Z$2¡LСo⁸ṚU$ƑƇḢ

Essayez-le en ligne!

Ajout de nouvelles lignes à la sortie réelle sur TIO pour plus de clarté.

Erik le Outgolfer
la source
1

Python 2 , 242 227 226 octets

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

Essayez-le en ligne!


Enregistré:

  • -1 octet, merci à Jonathan Frech
TFeld
la source
n=[W*[0]for _ in r(W)]peut être n=eval(`[W*[0]]*W`).
Jonathan Frech
@JonathanFrech Merci :)
TFeld
1

Clojure 254 octets

(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

Essayez-le en ligne!

Lispy Louie
la source