Створіть усі квадратні підматриці заданого розміру


14

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

Для цілей цього виклику, квадратна подматріца є група суміжних рядків і стовпців містяться в М .

Формати вводу / виводу

Ви можете вибирати будь-які інші розумні формати, це лише кілька прикладів.

Вхідні дані

  • Матриця типу рідної матриці (якщо у вас є мова)
  • 2D масив (масив 1D масивів, кожен відповідає одному рядку / одному стовпцю)
  • 1D масив (оскільки матриця завжди квадратна)
  • Рядок (ви вибрали інтервал, але будь-яким чином не зловживайте цим) тощо.

Вихідні дані

  • Матриця матриць.
  • 4D-масив, де кожен елемент (тривимірний список) представляє підматриці на рядок / стовпчик.
  • 3D-масив, де кожен елемент (2D-список) представляє підматрицю.
  • Рядок подання отриманих підматриць тощо.

Технічні характеристики

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

Приклад

Дано n = 3 і M :

 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⍴ циклічно r змініть список двох елементів

  s← зберігати в s(для s hards)

  - негативні (тобто крапля з тилу)

s↓падіння sелементів уздовж першого та другого розмірів (спереду)


4

APL (Dyalog Unicode) , 31 байт

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

Спробуйте в Інтернеті!

Інший підхід, ніж у Адама.


Ви маєте намір надати пояснення (після закінчення курсу гольфу)? Мені було б цікаво подивитися, як це працює (і я зовсім не знаю APL) :)
Emigna

@Emigna Так, якщо я до цього часу встигну.
Ерік Аутгольфер

Дуже розумний. Якщо ви можете успішно використовувати діадік для нетривіальних випадків, то ви справді освоїли програмування масиву.
Adám

@ Adám Uh, хоча я вважаю, що ця відповідь насправді є недійсною :-( EDIT: Виправлено, але зараз це 31 байт ...
Erik the Outgolfer

Сміливо скопіюйте тестовий набір із мого подання.
Adám

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скоріше а 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

Стакс , 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 байт

Здійснює введення в синтаксис currying (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 не робить це дуже очевидним

введіть матрицю ( ), перетворіть кожен елемент у власну вкладену матрицю ( ⍪¨), зробіть конфінації префікса за рядком ( ,\) та за стовпцем ( ⍪⍀), введіть n ( ), опустіть перші n-1 рядки та стовпці вкладених матриць ( (¯1-t←-2⍴⎕)↓), візьміть нижній правий n-by-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-масив.

Безголівки:

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