Матриці, що згортаються


18

Пов’язано: Давайте розробимо цифрову мозаїку , Друкуємо / Виводимо L-фабет . Пісочниця тут

Дані 2 входи C = columns and rows, S = starting pointвиводять матрицю наступним чином:

Input 4, 3

1   2   3   0
2   2   3   0
3   3   3   0
0   0   0   0

Пояснення

Дано C = 4, S = 3

1) Створіть C x Cзаповнену матрицю0

         4 columns
4     _____|____
     |          |
r  --0  0   0   0
o |  0  0   0   0
w |  0  0   0   0
s  --0  0   0   0

2) Заповніть Sзначення у рядку та стовпці S, потім відніміть 1 Sта повторіть до S = 0. Цей випадокS = 3

             Column 3 
S = 3           |
                v
        0   0   3   0
        0   0   3   0
Row 3-->3   3   3   0
        0   0   0   0


         Column 2
S = 2       |
            v
        0   2   3   0
Row 2-->2   2   3   0
        3   3   3   0
        0   0   0   0


     Column 1
S=1     |
        v
Row 1-->1   2   3   0
        2   2   3   0
        3   3   3   0
        0   0   0   0



Final Result

1   2   3   0
2   2   3   0
3   3   3   0
0   0   0   0

Правила

  • Припустимо C >= S >= 0
  • Виведенням може бути матриця, список списків, масив (одновимірний або двовимірний) і т.д.
  • Ви можете приймати входи в будь-якому форматі вводу / виводу за замовчуванням
  • Ваша програма, функції тощо ... можуть бути 1-індексуваннями або 0-індексаціями. Вкажіть, будь ласка, який саме.

Примітка Пояснення - 1-індексація


Критерії виграшу

Відповіді:


6

Желе , 8 байт

»>⁴¬×»µþ

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

Як це працює

Зовнішній продукт продукту Jelly's ( þ)

Ви можете подумати про зовнішній атом продукту Jelly þ, як про швидкий (оператор), який, задавши цілі аргументи і Y (у цьому випадку X = Y = перший аргумент XYX=Y=first argument  ), виробляє таку матрицю кортежів:

[(1,1)(2,1)(3,1)(X,1)(1,2)(2,2)(3,2)(X,2)(1,Y)(2,Y)(3,Y)(X,Y)]

Він також застосовує посилання прямо перед ним до всіх пар, назвемо його f

[f(1,1)f(2,1)f(3,1)f(X,1)f(1,2)f(2,2)f(3,2)f(X,2)f(1,Y)f(2,Y)f(3,Y)f(X,Y)]

Наскільки це стосується завдання, що знаходиться під рукою?

0

»>⁴¬×» – Dyadic (2-argument) link.
»      – Maximum of the X, Y coordinates.
 >⁴    – Check if this exceeds the second argument of the program.
   ¬   – Negate this boolean.
    ×» – And multiply by the maximum, computed again.

6

R , 47 41 байт

function(C,S,m=outer(1:C,1:C,pmax))m*!m>S

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

1-індексований. Згенерує результати для S==C(без нулів), а потім нульових комірок, які мають значення, >Sвикористовуючи матричне множення (спасибі Джузеппе за 4 байти!).


Акуратно! множення отримає хороший пробіг: 43 байти
Джузеппе,

@Giuseppe tx! Мені вдалося врятувати ще двох :)
JayCe


5

Хаскелл , 47 45 байт

-2 байти, змінивши вихідний формат на одномірний список.

c&s|x<-[1..c]=[sum[j|j<=s]|j<-x>>=(<$>x).max]

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

Пояснення

Термін x >>= (<$> x) . max- версія для гольфу

concat [ max i <$> x | i <- x ]

який оцінює до [1,2,3,4..c, 2,2,3,4..c, 3,3,3,4..c, ..., c,c,c,c..c]. Тепер нам залишається лише примусити ці значення до того, 0як вони перевищують, sщо ми досягаємо sum [ j | j <= s].



3

APL (Dyalog) , 12 байт

o×⎕≥o←∘.⌈⍨⍳⎕

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


Чи o×⎕≥o←∘.⌈⍨⍳дозволено щось на зразок , або вам доведеться призначити його функції, щоб вона порахувала?
Zacharý

