Minimalna centrosymetryzacja

11

Tematycznie powiązany.

Cel: Biorąc pod uwagę macierz dodatnich liczb całkowitych , wyprowadza najmniejszą centrosymetryczną macierz, która zawiera M (ta macierz może również zawierać nie dodatnie liczby całkowite).MM

Macierz centrosymetryczna jest macierzą kwadratową o symetrii obrotowej rzędu 2 - tzn. Pozostaje tą samą macierzą po dwukrotnym obróceniu. Na przykład macierz centrosymetryczna ma lewy górny element taki sam jak prawy dolny prawy, a element nad środkiem taki sam jak ten poniżej środka. Przydatna wizualizacja znajduje się tutaj .

Bardziej formalnie biorąc pod uwagę macierz , tworzą kwadratową macierz N taki sposób, że N jest centrosymmetric i M N , a nie ma innego kwadratowych macierzy K , tak że słabe K < słabym N .MNNMNKdimK<dimN

jest podzbiorem B (notacja: A B ) wtedy i tylko wtedy, gdy każda wartość A i , j pojawia się przy indeksie B i + i , j + j dla niektórych par liczb całkowitych ( i , j ) .ABABAi,jBi+i,j+j(i,j)

Uwaga : niektóre macierze mają wiele rozwiązań (np. [[3,3],[1,2]]Są rozwiązywane jako [[2,1,0],[3,3,3],[0,1,2]]lub [[3,3,3],[1,2,1],[3,3,3]]); musisz wypisać co najmniej jedno z poprawnych rozwiązań.

Przypadki testowe

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
źródło
Dlaczego macierze centrosymetryczne muszą być kwadratowe?
Ad Hoc Garf Hunter
@WW w ogólnym sensie, nie sądzę, że tak musi być. Jednak w przypadku tego pytania muszą one być z definicji kwadratowe
Conor O'Brien
Zastanawiałem się, dlaczego dokonaliście tego wyboru
Ad Hoc Garf Hunter
2
@WW było to uproszczenie, które uznałem za przydatne dla jasności
Conor O'Brien

Odpowiedzi:

8

Brachylog , 12 bajtów

ṁ↔ᵐ↔?aaᵐ.&≜∧

Wypróbuj online!

W przeciwieństwie do większości odpowiedzi Brachylog, pobiera dane wejściowe przez zmienną wyjściową .i przekazuje wynik przez zmienną wejściową ?(mylące, wiem).

Wyjaśnienie

ṁ              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 bajtów, daje wszystkie prawidłowe macierze

Technicznie ten program działa również:

ṁ↔ᵐ↔?aaᵐ

Ale to pozostawi jako zmienne komórki, które mogą przyjąć dowolną wartość (pokazują jako _XXXXX, która jest wewnętrzną nazwą zmiennej Prolog). Więc technicznie jest to nawet lepsze niż to, o co pytamy, ale myślę, że nie o to prosi wyzwanie.

Fatalizować
źródło
Chciałbym opóźnić etykietowanie ...
Erik the Outgolfer
@EriktheOutgolfer Natychmiastowe etykietowanie jest nadal przydatne, gdy musimy wyliczyć rzeczy, więc idealnie potrzebowalibyśmy dwóch różnych predykatów…
Fatalize 6'18
4

JavaScript (ES6), 192 180 177 bajtów

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

Wypróbuj online!

Algorytm

w=0

  • Mw+1
  • (X,Y)m

    Przykład:

w=2,(X,Y)=(0,1),m=(4,5,41,2,3)M=(0,0,04,5,41,2,3)
  • Testujemy, czy możemy uzupełnić macierz tak, aby była ona centrosymetryczna.

    Przykład:

M=(3,2,14,5,41,2,3)
  • w
Arnauld
źródło
1

Galaretka , 27 bajtów

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

Wypróbuj online!

Dla jasności dodano nowe linie do rzeczywistej wydajności w porównaniu z TIO.

Erik the Outgolfer
źródło
1

Python 2 , 242 227 226 bajtów

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

Wypróbuj online!


Zapisano:

  • -1 bajt, dzięki Jonathan Frech
TFeld
źródło
n=[W*[0]for _ in r(W)]może być n=eval(`[W*[0]]*W`).
Jonathan Frech,
@JonathanFrech Thanks :)
TFeld
1

Clojure 254 bajtów

(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

Wypróbuj online!

Lispy Louie
źródło