Транспозиции и диагонали

21

Для этой задачи вы должны написать программу или функцию, которая выводит диагонали заданной квадратной матрицы. Однако если вы транспонируете строки и столбцы исходного кода вашего решения, вместо этого оно должно стать программой или функцией, которая возвращает антидиагонали матрицы. Читайте дальше для уточнения ...

правила

  • Исходный код вашего решения рассматривается как двумерная сетка символов, разделенных стандартной новой строкой по вашему выбору (перевод строки, возврат каретки или их комбинация).
  • Никакая строка в вашем исходном коде не может быть длиннее предыдущей. Вот несколько примеров допустимых макетов:

    ###
    ###
    ###
    

    ########
    #######
    ###
    ###
    #
    

    А вот пример неверного макета (третья строка длиннее второй):

    ######
    ####
    #####
    ###
    
  • Ваши два решения должны быть транспонируемыми друг для друга, то есть вы должны получать одно от другого, меняя строки и столбцы. Вот две допустимые пары:

    abc
    def
    ghi
    

    adg
    beh
    cfi
    

    А также

    print 10
    (~^_^)~
    foo
    bar
    !
    

    p(fb!
    r~oa
    i^or
    n_
    t^
     )
    1~
    0
    

    Обратите внимание, что пробелы обрабатываются как любые другие символы. В частности, конечные пробелы важны, так как они могут не быть конечными пробелами в транспонировании.

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

  • Каждая диагональ проходит сверху вниз слева направо, и они должны быть расположены сверху вниз.
  • Каждая антидиагональ проходит снизу слева и сверху справа, и их следует упорядочивать сверху вниз.

счет

Чтобы поощрить решения, которые являются настолько «квадратными», насколько это возможно, основной показатель - это количество строк или количество столбцов вашего решения, в зависимости от того, что больше . Чем меньше тем лучше. Связи разбиваются по количеству символов в решении, не считая перевода строки. Опять же, чем меньше, тем лучше. Пример:

abcd
efg
h

Это и его транспонирование будут иметь начальный балл 4 (так как есть 4 столбца) и 8 баллов (так как есть 8 не-новых символов). Пожалуйста, укажите оба значения в заголовке вашего ответа.

Тестовые случаи

Реальная задача, выполняемая этими двумя решениями, не должна быть главной задачей здесь, но вот два примера, которые помогут вам протестировать ваши решения:

Input:
1 2 3
4 5 6
7 8 9
Diagonals:
3
2 6
1 5 9
4 8
7
Antidiagonals:
1
4 2
7 5 3
8 6
9

Input:
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
Diagonals:
0
1 1
0 0 0 
1 1 1 1
0 0 0
1 1
0
Antidiagonals:
1
0 0
1 1 1
0 0 0 0
1 1 1
0 0
1
Мартин Эндер
источник
Связанный.
Мартин Эндер
Поскольку я понял, что сообщение о песочнице было у вас до того, как я прошел половину пути, до того, как я пришел на SE этим утром, я понял, что вы уже опубликовали это ... в этот момент я начинаю думать, что должен быть экстрасенсом: P
ETHproductions

Ответы:

19

Javascript, оценка 20 14, ( 258 176 не-новых символов)

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

а также

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

Пример кода:

f=

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))

а также

f=

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))

Герман Л
источник
Можете ли вы включить подсветку синтаксиса? Поместите <!-- language-all: lang-javascript -->перед первым блоком кода.
CalculatorFeline
8

MATL , оценка 10 (100 не-новых символов)

%P!       
  Q&%     
  TXd!    
  %d      
     P!   
      "@% 
       Xz 
      %z  
         q
         !

Есть 10 строк по 10 символов (обратите внимание на завершающие пробелы).

Приведенный выше код производит диагонали. Попробуйте онлайн!

Транспонированная версия производит анти-диагонали. Попробуйте онлайн!

объяснение

Обратите внимание, что

  • % является символом комментария, который приводит к игнорированию остальной части строки.

  • Функции с двумя символами, например, Xdне могут быть разбиты на a Xи a dв последовательных строках.

Оригинальный код

Исходный код, линеаризованный и без закомментированной части,

Q&TXd!P!"@Xzq!

который работает следующим образом:

Q      % Implicit input. Add 1 to each entry to make them positive
&      % This modifes default inputs/ouputs of next function, which is Xd
       % Specifically, it specifies 2 inputs and 1 ouput
T      % Push true
Xd     % Diagonals of matrix. With second input true, it gives all diagonals,
       % starting from below. The columns are arranged as columns of a matrix,
       % padding with zeros
!P!    % Flip horizontally. This is to produce the correct display order
"      % For each column
  @    %   Push current column
  Xz   %   Remove zeros
  q    %   Subtract 1
  !    %   Transpose into a row
       % Implicit end. Implicit display of stack contents

