Транспонування та діагоналі


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не можна розділити на рядки Xa і 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

Jelly , оцінка 7, 49 ненових рядків

Діагональна програма друку

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

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

Програма протидіагонального друку

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

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

Старіший відповідь (не упорядкований вихід), оцінка 3, 6 байтів, що не були в новому рядку

Діагонально-поліграфічна програма

UU
UŒ
ŒD

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

Антидіагональна програма друку

UUŒ
UŒD

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


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і викликає перше посилання з аргументами, зворотними (M) і довжиною (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)))

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


1
row(m)+col(m)коротше для протидіагоналі.
Джузеппе

@Giuseppe Звичайно, дякую! Відредаговано зараз.
rturnbull

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