@ Zacharý я здогадуюсь, що його потрібно буде помістити всередину tradfn з аргументом або dfns
Uriel


3

Желе , 6 байт

⁴Ri»µþ

Повна програма *, що приймає цілі числа, Cі Sяка друкує представлення Jelly списку цілих чисел, як визначено (1-індексований).

Спробуйте в Інтернеті! (форматує результат діади як сітку чисел для легшого читання)

Як?

⁴Ri»µþ - Main Link: C, S
     þ - outer product with:
    µ  -   the monadic function (i.e. f(x,y) for x in [1..C] for y in [1..C]):
   »   -     maximum (of x and y)
⁴      -     program's 4th argument = 2nd input = S
 R     -     range = [1,2,3,...S]
  i    -     first index of (the maximum) in (the range) or 0 if not found
       - as a full program: implicit print

* Причиною цього є повна програма до використання доступу до програми аргументу . Як діадичне посилання цей код покладається на те, як називається програма, яка його використовує.
Діадичне посилання для багаторазового використання в 8 байтів (беручи S ліворуч і C праворуч): багаторазове діадичне посилання в 8 байтах (приймаючи C ліворуч і S праворуч):RiⱮⱮ»þ`}
RiⱮⱮ⁹»þ¤


2

Java 10, 88 байт

C->S->{var r=new int[C][C];for(;S>0;)for(int s=S--;s-->0;)r[S][s]=r[s][S]=S+1;return r;}

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

Пояснення:

C->S->{                     // Method with two int parameters and int-matrix return-type
  var r=new int[C][C];      //  Result-matrix of size `C` by `C`
  for(;S>0;)                //  Loop as long as `S` is not 0 yet:
    for(int s=S--;s-->0;)   //   Inner loop `s` in the range (`S`, 0]
                            //   (and decrease `S` by 1 in the process with `S--`)
      r[S][s]=r[s][S]=S+1;  //    Set the values at both {`S`,`s`} and {`s`,`S`} to `S+1`
  return r;}                //  Return the result

2

PHP , 92 байти

Це "1-індексація".

<?list(,$c,$s)=$argv;for(;$i++<$c;print"\n")for($j=0;$j++<$c;)echo$s<$i||$s<$j?0:max($i,$j);

Щоб запустити його:

php -n <filename> <c> <s>

Приклад:

php -n collapsing_matrice.php 8 6

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



2

Excel VBA, 65 байт

Функція негайного вікна, яка приймає вхід із [A1:B1]та виводить на діапазон [C1].Resize([A1],[A1]).

[C1].Resize([A1],[A1])=0:For s=-[B1]To-1:[C1].Resize(-s,-s)=-s:Next

Введення-виведення

Введення знаходиться в діапазоні [A1:B1]

I / O



2

MATLAB, 58 байт (спасибі анонімному користувачеві)

function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:j,1:j)=j;end

Просто заповнюючи елементи матриці відповідним числом, запускаючи цикл. Можливо, можна бути розумнішимarrayfun


Вам не потрібно називати функцію, і ви можете використовувати zeros(c)сейфи, які байтів. Ви також бачили цю відповідь Октави, я думаю, вона також спрацює в Матлабі?
ბიმო

@ OMᗺ Octave ви не можете назвати змінні всередині анонімних функцій в matlab. Крім того, max()доведеться приймати однотипні аргументи
aaaaa каже відновити Моніку

1
Анонімний користувач запропонував function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:s,1:s)=j;end.
Джонатан Фрех

@JonathanFrech о мій такий простіший :-( просто требаo(1:j,1:j)=j
ааааа каже відновлювати Моніку



1

Вугілля деревне , 19 байт

Eθ⪫IEEθ⌈⟦ιλ⟧∧‹λη⊕λ 

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. 3 байти, які використовуються для перетворення результату в десятковий і його гарного форматування. Пояснення:

 θ                  Input `C`
E                   Map over implicit range
      θ             Input `C`
     E              Map over implicit range
          λ         Inner index
         ι          Outer index
       ⌈⟦  ⟧        Maximium
    E               Map over results
              λ     Current value
               η    Input `S`
             ‹      Less than
                 λ  Current value
                ⊕   Incremented
            ∧       Logical AND
   I                Cast to string
  ⪫                 Join with spaces
                    Implicitly print on separate lines



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