Списки и массивы, часть за частью


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-на-m (в любом подходящем формате). Пример для 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 (работает в Октаве):

@(n,m)(n:m)

Тогда ваш код для Задачи 2 может быть (работает в Octave):

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

Код для задачи Task 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;чтобы код предыдущей задачи по существу превратился в no-op?
AdmBorkBork

1
@ AdmBorkBork, на PPCG нет такого понятия, как «дух вызова»: P Да, все в порядке .
Стьюи Гриффин

Нужно ли дополнять таблицу умножения?
HyperNeutrino

1
@ HyperNeutrino, нет.
Стьюи Гриффин

Когда вы говорите «положительное целое число», вы имеете в виду 0<n<mили 0<=n<m?
Value Ink

Ответы:


6

Желе , 12 байт

Задание 1

r

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

Задача 2

r+þ0r$}

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

Задача 3

r+þ0r$}
×þ

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

Задача 4

r+þ0r$}
×þFṢ

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

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

Задание 1

rявляется атомом диадического диапазона и делает именно то, что просит задача.

Задача 2

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

  • rведет себя как и прежде, уступая [n,…, m] .

  • 0r$} это быстрая ссылка (или быстрая ссылка, если хотите).

    Быстрый $(цепочка monadich) потребляет звенья 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 , является единственной ссылкой, которая выполняется по умолчанию. Остальные ссылки можно вызвать по главной ссылке, но мы не будем этого делать здесь.

Как и прежде, þ(таблица) будет вызывать ×(сложение) для каждого элемента в своем левом аргументе и любого элемента в своем правом аргументе, группируя результаты для каждого правого аргумента в одну строку.

Поскольку оба аргумента to ×þявляются целыми числами, þони преобразуются в диапазоны, преобразуя аргументы 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

Mathematica, 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)создает двумерный массив со m+1строками, где каждая строка является выводом предыдущей задачи. Тогда //0~Range~m+#&это постфикс применение функции , 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

Python, 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 сохранено очень много байтов.


Разве вы не можете использовать анонимные функции или лямбды не короче? (по моим подсчетам кажется, что они)
Коул

Это в целом приемлемо для пользователей Python? Например, код для задачи 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чтобы использовать его позже. $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-иш, 401 384 символов

Вот первая попытка. Я уверен, что это может быть немного сжато, но оно довольно короткое. Функции стрелок FTW! (Любите эти неявные операторы return.) Новое и улучшенное с помощью шаблонных строк!

Задание 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

Рубин, 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.