Minimale Zentrosymmetrisierung

11

Aktuell verwandt.

Ziel: Bei einer Matrix aus positiven ganzen Zahlen wird die kleinste zentrosymmetrische Matrix ausgegeben, die M enthält (diese Matrix kann auch nicht positive ganze Zahlen enthalten).MM

Eine zentrosymmetrische Matrix ist eine quadratische Matrix mit Rotationssymmetrie der Ordnung 2 - dh sie bleibt nach zweimaligem Drehen dieselbe Matrix. Beispielsweise hat eine zentrosymmetrische Matrix das gleiche Element oben links wie das Element unten rechts und das Element über der Mitte das gleiche wie das Element unterhalb der Mitte. Eine nützliche Visualisierung finden Sie hier .

Wenn eine Matrix , erzeugen Sie formeller eine quadratische Matrix N, so dass N zentrosymmetrisch und M N ist , und es gibt keine andere quadratische Matrix K, so dass dim K < dim N ist .MNNMNKdimK<dimN

istgenau danneine Teilmenge von B (Notation: A B ), wenn jeder Wert A i , j für ein Paar von ganzen Zahlen ( i ' , j ' ) am Index B i + i ' , j + j ' erscheint .ABABAi,jBi+i,j+j(i,j)

Hinweis : Einige Matrizen haben mehrere Lösungen (z. B. [[3,3],[1,2]]als [[2,1,0],[3,3,3],[0,1,2]]oder gelöst [[3,3,3],[1,2,1],[3,3,3]]). Sie müssen mindestens eine der gültigen Lösungen ausgeben.

Testfälle

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
quelle
Warum müssen zentrosymmetrische Matrizen quadratisch sein?
Post Rock Garf Hunter
@WW im Allgemeinen, ich nehme nicht an, dass es sein muss. Für diese Frage müssen sie jedoch per Definition quadratisch sein
Conor O'Brien
Ich habe mich gefragt, warum Sie diese Wahl getroffen haben
Post Rock Garf Hunter
2
@WW es war eine Vereinfachung, die ich aus Gründen der Klarheit für nützlich hielt
Conor O'Brien

Antworten:

8

Brachylog , 12 Bytes

ṁ↔ᵐ↔?aaᵐ.&≜∧

Probieren Sie es online aus!

Im Gegensatz zu den meisten Brachylog-Antworten wird die Eingabe über die Ausgabevariable .und das Ergebnis über die Eingabevariable ausgegeben ?(verwirrend, ich weiß).

Erläuterung

ṁ              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 Bytes, gibt alle gültigen Matrizen an

Technisch funktioniert dieses Programm auch:

ṁ↔ᵐ↔?aaᵐ

Dadurch bleiben jedoch die Zellen als Variablen übrig, die einen beliebigen Wert annehmen können (sie zeigen als _XXXXX, was ein interner Prolog-Variablenname ist). Technisch gesehen ist dies sogar noch besser als gefragt, aber ich denke, es ist nicht das, was die Herausforderung verlangt.

Fatalisieren
quelle
Ich wünschte, die Etikettierung hätte sich verzögert ...
Erik der Outgolfer
@EriktheOutgolfer Die sofortige Beschriftung ist immer noch nützlich, wenn wir Dinge aufzählen müssen.
Idealerweise
4

JavaScript (ES6), 192 180 177 Bytes

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

Probieren Sie es online aus!

Algorithmus

w=0

  • Mw+1
  • (X,Y)m

    Beispiel:

w=2,(X,Y)=(0,1),m=(4,5,41,2,3)M=(0,0,04,5,41,2,3)
  • Wir testen, ob wir die Matrix so vervollständigen können, dass sie zentrosymmetrisch ist.

    Beispiel:

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

Gelee , 27 Bytes

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

Probieren Sie es online aus!

Aus Gründen der Übersichtlichkeit wurden Zeilenumbrüche zur tatsächlichen Ausgabe über TIO hinzugefügt.

Erik der Outgolfer
quelle
1

Python 2 , 242 227 226 Bytes

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

Probieren Sie es online aus!


Gerettet:

  • -1 Byte, danke an Jonathan Frech
TFeld
quelle
n=[W*[0]for _ in r(W)]kann sein n=eval(`[W*[0]]*W`).
Jonathan Frech
@ JonathanFrech Danke :)
TFeld
1

Clojure 254 Bytes

(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

Probieren Sie es online aus!

Lispy Louie
quelle