Перетворіть цей масив у матрицю


13

Візьміть вхідний масив, який не вкладений. Перетворіть його в матрицю, використовуючи наступний метод:

Скажімо, мій масив є [1, 2, 3, 4, 5]

По-перше, я повторюю цей масив 5 разів: (довжина)

[[1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5]]

Потім я прочитав його по діагоналях:

[[1],
 [2, 1],
 [3, 2, 1],
 [4, 3, 2, 1],
 [5, 4, 3, 2, 1],
 [5, 4, 3, 2],
 [5, 4, 3],
 [5, 4],
 [5]]

Я згладжую цей масив і розбиваю його на шматки по п'ять (довжина):

[[1, 2, 1, 3, 2],
 [1, 4, 3, 2, 1],
 [5, 4, 3, 2, 1],
 [5, 4, 3, 2, 5],
 [4, 3, 5, 4, 5]]

Це код гольфу. Виграє найменше байт.


Наступного разу, будь ласка, КАПІТАЛІЗУЙТЕ речі.
Олівер Ні

Як це працює, якщо вихідний масив має довжину, відмінну від 5?

@ ais523 Я припускаю, що це те саме, ти просто заміниш "п'ятірку" довжиною
Олівер Ні

Чи можемо ми вважати, що числа завжди є натуральними числами?
Луїс Мендо

7
@JohnCena Ви не повинні приймати першу відповідь, вам потрібно дати деякий час, щоб отримати тягу та ще кілька відповідей.
Каде

Відповіді:


2

05AB1E, 13 байт

.p¹.sR¦«í˜¹gä

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

Пояснення:

                # Implicit input
 .p             # Get prefixes
   ¹            # Get first input
    .s          # Get suffixes
      R         # Reverse
       ¦        # Remove first element
        «       # Concatenate
         í      # Reverse every one
          ˜     # Flatten
           ¹gä  # Split into pieces of the length
                # Implicit print

вам не потрібно її роздрукувати

і як ви

1
Багато з цих мов для гольфу, як-от 05AB1E, вбудували правила за замовчуванням для запиту на введення та отримання результатів, щоб програмісту не довелося витрачати на них байти.

1
Вихідні дані насправді не відповідають бажаному виходу. Це не матриця, і числа не збігаються.
Карл Напф

1
Ну, це матриця, але цифри невірні (або tryitonline.net обчислює неправильно)
Karl Napf

6

Желе , 11 байт

WẋLŒDUṙLFsL

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

Пояснення

               Input: array z
WẋL            length(z) copies of z
   ŒD          Diagonals (starting with main diagonal)
     U         Reverse each
      ṙL       Rotate left length(z) places
               (now the top-left diagonal is in front)
        F      Flatten
         sL    Split into chunks of size length(z)

Гм, коли я спробував це, Lробив дивні речі, отже, я використав реєстр: / я просто спробував його ще раз, і він працює ... в основному те саме, так що я думаю, що я просто видалю свою.
Джонатан Аллан

1
Звичайно ж, у Jelly вбудовані "діагоналі" .... :)
Грег Мартін

3

Python 2, 105 96 байт

-1 і -4 і -4 байти завдяки Flp.Tkc

a=input()
n=len(a)
L,M=[],[]
for i in range(n):L+=a[i::-1];M+=a[:i:-1]
print zip(*[iter(L+M)]*n)

Цикл for додає елементи, як в описі, справжня магія відбувається на блискавці, яка знаходиться звідси


вибачте за спам, але тепер, коли R використовується лише один раз, ви можете просто поставити його там безпосередньо: P
FlipTack

@ Flp.Tkc немає проблем, я щасливий :)
Karl Napf

3

JavaScript (ES6) 100 101 105

a=>eval("for(u=r=[],i=l=a.length;i+l;i--)for(j=l;j--;v&&((u%=l)||r.push(s=[]),s[u++]=v))v=a[j-i];r")

Менше гольфу

a => {
  u = 0
  for(r=[], i=l=a.length; i+l>0; i--)
    for(j=l; j--; )
    {
      v = a[j-i]
      if (v) 
      {
        u %= l
        if (u==0) r.push(s=[])
        s[u++] = v
      }
    }
  return r
}

Тест

F=
a=>eval("for(u=r=[],i=l=a.length;i+l;i--)for(j=l;j--;v&&((u%=l)||r.push(s=[]),s[u++]=v))v=a[j-i];r")

function update() {
  var a=I.value.match(/\d+/g)
  if (a) {
    var r=F(a)
    O.textContent = r.join`\n`
  }
}

update()
<input id=I value='1 2 3 4 5' oninput='update()'>
<pre id=O></pre>


1
Нічого собі, це дуже розумний спосіб уникнути цього return. Ви повинні опублікувати підказку про це в потоці наконечників ES6.
ETHproductions

@ETHproductions має дуже вузьку сферу застосування. У більшості випадків краще eval.
edc65

