Centrosimetrização mínima

11

Relacionado topicamente.

Objetivo: Dada uma matriz de números inteiros positivos , produza a menor matriz centrimétrica que contém (essa matriz também pode conter números inteiros não positivos).MMM

Uma matriz centrossimétrica é uma matriz quadrada com simetria rotacional da ordem 2 - isto é, permanece a mesma matriz depois de girá-la duas vezes. Por exemplo, uma matriz centrossimétrica tem o elemento superior esquerdo igual ao canto inferior direito e o elemento acima do centro o mesmo que o abaixo do centro. Uma visualização útil pode ser encontrada aqui .

Mais formalmente, dada uma matriz , produzir uma matriz quadrada tal que é centrossimétrica e , e não há nenhum outro matriz quadrada de tal modo 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 é um subconjunto de (notação: ) se e somente se cada valor aparecer no índice para alguns pares de números inteiros .BABAi,jBi+i,j+j(i,j)

Nota : algumas matrizes têm várias soluções (por exemplo, [[3,3],[1,2]]sendo resolvidas como [[2,1,0],[3,3,3],[0,1,2]]ou [[3,3,3],[1,2,1],[3,3,3]]); você deve gerar pelo menos uma das soluções válidas.

Casos de teste

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
fonte
Por que matrizes centrossimétricas precisam ser quadradas?
Post Rock Garf Hunter
@WW em um sentido geral, acho que não. Para esta questão, no entanto, eles devem ser quadrado por definição
Conor O'Brien
Eu queria saber por que você fez essa escolha
post rock Garf Hunter
2
@WW era uma simplificação eu pensava ser útil para maior clareza
Conor O'Brien

Respostas:

8

Braquilog , 12 bytes

ṁ↔ᵐ↔?aaᵐ.&≜∧

Experimente online!

Ao contrário da maioria das respostas do Brachylog, isso recebe a entrada pela variável Output .e gera o resultado pela variável Input ?(confuso, eu sei).

Explicação

ṁ              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, fornece todas as matrizes válidas

Tecnicamente, este programa também funciona:

ṁ↔ᵐ↔?aaᵐ

Mas isso deixará como variáveis ​​as células que podem assumir qualquer valor (elas são exibidas como _XXXXX, que é um nome de variável interno do Prolog). Então, tecnicamente, isso é ainda melhor do que o solicitado, mas acho que não é o que o desafio pede.

Fatalizar
fonte
Eu desejo que atrasou rotulagem ...
Erik o Outgolfer
Rotulagem instantâneo @EriktheOutgolfer ainda é útil quando precisamos de coisas Enumerar, portanto o ideal seria preciso dois predicados diferentes ...
Fatalize
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])

Experimente online!

Algoritmo

w=0

  • Mw+1
  • (X,Y)m

    Exemplo:

w=2,(X,Y)=(0,1),m=(4,5,41,2,3)M=(0,0,04,5,41,2,3)
  • Testamos se podemos concluir a matriz de forma que seja centrossimétrica.

    Exemplo:

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

Gelatina , 27 bytes

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

Experimente online!

Novas linhas adicionadas à saída real sobre o TIO para maior clareza.

Erik, o Outgolfer
fonte
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

Experimente online!


Salvou:

  • -1 byte, graças a Jonathan Frech
TFeld
fonte
n=[W*[0]for _ in r(W)]pode ser n=eval(`[W*[0]]*W`).
Jonathan Frech
@JonathanFrech Thanks :)
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

Experimente online!

Lispy Louie
fonte