Списки та масиви, частина за частиною


14

У цьому виклику ви отримаєте чотири різні, але дещо пов’язані із цим завдання, які необхідно вирішити певним чином. Спочатку я поясню завдання, потім слідує пояснення, як ви повинні її вирішити.

Ваш код повинен для всіх чотирьох завдань приймати як позитивні два цілих числа:, n,mде n<m. Усі завдання повинні вирішуватися однією мовою. Орієнтація матриць необов’язкова (n-by-m може бути інтерпретована як "n рядків, m стовпців" або "n стовпців, m рядків").

Завдання 1:

Створення (і вихід / друк) вектор / список , що складається з елементів: n, n+1 ... m-1, m. Так, n=4, m=9ви повинні вивести: 4,5,6,7,8,9.

Завдання 2:

Створіть (і виведіть / роздрукуйте) матрицю / масив / список списків (або еквівалент), виглядаючи так:

n,   n+1, ... m-1, m
n+1, n+2, ... m-1, m+1
...
n+m, n+m+1, ... 2*m-1, 2*m

Для n=4, m=9вас слід вивести:

4, 5, 6, 7, 8, 9
5, 6, 7, 8, 9, 10
...
13, 14, 15, 16, 17, 18

Завдання 3:

Створіть (та виведіть / роздрукуйте) таблицю множення n-на-м (у будь-якому відповідному форматі). Приклад для n=4, m=9:

1   2   3  4
2   4   6  8
3   6   9  12
4   8  12  16
5  10  15  20
6  12  18  24
7  14  21  28
8  16  24  32
9  18  27  36

Завдання 4:

Виведіть / надрукуйте вектор / список, що складається з елементів таблиці множення з завдання 3, відсортованих у порядку зростання, зберігаючи повторювані значення. Для n=4, m=9, ви повинні висновок: 1, 2, 2, 3, 3, 4, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 10, 12, 12, 12, 14, 15, 16, 16, 18, 18, 20, 21, 24, 24, 27, 28, 32, 36.

Змагання:

Тепер усі вищезазначені завдання досить тривіальні. Справжня проблема тут полягає в тому, що код для завдання 2 повинен починатися з коду для завдання 1, код для завдання 3 повинен починатися з коду для завдання 2, а код для завдання 4 повинен починатися з коду для завдання 3.

Щоб зробити це більш зрозумілим:

Припустимо, кодом для завдання 1 є (працює в Octave):

@(n,m)(n:m)

Тоді ваш код для завдання 2 може бути (працює в Octave):

@(n,m)(n:m)+(0:m)'

Код для завдання Завдання 3 повинен бути (не працює в Octave):

@(n,m)(n:m)+(0:m)'"Code_for_task_3"

І нарешті, код для завдання 4 повинен бути (не працює в Octave):

@(n,m)(n:m)+(0:m)'"Code_for_task_3""Code_for_task_4"

Це , тому подання з найкоротшим кодом для завдання 4 на кожній мові виграє. Як завжди: пояснення настійно заохочуються.


Щоб було зрозуміло, я збираюся здогадатися, що це суперечить духу виклику, але чи допустимо починати код наступного завдання перенаправленням на STDERR, >2;щоб код попереднього завдання по суті був відтворений?
AdmBorkBork

1
@AdmBorkBork, у PPCG немає такого поняття, як "дух виклику": P Так, це нормально .
Стюі Гріффін

Чи потрібно таблицю множення красиво застелити?
HyperNeutrino

1
@HyperNeutrino, ні.
Стюі Гріффін

Коли ви говорите "додатне ціле число", ви маєте на увазі 0<n<mабо 0<=n<m?
Значення чорнила

Відповіді:


6

Желе , 12 байт

Завдання 1

r

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

Завдання 2

r+þ0r$}

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

Завдання 3

r+þ0r$}
×þ

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

Завдання 4

r+þ0r$}
×þFṢ

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

Як це працює

Завдання 1

rє атомом діадичного діапазону і робить саме те, що задається завданням.

Завдання 2

Діадичний ланцюг, який починається з трьох діадічних ланок, - це вилка ; найперші оцінюються спочатку, потім середня ланка викликається результатами обох сторін як аргументи.

  • rповодиться, як і раніше, поступаючись [n,…, m] .

  • 0r$} це швидке посилання (або швидке швидке посилання, якщо ви хочете).

    Швидкий $(ланцюг монадича) споживає ланки 0(вихід 0 ) та r(діадічний діапазон) і перетворює їх у монадічний ланцюг. Якщо викликати аргумент k , це дасть [0,…, k] .

    Швидкі }(правий аргумент) приймає QuickLink створеного $і перетворює його в двійковій - посилання, дзвінки 0r$з 0r$}правом аргументу «s.

    0r$}буде викликатись лівим аргументом n та правим аргументом m , тому 0r$він позначається аргументом m і дає [0,…, m] .

  • є ще одним швидким посиланням. þ(таблиця) викликає +(додавання) для кожного елемента з його лівого аргументу та будь-якого елемента правого аргументу, групуючи результати для кожного правого аргументу в один рядок.

    буде викликатися з лівим аргументом [n, ..., m] і правим аргументом [0, ..., m] , даючи потрібну таблицю.

