Генерация всех квадратных подматриц заданного размера


14

Вам будет дана квадратная матрица целых чисел M и другого натурального п , строго меньшие , чем размер M . Ваша задача - сгенерировать все квадратные подматрицы M размера n .

Для целей этого вызова, квадратная подматрица представляет собой группа смежных строк и столбцов содержатся в М .

Форматы ввода / вывода

Вы можете выбрать любой другой разумный формат, это только некоторые примеры.

вход

  • Матрица в нативном типе матрицы (если она есть у вашего языка)
  • 2D-массив (массив 1D-массивов, каждый из которых соответствует одной строке / одному столбцу)
  • 1D массив (так как матрица всегда квадратная)
  • Строка (вы выбрали интервал, но не злоупотребляйте этим) и т. Д.

Выход

  • Матрица матриц.
  • 4D массив, где каждый элемент (3D список) представляет подматрицы в строке / столбце.
  • 3D-массив, где каждый элемент (2D-список) представляет подматрицу.
  • Строковое представление результирующих подматриц и т. Д.

Спекуляции

  • Вы можете взять размер из M в качестве входных данных тоже. Гарантированно будет минимум 2 .
  • Ориентация вывода произвольна: вы можете выбрать вывод подматриц в виде списков столбцов или списков строк, но ваш выбор должен быть согласованным.
  • Вы можете соревноваться на любом языке программирования и можете принимать и выводить данные любым стандартным методом , при этом отмечая, что эти лазейки по умолчанию запрещены.
  • Это , поэтому выигрывает самое короткое представление (в байтах) для каждого языка .

пример

Учитывая n = 3 и М :

 1 2 3 4
 5 6 7 8
 9 10 11 12
13 14 15 16

Возможные подматрицы 3x3 :

+ ------- + + -------- + 1 2 3 4 1 2 3 4
| 1 2 3 | 4 1 | 2 3 4 | + -------- + + -------- +
| 5 6 7 | 8 5 | 6 7 8 | | 5 6 7 | 8 5 | 6 7 8 |
| 9 10 11 | 12 9 | 10 11 12 | | 9 10 11 | 12 9 | 10 11 12 |
+ ------- + + -------- + | 13 14 15 | 16 13 | 14 15 16 |
13 14 15 16 13 14 15 16 + -------- + + -------- +

Таким образом, результат будет:

[[[1, 2, 3], [5, 6, 7], [9, 10, 11]], [[2, 3, 4], [6, 7, 8], [10, 11, 12]], [[5, 6, 7], [9, 10, 11], [13, 14, 15]], [[6, 7, 8], [10, 11, 12], [14, 15, 16]]]

Как отмечено выше, вывод:

[[[1, 5, 9], [2, 6, 10], [3, 7, 11]], [[2, 6, 10], [3, 7, 11], [4, 8, 12]], [[5, 9, 13], [6, 10, 14], [7, 11, 15]], [[6, 10, 14], [7, 11, 15], [8, 12, 16]]]

также будет приемлемо, если вы решите возвращать субматрицы в виде списков строк.

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

Входы M, n :

[[1,2,3],[5,6,7],[9,10,11]], 1
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], 3
[[100,-3,4,6],[12,11,14,8],[0,0,9,3],[34,289,-18,3]], 2
[[100,-3,4,6],[12,11,14,8],[9,10,11,12],[13,14,15,16]], 3

И соответствующие выходные данные (подматрицы приведены в виде списков строк):

[[[1]],[[2]],[[3]],[[5]],[[6]],[[7]],[[9]],[[10]],[[11]]]
[[[1,2,3],[5,6,7],[9,10,11]],[[2,3,4],[6,7,8],[10,11,12]],[[5,6,7],[9,10,11],[13,14,15]],[[6,7,8],[10,11,12],[14,15,16]]]
[[[100,-3],[12,11]],[[-3,4],[11,14]],[[4,6],[14,8]],[[12,11],[0,0]],[[11,14],[0,9]],[[14,8],[9,3]],[[0,0],[34,289]],[[0,9],[289,-18]],[[9,3],[-18,3]]]
[[[100,-3,4],[12,11,14],[9,10,11]],[[-3,4,6],[11,14,8],[10,11,12]],[[12,11,14],[9,10,11],[13,14,15]],[[11,14,8],[10,11,12],[14,15,16]]]

Или, как списки столбцов:

