Minimal Centrosimetri


11

Topikal olarak ilgili.

Amaç: Pozitif tamsayılar bir matrisi göz önüne alındığında , M içeren en küçük sentrosimetrik matris (bu matris pozitif olmayan tamsayılar da içerebilir) üretir .MM

Bir merkez-simetrik matris, 2. sıradaki dönme simetrisine sahip kare bir matristir - yani iki kez döndürdükten sonra aynı matris olarak kalır. Örneğin, bir merkez-simetrik matris, sol üst elemana sağ alt elemana ve merkezin üstündeki elemana merkezin altındaki elemana sahiptir. Yararlı bir görselleştirme burada bulunabilir .

Daha teorik bir matris belirli bir , bir kare matris üretmek N , öyle ki , N olan centrosymmetric ve M N ve başka bir kare matris olduğu K şekilde loş K < dim N .MN-N-MN-KkarartmakK<karartmakN-

,yalnızca her bir A i , j değeri B i + i , j + j dizinlerindebazı tamsayılar çifti için ( i , j ) görünüyorsa, B'nin bir alt kümesidir(gösterim: A B ) .birBbirBbirben,jBben+ben',j+j'(ben',j')

Not : bazı matrislerin birden fazla çözümü vardır (örneğin veya [[3,3],[1,2]]olarak çözülür ); geçerli çözümlerden en az birini çıkarmalısınız.[[2,1,0],[3,3,3],[0,1,2]][[3,3,3],[1,2,1],[3,3,3]]

Test senaryoları

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

Centrosimetrik matrislerin neden kare olması gerekir?
Ad Hoc Garf Hunter

@WW genel anlamda, olması gerektiğini sanmıyorum. Bununla birlikte, bu soru için tanımlarına göre kare olmalıdırlar
Conor O'Brien

Neden bu seçimi yaptığınızı merak ediyordum
Ad Hoc Garf Hunter

2
@WW Netlik açısından faydalı olduğunu düşündüğüm bir sadeleştirme oldu
Conor O'Brien

Yanıtlar:


8

Brachylog , 12 bayt

ṁ↔ᵐ↔?aaᵐ.&≜∧

Çevrimiçi deneyin!

Çoğu Brachylog yanıtının tersine, bu, girdiyi Çıktı değişkeni üzerinden alır .ve sonucu Çıktı değişkeni üzerinden verir ?(kafa karıştırıcı, biliyorum).

açıklama

ṁ              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 bayt, tüm geçerli matrisleri verir

Teknik olarak, bu program da çalışır:

ṁ↔ᵐ↔?aaᵐ

Ancak bu, herhangi bir değer alabilen hücreleri değişken olarak bırakacaktır (bunlar _XXXXX, dahili bir Prolog değişken adı olarak gösterilir). Bu yüzden teknik olarak bu istenenden daha iyi, ama sanırım meydan okuma ne istiyor?


Keşke etiketlemeyi geciktirdim ...
Outgolfer Erik

@EriktheOutgolfer Anında etiketleme, şeyleri numaralandırmamız gerektiğinde hala yararlıdır, bu yüzden ideal olarak iki farklı tahmine ihtiyacımız olacaktır ...
Fatalize

4

JavaScript (ES6), 192 , 180 177 bayt

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

Çevrimiçi deneyin!

Algoritma

w=0

  • Mw+1
  • (X,Y)m

    Misal:

w=2,(X,Y)=(0,1),m=(4,5,41,2,3)M=(0,0,04,5,41,2,3)
  • Matrisi centrosymmetric olacak şekilde tamamlayıp tamamlayamayacağımızı test ediyoruz.

    Misal:

M'=(3,2,14,5,41,2,3)
  • w


1

Python 2 , 242 227 226 bayt

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

Çevrimiçi deneyin!


Kaydedilen:

  • -1 bayt, Jonathan Frech sayesinde

n=[W*[0]for _ in r(W)]olabilir n=eval(`[W*[0]]*W`).
Jonathan Frech


1

Clojure 254 bayt

(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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.