Минимальная центросимметризация


11

Актуально

Цель: Учитывая матрицу положительных целых чисел , выведите наименьшую центросимметричную матрицу, которая содержит M (эта матрица также может содержать неположительные целые числа).MM

Центросимметричная матрица - это квадратная матрица с вращательной симметрией порядка 2, т.е. она остается той же самой матрицей после ее двойного вращения. Например, центросимметричная матрица имеет верхний левый элемент такой же, как нижний правый, а элемент выше центра такой же, как элемент ниже центра. Полезную визуализацию можно найти здесь .

Более формально, с учетом матрицы , производит квадратную матрицу N такой , что N центросимметричен и М N , и нет никакой другой квадратная матрицы К таким образом, что тусклый К < тусклого N .MNNMNКтусклыйК<тусклыйN

является подмножеством B (обозначение: A B ) тогда и только тогда, когда каждое значение A i , j появляется в индексе B i + i , j + j для некоторой пары целых чисел ( i , j ) .AВAВAя,JВя+я',J+J'(я',J')

Примечание : некоторые матрицы имеют несколько решений (например [[3,3],[1,2]], решаются как [[2,1,0],[3,3,3],[0,1,2]]или [[3,3,3],[1,2,1],[3,3,3]]); Вы должны вывести хотя бы одно из действительных решений.

Контрольные примеры

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

Почему центросимметричные матрицы должны быть квадратными?
Специальный охотник за

@WW в общем смысле, я не думаю, что это должно быть. Для этого вопроса, однако, они должны быть квадратными по определению
Конор О'Брайен

Мне было интересно, почему вы сделали этот выбор
Ad Hoc Garf Hunter

2
@WW это было упрощение, которое я считал полезным для ясности
Конор О'Брайен

Ответы:


8

Брахилог , 12 байт

ṁ↔ᵐ↔?aaᵐ.&≜∧

Попробуйте онлайн!

Вопреки большинству ответов Brachylog, он принимает входные данные через переменную Output .и выводит результат через переменную Input ?(я знаю, что это сбивает с толку).

объяснение

ṁ              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 байтов, дает все действительные матрицы

Технически эта программа также работает:

ṁ↔ᵐ↔?aaᵐ

Но это оставит в качестве переменных ячейки, которые могут принимать любое значение (они показывают как _XXXXX, что является внутренним именем переменной Пролога). Так что технически это даже лучше, чем то, что просят, но я думаю, что это не то, что требует задача.


Я хотел бы сделать отложенную маркировку ...
Эрик Outgolfer

@EriktheOutgolfer Мгновенная маркировка по-прежнему полезна, когда нам нужно перечислить вещи, поэтому в идеале нам нужны два разных предиката ...
Fatalize

4

JavaScript (ES6), 192 180 177 байт

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

Попробуйте онлайн!

Алгоритм

весзнак равно0

  • Mвес+1
  • (Икс,Y)м

    Пример:

весзнак равно2,(Икс,Y)знак равно(0,1),мзнак равно(4,5,41,2,3)Mзнак равно(0,0,04,5,41,2,3)
  • Мы проверяем, можем ли мы заполнить матрицу так, чтобы она была центросимметричной.

    Пример:

M'знак равно(3,2,14,5,41,2,3)
  • вес


1

Python 2 , 242 227 226 байт

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

Попробуйте онлайн!


Добавлено:

  • -1 байт, благодаря Джонатану Фреху

n=[W*[0]for _ in r(W)]может быть n=eval(`[W*[0]]*W`).
Джонатан Фрех

@JonathanFrech Спасибо :)
TFeld

1

Clojure 254 байта

(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

Попробуйте онлайн!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.