[[[1]],[[2]],[[3]],[[5]],[[6]],[[7]],[[9]],[[10]],[[11]]]
[[[1,5,9],[2,6,10],[3,7,11]],[[2,6,10],[3,7,11],[4,8,12]],[[5,9,13],[6,10,14],[7,11,15]],[[6,10,14],[7,11,15],[8,12,16]]]
[[[100,12],[-3,11]],[[-3,11],[4,14]],[[4,14],[6,8]],[[12,0],[11,0]],[[11,0],[14,9]],[[14,9],[8,3]],[[0,34],[0,289]],[[0,289],[9,-18]],[[9,-18],[3,3]]]
[[[100,12,9],[-3,11,10],[4,14,11]],[[-3,11,10],[4,14,11],[6,8,12]],[[12,9,13],[11,10,14],[14,11,15]],[[11,10,14],[14,11,15],[8,12,16]]]]

Запись в песочнице (теперь удалена, ее могут просматривать только пользователи с репутацией более 2К). Спасибо всем, кто дал отзыв.
г-н Xcoder


@ LuisMendo Да, это разрешено.
мистер Xcoder

Ответы:



5

MATL , 4 байта

thYC

Входы n , тогда M.

Выходными данными является матрица, где каждый столбец содержит все столбцы подматрицы.

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

объяснение

thY    % Address the compiler with a formal, slightly old-fashioned determiner
C      % Convert input to ouput

Более серьезно, tпринимает ввод n неявно и дублирует его в стеке. hобъединяет обе копии n , создавая массив [n, n] . неявно YCпринимает входные данные M , извлекает все его блоки [n, n] размера и размещает их в виде столбцов в главном порядке столбцов. Это означает, что столбцы каждого блока располагаются вертикально, чтобы сформировать один столбец.


1
LOL +1 за «формальное, слегка старомодное местоимение» и очень хороший гольф.
Джузеппе

@Giuseppe Я только что понял, что это определитель, а не местоимение: - /
Луис Мендо

Ну, я всегда выучил «твой / твой» как притяжательные местоимения; я впервые слышу об определителе!
Джузеппе

@Giuseppe «Твой / твой» - это притяжательные детерминанты, то есть они идут с именем: «Это твоя машина». «Твои / твои» являются притяжательными местоимениями, то есть имя опускается: «Это твое». И я изначально перепутал «твое» с личным местоимением, которое на самом деле будет «ты». Какой беспорядок я сделал :-)
Луис Мендо

4

APL (Dyalog Unicode) , 26 байтов SBCS

Анонимный инфикс лямбда, принимающий n в качестве левого аргумента и M в качестве правого аргумента.

{s↓(-s2⍴⌈¯1+⍺÷2)↓⊢⌺⍺ ⍺⊢⍵}

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

{... } анонимная лямбда, где левый аргумент и правый аргумент:

⊢⍵ привести правильный аргумент ( отделяется ⍺ ⍺от )

⊢⌺⍺ ⍺ вся матрица с размерностью подматрица , включая те , перекрывая края (те дополняются нулями)

(...)↓  Поместите следующие числовые элементы вдоль первых двух измерений:

  ⍺÷2 половина

  ¯1+ отрицательный плюс, что

   округлять

  2⍴ циклически г eshape в список из двух элементов

  s← хранить в s(для с твердолобых)

  - отрицать (т.е. падение сзади)

s↓сбрасывать sэлементы по первому и второму измерениям (спереди)


4

APL (Dyalog Unicode) , 31 байт

{(12 1 3 4⍉⊖)⍣(4×⌊⍺÷2)⊢⌺⍺ ⍺⊢⍵}

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

Другой подход, чем у Адама.


Собираетесь ли вы дать объяснение (конечно, после того, как вы закончите играть в гольф)? Мне было бы интересно посмотреть, как это работает (и я совсем не знаю APL) :)
Emigna

@ Emigna Да, если у меня будет время к тому времени.
Эрик Outgolfer

Очень умно. Если вы можете успешно использовать двоичный метод для нетривиальных случаев, то вы действительно освоили программирование массивов.
Адам

