Превратите этот массив в матрицу

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 вычисляет неправильно)
Карл Напф
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
Конечно, у Желе есть встроенные "диагонали" .... :)
Грег Мартин,
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 нет проблем, я счастлив :)
Карл Напф
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>

edc65
источник
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
Billywob
источник
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

Mathematica, 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

Mathematica, 85 байт

Буквально выполняя предложенные шаги:

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

Моя интуиция говорит, что должен быть умный способ Partсделать это короче, но каждая попытка была длиннее 85 байт.

ngenisis
источник
0

Рубин (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возвращает массив, показанный ранее.

Кэри Свовеланд
источник