Завдання 3

Кожен рядок програми Jelly визначає інше посилання. Остання є основною ланкою і, як і mainфункція C , є єдиною ланкою, яка виконується за замовчуванням. Решта посилань можна викликати з основної посилання, але ми цього робити не будемо.

Як і раніше, þ(таблиця) викликає ×(додавання) для кожного елемента в його лівому аргументі та будь-якого елемента в його правому аргументі, групуючи результати для кожного правого аргументу в один рядок.

Оскільки обидва аргументи ×þє цілими числами, þперекидає їх на діапазони, перетворюючи аргументи n та m у [1,…, n] та [1,…, m] .

Завдання 4

×þпрацює, як і раніше. Наступні посилання є монадичними, роблячи їх вершинами , тобто вони наносяться поверх попередніх.

Після виконання ×þ, Fзгладжується в результаті 2D масив і сортує результуючий масив 1D.


5

05AB1E , 18 17 байт

Завдання 1

Ÿ

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

Завдання 2

Ÿ²FD>})

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

Завдання 3

Ÿ²FD>})v¹LN*})¦

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

Завдання 4

Ÿ²FD>})v¹LN*})¦˜{

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

Пояснення

Завдання 1

Ÿ     # range[n ... m]

Завдання 2

Ÿ        # range[n ... m]
 ²F      # m times do:
   D     # duplicate
    >    # increment
     }   # end loop
      )  # wrap in list

Завдання 3

v          # for each list in result of Task 2 do
 ¹L        # push range[1 ... n]
   N*      # multiply by index
     }     # end loop
      )    # wrap in list
       ¦   # discard first element

Завдання 4

