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

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.


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


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

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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.