@ Adám Э-э, хотя я думаю, что этот ответ на самом деле недействителен :-( РЕДАКТИРОВАТЬ: Исправлено, но теперь его длина 31 байт ...
Эрик Outgolfer

Не стесняйтесь копировать набор тестов из моего представления.
Адам

3

R 75 байт

function(M,N,S,W=1:N,g=N:S-N)for(i in g)for(j in g)print(M[i+W,j+W,drop=F])

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

Берет M, Nи Sразмер матрицы.

Печатает полученные матрицы в stdout; drop=Fнеобходимо, так что в N=1случае, когда индексирование не удаляет dimатрибут и выдает matrixвместо a vector.


3

J , 11 8 байт

-3 байта благодаря милям

<;._3~,~

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


1
При этом используется 8 байтов <;._3~,~и вместо этого используется хук, чтобы связать размер с самим собой, а затем обрезает и вставляет каждый из них, поскольку матрица матриц разрешена в качестве выходных данных.
миль

@ Miles Спасибо, теперь это элегантно!
Гален Иванов


2

Желе , 5 байт

Z⁹Ƥ⁺€

Использует формат вывода 4D. Для 3D, добавьте по 6 байт .

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

Как это устроено

Z⁹Ƥ⁺€  Main link. Left argument: M (matrix). Right argument: n (integer)

 ⁹Ƥ    Apply the link to the left to all infixes of length n.
Z        Zip the rows of the infix, transposing rows and columns.
   ⁺€  Map Z⁹Ƥ over all results.

Я предложил что-то похожее на user202729 в ​​чате. Альтернатива 5-байтная ṡ€Zṡ€.
г-н Xcoder

2

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

{tN&s₎\;Ns₎}ᶠ

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

Это возвращает списки столбцов.

Технически, tN&s₎\;Ns₎это генерирующий предикат, который объединяет свой вывод с любой из этих подматриц. Мы используем {…}ᶠтолько выставлять все возможности.

объяснение

 tN&              Call the second argument of the input N
{          }ᶠ     Find all:
    s₎              A substring of the matrix of size N
      \             Transpose that substring
       ;Ns₎         A substring of that transposed substring of size N

1

Stax , 10 байт

│Æ☼♂Mqß E╖

Запустить его

Ascii представление той же программы

YBFMyBF|PMmJ

Это работает так.

Y               Store the number in the y register
 B              Batch the grid into y rows each
  F             Foreach batch, run the rest of the program
   M            Transpose about the diagonal
    yB          Batch the transposed slices into y rows each
      F         Foreach batch, run the rest of the progoram
       |P       Print a blank line
         M      Transpose inner slice - restoring its original orientation
          mJ    For each row in the inner grid, output joined by spaces

1

JavaScript (ES6), 91 байт

Принимает ввод в синтаксисе карри (a)(n). Возвращает результаты в виде списков строк.

a=>n=>(g=x=>a[y+n-1]?[a.slice(y,y+n).map(r=>r.slice(x,x+n)),...g(a[x+n]?x+1:!++y)]:[])(y=0)

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


1

APL (Dyalog Classic) , 24 23 байта

t∘↑¨(¯1-t←-2⍴⎕)↓,⍀⍪\⍪¨⎕

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

результат - матрица матриц, хотя форматирование вывода Dyalog не делает это очень очевидным

введите matrix ( ), превратите каждый элемент во собственную вложенную матрицу ( ⍪¨), возьмите конкатенации префиксов по row ( ,\) и column ( ⍪⍀), введите n ( ), удалите первые n-1 строк и столбцов вложенных матриц ( (¯1-t←-2⍴⎕)↓), возьмите правый нижний угол n-n-n от каждой матрицы ( t∘↑¨)

                                        ┌─┬──┬───┐
                                        aababc      ┼──┼───┤        ┼──┼───┤
 n=2       ┌─┬─┬─┐      ┌─┬──┬───┐      ├─┼──┼───┤      ababc        ab bc
┌───┐      abc      aabbac      aababc      dedef        de ef
abc  ⍪¨  ├─┼─┼─┤  ,\  ├─┼──┼───┤  ⍪⍀  ddedef 1 1 ┼──┼───┤¯2 ¯2∘↑¨┼──┼───┤
def ---> def ---> ddeedf ---> ├─┼──┼───┤ ---> ababc  --->       
ghi      ├─┼─┼─┤      ├─┼──┼───┤      aababc      dedef        de ef
└───┘      ghi      gghhgi      ddedef      ghghi        gh hi
           └─┴─┴─┘      └─┴──┴───┘      gghghi      ┴──┴───┘        ┴──┴───┘
                                        └─┴──┴───┘

0

Рубин , 63 байта

->c,g{n=c.size-g+1
(0...n*n).map{|i|c[i/n,g].map{|z|z[i%n,g]}}}

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

Это лямбда, принимающая 2D-массив и int, возвращающая 3D-массив.

Ungolfed:

->m,n{
  a = m.size - n + 1     # The count of rows in m that can be a first row in a submatrix
  (0...a*a).map{ |b|     # There will be a*a submatrices
    m[b/a,n].map{ |r|    # Take each possible set of n rows
      r[b%a,n]           # And each possible set of n columns
    }
  }
}

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