˜          # flatten the result from Task 3
 {         # sort

3

MATL , 18 17 байт

Завдання 1

&:

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

Завдання 2

&:O2G:h!+

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

Завдання 3

&:O2G:h!+:7M!*

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

Завдання 4

&:O2G:h!+:7M!*1eS

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

Пояснення

Завдання 1

&:    % Binary range [n n+1 ... m] from implicit inputs n, m

Завдання 2

      % ... Stack contains [n n+1 ... m]
O     % Push 0
2G    % Push second input, m
:     % Unary range: gives [1 2 ... m]
h     % Concatenate horizontally: gives [0 1 2 ... m]
!     % Transpose into a column vector
+     % Add with broadcast

Завдання 3

      % ... Stack contains matrix from task 2
:     % Unary range. For matrix input it uses its (1,1) entry. So this gives [1 2 ... n]
7M    % Push [1 2 ... m] again
!     % Transpose into a column vector
*     % Multiply with broadcast

Завдання 4

      % ... Stack contains matrix from task 3
1e    % Linearize into a row vector
S     % Sort

3

Математика, 84 77 байт

Редагувати: Дякую Мартіну Ендеру за збереження 7 байт.

Завдання 1:

{n,m}n~Range~m

Чисто Functionз аргументами nта mякі виводи n~Range~m, форма інфіксації Range[n,m].

Завдання 2:

{n,m}n~Range~m~Table~(m+1)//0~Range~m+#&

n~Range~m~Table~(m+1)створює 2D масив із m+1рядками, де кожен рядок є результатом попереднього завдання. Потім застосовується //0~Range~m+#&функція Postfix функції, 0~Range~m+#&яка ефективно додає 0до першого рядка, 1до другого рядка і так далі до mдляm+1 го рядка.

Завдання 3:

{n,m}n~Range~m~Table~(m+1)//0~Range~m+#&//1##&~Array~{n,m}&

Це просто застосовує константну функцію 1##&~Array~{n,m}&до виводу попереднього завдання.

Завдання 4:

{n,m}n~Range~m~Table~(m+1)//0~Range~m+#&//1##&~Array~{n,m}&//Flatten//Sort

Flattens і Sorts таблиця множення.


2

Пітон, 183 байти

Завдання 1, 29 байт

r=range
a=lambda n,m:r(n,m+1)

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

Завдання 2, 84 байти

r=range
a=lambda n,m:r(n,m+1)
s=lambda n,m:[[w+i for w in r(n,m)] for i in a(0,m+1)]

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

Завдання 3, 137 байт

r=range
a=lambda n,m:r(n,m+1)
s=lambda n,m:[[w+i for w in r(n,m)] for i in a(0,m+1)]
d=lambda n,m:[[w*i for w in a(1,n)] for i in a(1,m)]

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

Завдання 4, 183 167 байт

r=range
a=lambda n,m:r(n,m+1)
s=lambda n,m:[[w+i for w in r(n,m)] for i in a(0,m+1)]
d=lambda n,m:[[w*i for w in a(1,n)] for i in a(1,m)]
f=lambda(z):sorted(sum(z,[]))

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

Пояснення:

Завдання 1:

Досить просто, він генерує nв mсписок з допомогою Python вбудованих в rangeфункції.

Завдання 2:

Кожне число 0до m+1, воно додає це число до кожного елемента списку з nдо m.

Завдання 3:

Для кожного числа від 1до m, воно помножує це число на кожне число у списку від 1до n.

Завдання 4:

Для цього використовується вбудована sortedфункція Python, яка сортує список від найменшого до найбільшого. Розуміння списку у функції використовується для вирівнювання списку. Він створює перелік кожного елемента в кожному пункті списку, наданому йому завданням 3.

  • Збережено дуже багато байтів завдяки @math_junkie.
  • Збережено 16 байт завдяки @ThisGuy

Збережено дуже багато байтів завдяки @math_junkie.


Ви не можете використовувати анонімні функції або лямбдаси насправді не коротші? (по моєму рахунку, здається, вони є)
cole

Це взагалі прийнятно для Python asnwers? Код для завдання 2, наприклад, не є повноцінною програмою з входом і виходом, а також не є функцією або визначенням функції.
ngenisis

@Cole Мені довелося використовувати неанонімні функції, щоб я міг використовувати їх у наступному коді.
Товариш SparklePony

@ngenisis Я думаю, що це нормально, оскільки ОР заявив, що код для завдання 2 повинен починатися з коду для завдання 1, а код для завдання 2 def s(n,m):return [[w+i for w in r(n,m)] for i in a(0,m+1)]- це повноцінна функція, коли код для завдання 1 визначений.
Товариш SparklePony

Ви можете зробити щось на кшталт a=lambda n,m:...кожного свого визначення функції. Анонімні функції завжди коротші в python
математика наркоман

2

PHP 7, 200 байт

Використовує вихідний буфер для очищення попереднього виводу.

Завдання 1

[,$n,$m]=$argv;ob_start();eval($s='echo join(" ",$v?:range($n+$i,$m+$i)),"
";');

Зберігає код у подальшому $sповторному використанні. The$vЗмінної для останнього завдання.

Завдання 2

[,$n,$m]=$argv;ob_start();eval($s='echo join(" ",$v?:range($n+$i,$m+$i)),"
";');for(;++$i<=$m;)eval($s);

Друкує решта рядків.

Завдання 3

[,$n,$m]=$argv;ob_start();eval($s='echo join(" ",$v?:range($n+$i,$m+$i)),"
";');for(;++$i<=$m;)eval($s);for(($c=ob_clean)();++$j<=$m;print"
")for(;++$$j<=$n;sort($v))echo$v[]=$j*$$j,' ';

Очищає вихідний буфер і друкує таблицю множення, зберігаючи числа $v.

Завдання 4

[,$n,$m]=$argv;ob_start();eval($s='echo join(" ",$v?:range($n+$i,$m+$i)),"
";');for(;++$i<=$m;)eval($s);for(($c=ob_clean)();++$j<=$m;print"
")for(;++$$j<=$n;sort($v))echo$v[]=$j*$$j,' ';$c();eval($s);

Знову очищає вихідний буфер і друкує $v.


1

PowerShell , 126 байт

Завдання 1

param($n,$m)$n..$m

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

Використовується ..вбудований оператор діапазону. Поведінка за замовчуванням для мається на увазі Write-Outputвставляє нову лінію між елементами, тому вихідний показ відображається як розділений новий рядок.


Завдання 2

param($n,$m)$n..$m>2;0..$m|%{$i=$_;($n..$m|%{$_+$i})-join','}

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

Звантажує перше завдання на STDERR >2;, а потім цикліть з 0на $m, кожен помічник налаштування ітерації, $iперш ніж повторно циклічно переходити $nдо $mта збільшувати кожне число $i. Вони -joinредагуються разом з комами, інакше це було б неоднозначним гігантським довгим результатом одного елемента на рядок.


Завдання 3

param($n,$m)$n..$m>2;0..$m|%{$i=$_;($n..$m|%{$_+$i})-join','}>2;(1..$m|%{$i=$_;(1..$n|%{$_*$i})-join' '})

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

Те ж саме, >2;щоб скинути попередній на STDERR. Тоді ми просто подвійний цикл від 1до $mпотім , 1щоб $n, встановивши помічник $iпо шляху, помножте значення, і -joinз простором , щоб зробити його табличним. Зверніть увагу на інкапсулюючі парени - вони вступлять у гру при наступному завданні - але тут вони просто гарантують, що вихід буде поставлений на трубопровід (який він уже був би, тож вони зайві).


Завдання 4

param($n,$m)$n..$m>2;0..$m|%{$i=$_;($n..$m|%{$_+$i})-join','}>2;(1..$m|%{$i=$_;(1..$n|%{$_*$i})-join' '})-split' '|%{+$_}|sort

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

Ага! Нарешті деяка надмірність. Оскільки в попередньому завданні є паролі, ми можемо братися за-split без проблем переходити на пробіл, переносити кожне на ціле число |%{+$_}, а потім |sort. Вихід знову розділений новим рядком.


Я думаю, що є кілька способів, як краще використовувати надмірність між завданнями - все-таки деякі.


1

ES2016-ish, 401 384 символів

Ось перша спроба. Я впевнений, що його можна було б трохи зменшити, але це досить коротко. Функції стрілки FTW! (Полюбіть ці неявні зворотні заяви.) Нові та вдосконалені за допомогою рядків шаблону!

Завдання 1

var a=Array,l=console.log,f=(n,m)=>a.from(a(1+m-n),(w,i)=>n+i),z=(n,m)=>l(f(n,m).join`, `)

Виклик z(n,m)для виходу журналу. (Я називаю console.log для подальшого гольфу.)

Завдання 2

Другий вірш ... розширюється на перший.

var a=Array,l=console.log,f=(n,m)=>a.from(a(1+m-n),(w,i)=>n+i),z=(n,m)=>l(f(n,m).join`, `),p,o,g=(n,m)=>{p=n,o=m;return [...a(m+1).keys()].map((d)=>f(d+p,d+o))},y=(n,m)=>l(g(n,m).join`\n`

Тепер зателефонуйте y(n,m). Гарненько, ні?

Завдання 3

Доведеться обійти більшість існуючих функціональних можливостей <sadface />.

var a=Array,l=console.log,f=(n,m)=>a.from(a(1+m-n),(w,i)=>n+i),z=(n,m)=>l(f(n,m).join`, `),p,o,g=(n,m)=>{p=n,o=m;return [...a(m+1).keys()].map((d)=>f(d+p,d+o))},y=(n,m)=>l(g(n,m).join`\n`,h=(n,m)=>[...a(m).keys()].map((d)=>(d+1)*n).join`\t`,i=(n,m)=>[...a(n).keys()].map((d)=>h((d+1),m)),v=(n,m)=>i(n,m).join`\n`

Тепер назва методу v. Назвіть це так само.

Завдання 4

А тепер ми можемо повторно використовувати.

var a=Array,l=console.log,f=(n,m)=>a.from(a(1+m-n),(w,i)=>n+i),z=(n,m)=>l(f(n,m).join`, `),p,o,g=(n,m)=>{p=n,o=m;return [...a(m+1).keys()].map((d)=>f(d+p,d+o))},y=(n,m)=>l(g(n,m).join`\n`,h=(n,m)=>[...a(m).keys()].map((d)=>(d+1)*n).join`\t`,i=(n,m)=>[...a(n).keys()].map((d)=>h((d+1),m)),v=(n,m)=>i(n,m).join`\n`,t=(n,m)=>l(v(n,m).match(/\d+/g).sort((a,b)=>+a>+b||+(a===b)*2-1).join(`, `)

Довелося пропустити uдля мого методу, так це t. Бум, що мені довелося ввести цю функцію сортування, тому що String.matchповертає значення як ... рядки.


0

Ruby, 121 103 байт

Все в Ruby є неправдивим, за винятком nilі false, а це означає, що завдання можуть бути налаштовані на ігнорування попереднього введення з нічого, але добре розміщеного and/ &&.

Завдання 1

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

n,m=$*.map &:to_i
p [*n..m]

Завдання 2

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

n,m=$*.map &:to_i
p [*n..m]&&(0..m).map{|i|[*n+i..m+i]}

Завдання 3

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

n,m=$*.map &:to_i
p [*n..m]&&(0..m).map{|i|[*n+i..m+i]}&&(1..m).map{|i|(1..n).map{|j|i*j}}

Завдання 4

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

n,m=$*.map &:to_i
p [*n..m]&&(0..m).map{|i|[*n+i..m+i]}&&(1..m).map{|i|(1..n).map{|j|i*j}}.flatten.sort
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.