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

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.


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


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

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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.