Транспонированный код

Транспонированный код, линеаризованный

P!QT&Xd!P!"@Xzq!

который имеет следующие два различия по сравнению с исходным кодом:

  • Tи &поменялись местами. Это не имеет никакого эффекта, потому что Tэто литерал, а не функция, поэтому он не перехватывает &спецификацию.
  • P! добавляется в начале.

Добавленный код изменяет матрицу ввода так, что диагонали модифицированной матрицы являются антидиагоналями ввода:

P      % Implicit input. Flip vertically
!      % Transpose
Луис Мендо
источник
7

Желе , счет 7, 49 байтов без перевода строки

Программа диагональной печати

......U
......Œ
......D
......ṙ
......L
......Ṛ
ŒDṙLṚUU

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

Программа антидиагональной печати

......Œ
......D
......ṙ
......L
......Ṛ
......U  
UŒDṙLṚU

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

Старый ответ (неупорядоченный вывод), оценка 3, 6 байтов без перевода строки

Программа для диагональной печати

UU
UŒ
ŒD

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

Анти-диагональная программа печати

UUŒ
UŒD

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

officialaimm
источник
6

Желе , оценка 4 (12 символов)

предыдущие оценки: 5 (16 символов), 4 (16 символов)

оригинал

ŒDṙṚ
D  ñ
ṙLñL

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

Транспонирование

ŒDṙ
D L
ṙ ñ
ṚñL

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

Задний план

Диагонали

Простой способ получения диагоналей (сверху донизу) квадратной матрицы заключается в следующем.

ŒDṙLṚ

Для ввода матрицы М , ŒDсписков M диагоналей «с, начиная с главной диагонали и перемещение вверх.

Для ввода

1 2 3
4 5 6
7 8 9

это дает

1 5 9
2 6
3
7
4 8

ṙLзатем вычисляет длину M с Lи поворачивает полученную длину (M) на единицы влево.

Для нашего примера длина равна 3, и мы получаем

7
4 8
1 5 9
2 6
3

Наконец, меняет порядок диагоналей, возвращая

3
2 6
1 5 9
4 8
7

для нашего примера ввода.

Анти-диагональные

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

ṚŒDṙL

Для ввода матрицы М , первый изменяет порядок строк.

Для ввода

1 2 3
4 5 6
7 8 9

это дает

7 8 9
4 5 6
1 2 3

Как и прежде, ŒDṙLгенерирует диагонали (от самого нижнего к верхнему) результата.

Для нашего примера это возвращает

1
4 2
7 5 3
8 6
9

по желанию.

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

В Jelly каждая строка определяет ссылку (функцию). В частности, последняя строка определяет основную ссылку , которая выполняется при запуске программы.

Другие ссылки должны быть названы. Этот ответ использует ñ, который выполняет ссылку ниже диадически. ñоборачивается, поэтому, когда он вызывается из главной ссылки, он выполняет ссылку в первой строке.

оригинал

Основная ссылка

ṙLñL

принимает матрицу ввода M , вычисляет ее длину с L, затем поворачивает единицы длины ввода (M) влево (обратите внимание, что это не меняет M ) и, наконец, вызывает первую ссылку с результатом ( M ) и длиной ( М) в качестве аргументов.

Первая ссылка

ŒDṙṚ

вычисляет диагонали M с помощью ŒD(как показано в предыдущем разделе), поворачивает длину результата (M) на единицы влево , а затем меняет порядок результата на .

Вторая ссылка никогда не называется.

Транспонирование

Основная ссылка

 ṚñL

принимает входную матрицу M и вычисляет ее обратное с . Затем он вычисляет длину M с помощью Lи вызывает первую ссылку с аргументами reverse (M) и length (M) .

Первая ссылка

ŒDṙ

затем вычисляет диагонали реверса (M) с помощью ŒD(как видно из предыдущего раздела) и, наконец, поворачивает полученную длину (M) на единицы влево на .

Остальные ссылки никогда не называются.

Деннис
источник
5

R, оценка 14 13 11 ( 99 95 не-новых символов)

Спасибо @Giuseppe за улучшение оценки на 1. Сократили несколько символов, используя избыточность в транспозициях. На данный момент лучший результат для не-гольф языка!

######`,scr
`::`(#:fpoo
pryr,#:)llw
f)(###`(i((
split (#tmm
p,col(p#())
)+row#r#m-)
(p)))#y#,#)
######r

И транспонировал:

#`pfsp)(#
#:r)p,+p#
#:y(lcr)#
#`r#ioo)#
#(,#tlw)#
#### (###
`::`(pryr
,f)(####
split(m,
col(m)-#
row(m)))

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

rturnbull
источник
1
row(m)+col(m)короче для антидиагоналей.
Джузеппе
@ Giuseppe Конечно, спасибо! Отредактировано сейчас.
rturnbull