@ETHproductions справді evalкращий навіть цього разу :(
edc65

@ETHproductions Я опублікував підказку, навіть якщо це рідко корисно, на всякий випадок
edc65

2

MATL , 17 байт

!Gg*tRwZRhPXzGne!

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

Як це працює

Наступне пояснення використовує введення [1 2 3 4 5]як приклад. Щоб візуалізувати проміжні результати, вставляйте %(символ коментаря) після будь-якого твердження в коді.

Зверніть увагу, що ;це роздільник рядків для матриць. Так [1 2]є векторний рядок, [1; 2]це вектор стовпців і [1 0; 0 1]є матрицею ідентичності 2 × 2.

!     % Implicitly input a row vector. Transpose. Gives a column vector
      % STACK: [1; 2; 3; 4; 5]
Gg    % Push input with all (nonzero) values replaced by ones
      % STACK: [1; 2; 3; 4; 5], [1 1 1 1 1]
*     % Multiply, with broadcast. Gives a square matrix
      % STACK: [1 1 1 1 1;
                2 2 2 2 2;
                3 3 3 3 3;
                4 4 4 4 4;
                5 5 5 5 5]
tR    % Duplicate. Upper triangular part
      % STACK: [1 1 1 1 1;
                2 2 2 2 2;
                3 3 3 3 3;
                4 4 4 4 4;
                5 5 5 5 5],
               [1 1 1 1 1
                0 2 2 2 2;
                0 0 3 3 3;
                0 0 0 4 4;
                0 0 0 0 5]
wZR   % Swap. Lower triangular part, below main diagonal 
      % STACK: [1 1 1 1 1;
                0 2 2 2 2;
                0 0 3 3 3;
                0 0 0 4 4;
                0 0 0 0 5],
               [0 0 0 0 0;
                2 0 0 0 0;
                3 3 0 0 0;
                4 4 4 0 0;
                5 5 5 5 0]
h     % Concatenate horizontally
      % STACK: [1 1 1 1 1 0 0 0 0 0;
                0 2 2 2 2 2 0 0 0 0;
                0 0 3 3 3 3 3 0 0 0;
                0 0 0 4 4 4 4 4 0 0;
                0 0 0 0 5 5 5 5 5 0]
P     % Flip vertically
      % STACK: [0 0 0 0 5 5 5 5 5 0;
                0 0 0 4 4 4 4 4 0 0;
                0 0 3 3 3 3 3 0 0 0;
                0 2 2 2 2 2 0 0 0 0;
                1 1 1 1 1 0 0 0 0 0]
Xz    % Column vector of nonzeros, taken in column-major order
      % STACK: [1;2;1;3;2;1;4;3;2;1;5;4;3;2;1;5;4;3;2;5;4;3;5;4;5]
Gne   % Reshape into a matrix with as many rows as input size
      % STACK: [1 1 5 5 4;
                2 4 4 4 3;
                1 3 3 3 5;
                3 2 2 2 4;
                2 1 1 5 5]
 !    % Transpose. Implicitly display
      % STACK: [1 2 1 3 2;
                1 4 3 2 1;
                5 4 3 2 1;
                5 4 3 2 5;
                4 3 5 4 5]

1

JavaScript (ES6), 116 байт

a=>a.map(_=>b.splice(0,a.length),b=[].concat(...a.map((_,i)=>a.slice(~i)),...a.map((_,i)=>a.slice(0,~i))).reverse())

Ну, це початок ...


1

R, 84 байти

t(matrix(unlist(split(m<-t(matrix(rev(x<-scan()),l<-sum(1|x),l)),row(m)-col(m))),l))

Читає вхід зі stdin та виводить / повертає R-матрицю.

reversed_x <- rev(x<-scan())                # Read input from stdin and reverse
m <- t(matrix(reversed_x,l<-sum(1|x),l))    # Repeat and fit into matrix
diag_list <- split(m,row(m)-col(m))         # Split into ragged list of diagonals
t(matrix(unlist(diag_list),l))              # Flatten and transform back to matrix

Пояснив

Найцікавіший аспект цієї відповіді - це отримання діагоналей. Як правило, об'єкт можна розділити за допомогою splitфункції, якщо постачається об'єкт, що містить фактори, на які об'єкт розбивається. Для створення цих факторів ми можемо використовувати colта rowякі повертають матрицю, що містить індекси стовпців та рядків відповідно. Беручи відмінності: row(m)-col(m)ми отримуємо матрицю на зразок:

     [,1] [,2] [,3] [,4] [,5]
[1,]    0   -1   -2   -3   -4
[2,]    1    0   -1   -2   -3
[3,]    2    1    0   -1   -2
[4,]    3    2    1    0   -1
[5,]    4    3    2    1    0

в якій кожна діагональ однозначно ідентифікується. Тепер ми можемо розділити на основі цієї матриці та перетворити її у розроблений список, застосувавши split:

$`-4`
[1] 1
$`-3`
[1] 2 1 
$`-2`
[1] 3 2 1
$`-1`
[1] 4 3 2 1
$`0`
[1] 5 4 3 2 1
$`1`
[1] 5 4 3 2
$`2`
[1] 5 4 3
$`3`
[1] 5 4
$`4`
[1] 5

(Зверніть увагу, як ім'я кожного вектора відповідає діагональним значенням у матриці вище).

Останній крок - просто розрівняти і перетворити його в матрицю форми:

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    1    3    2
[2,]    1    4    3    2    1
[3,]    5    4    3    2    1
[4,]    5    4    3    2    5
[5,]    4    3    5    4    5

0

Mathematica 93 байт

Partition[Flatten[Table[If[i>n,#[[n;;(i-n+1);;-1]],#[[i;;1;;-1]]],{i,1,2(n=Length@#)-1}]],n]&

Ось як я зазвичай написав цей код (109 байт):

Partition[Reverse@Flatten[Table[Reverse@Diagonal[ConstantArray[Reverse@#,n],k],{k,-(n=Length@#)+1,n-1}]],n]&

Цей матричний графік дає гарне уявлення про структуру завдяки послідовно зростаючому вхідному вектору.

введіть тут опис зображення

Ось матричний графік із випадковим вхідним вектором. Очевидно, якась структура все ще існує.

введіть тут опис зображення


0

Математика, 92 байти

n=NestList[#2,(r=Reverse)@#,(l=Length@#)-1]&;{Most@r[#~n~Rest],#~n~Most}~ArrayReshape~{l,l}&

Безіменна функція, яка бере список як аргумент. Можливо, існують інші структури для такої функції, але, сподіваюся, я дуже добре зіграв цю структуру ....

Перша частина n=NestList[#2,(r=Reverse)@#,(l=Length@#)-1]&визначає функцію nз двох аргументів: перша - це список довжини l, а друга - функція, яка застосовується до списків. nзастосовує цей час функцій l-1до перетвореного списку аргументів, зберігаючи всі результати у своєму вихідному списку. (Визначаючи rі lпо дорозі - це просто гольф.)

nвикликається двічі у вихідному списку, один раз із функцією, що є Rest(випадає перший елемент списку) та один раз з функцією, що є Most(випадає останній елемент). Це створює всі потрібні підлісти, але весь список там двічі (звідси додаткові Most), і перша половина там знаходиться в зворотному порядку (звідси і r[...]). Нарешті, ~ArrayReshape~{l,l}забуває поточну структуру списку і змушує її бути масивом lx l.


0

Математика, 85 байт

Буквально виконуючи запропоновані кроки:

(l=Length@#;Partition[Flatten@Table[Reverse@Diagonal[Table[#,l],i],{i,-l+1,l-1}],l])&

Моя кишка говорить про те, що слід робити розумний спосіб Partзробити це коротше, але кожна спроба, яку я робив, була довшою, ніж 85 байт.


0

Ruby (110 байт)

n=a.size
b=[*(0...n)]
b.product(b).group_by{|i,j|i+j}.flat_map{|_,f|f.sort.map{|i,j|a[i][j]}}.each_slice(n).to_a
  #=> [[1, 2, 1, 3, 2],
  #    [1, 4, 3, 2, 1],
  #    [5, 4, 3, 2, 1],
  #    [5, 4, 3, 2, 5],
  #    [4, 3, 5, 4, 5]]

sortОперація може бути зайвими, але док для перелічуваних # group_by не гарантує порядок значень в хеш - значень (які є масивами), але сучасні версії Ruby , забезпечують упорядкованість можна було б очікувати і впорядкованість я повинен був би , якщо sortбуло видалено з мого коду.

Етапи такі.

n=a.size 
  #=> 5 
b=[*(0...n)]
  #=> [0, 1, 2, 3, 4] 
c = b.product(b)
  #=> [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [1, 0], [1, 1], [1, 2], [1, 3],
  #    [1, 4], [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [3, 0], [3, 1], [3, 2],
  #    [3, 3], [3, 4], [4, 0], [4, 1], [4, 2], [4, 3], [4, 4]] 
d=c.group_by{|i,j|i+j}
  #=> {0=>[[0, 0]],
  #    1=>[[0, 1], [1, 0]],
  #    2=>[[0, 2], [1, 1], [2, 0]],
  #    3=>[[0, 3], [1, 2], [2, 1], [3, 0]],
  #    4=>[[0, 4], [1, 3], [2, 2], [3, 1], [4, 0]],
  #    5=>[[1, 4], [2, 3], [3, 2], [4, 1]],
  #    6=>[[2, 4], [3, 3], [4, 2]],
  #    7=>[[3, 4], [4, 3]],
  #    8=>[[4, 4]]} 
e=d.flat_map{|_,f|f.sort.map{|i,j|a[i][j]}}
  #=> [1, 2, 1, 3, 2, 1, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5] 
f=e.each_slice(n)
  #=> #<Enumerator: [1, 2, 1, 3, 2, 1, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2,
  #                  5, 4, 3, 5, 4, 5]:each_slice(5)>

Нарешті, f.to_aповертає масив, показаний раніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.