Для создания двумерных массивов можно использовать вложенные генераторы, разместив
генератор списка, являющегося строкой, внутри генератора для строк. Например,
сделать список из n строк и m столбцов при помощи генератора,
создающего список из n элементов, каждый элемент которого является списком из
m нулей:
[ [0] * m for i in range(n)]
Но при этом внутренний список также можно создать при помощи, например, такого генератора:
[0 for j in range(m)]. Вложив один генератор в другой получим вложенные генераторы:
[ [0 for j in range(m)] for i in range(n)]
Но если число 0 заменить на некоторое выражение, зависящее от i
(номер строки) и j (номер столбца), то можно получить список, заполненный
по некоторой формуле.
В этом листке вам нужно будет придумать генераторы для заданных двумерных массивов.
Например, пусть нужно задать следующий массив (для удобства добавлены дополнительные пробелы между элементами):
В этом массиве n = 5 строк, m = 6 столбцов, и элемент
в строке i и столбце j вычисляется по формуле:
A[i][j] = i * j.
Ответом на это задание будет выражение:
[[ i * j for j in range(m)] for i in range(n)]
Ответ, содержащий заданное выражение, нужно ввести в поле ввода (лучше - скопировав из работающей программы).
В выражении должны использоваться переменные n и m, означающие
число строк и столбцов в массиве. Если в задании сказано, что массив — квадратный, то число
строк и столбцов в нем равно n, а значение m не определено и использовать его нельзя.
0: Таблица умножения
Заполните массив таблицей умножения по правилу A[i][j] = i * j.
Заполните прямоугольный массив целыми числами по образцу
(на главной диагонали стоят нули, выше нее стоят 1, затем 2, 0, 1 и т.д.
Номера всех диагоналей чередуются по циклу 0, 1, 2, ...).
Заполните квадратный массив целыми числами по образцу.
На побочной диагонали стоят нули, на соседних с нею диагоналях стоят 1, затем 2 и т.д.
Пример для n = 5.
4 3 2 1 0
3 2 1 0 1
2 1 0 1 2
1 0 1 2 3
0 1 2 3 4
IDE
Тернарный оператор
В языке python есть конструкция, которая позволяет использовать if прямо внутри выражений. Например, можно писать
A = 1 if i > j else 0
или даже
A = some_number + (1 if i > j else 2 if j < i else 3) + other_number
Их можно использовать и в генераторах.
Впрочем, если условие нетривиально, то такую конструкцию лучше не использовать.
M: Каждая четвертая диагональ
Заполните квадратный массив целыми числами по образцу.
На побочной диагонали стоят единицы, каждая четвертая по счету
диагональ, параллельная побочной, также заполнена единицами.
Заполните прямоугольный массив целыми числами по образцу
(нули стоят на пересечении строк и столбцов с нечетными номерами, в остальных клетках стоят единицы).
Иногда оказывается удобным явно или неявно приводить логические типы к int и наоборот. В этом случае действуют следующие правила.
При приведении значений типа bool к типу int значение True переводится в 1, значение
False переводится в 0. Такое преобразование может быть выполнено явно при помощи функции int, или оно
выполняется неявно если значение типа bool используется в арифметических операциях. Например,
выражение (x > 0) + (y > 0) + (z > 0) позволяет определить, сколько среди чисел x, y, z положительных.
Это позволяет также конструировать аналоги логических выражений. Например, максимум из чисел a и b можно найти так:
print(a * (a > b) + b * (a <= b))
В этом примере если (a > b), то первое слагаемое будет равно a, а второе слаемое будет равно 0. Если же
(a <= b), то первое слагаемое будет 0, а второе будет равно b.
При приведении значения типа int к типу bool число 0 переводится в False, а ненулевые
числа переводятся в True. При переводе строк и списков к типу bool пустые строки и списки приводятся
к значению False, а непустые — к True.
Интересны правила применения логических операций and и or к выражениям нелогического типа.
Здесь применяются правила неполного вычисления логических выражений. Для операции and сначала вычисляется значение
левого операнда. Если левый операнд приводится к логическому False (то есть имеет значение False, 0,
является пустой строкой или пустым списком), то возвращается значение левого операнда. Иначе возвращается значение правого операнда.
Аналогично работает операция or: если значение левого операнда True, неотрицательное число,
непустая строка или список, то возвращается значение левого операнда, иначе возвращается значение правого операнда.
Q: Квадранты
Заполните квадратный массив целыми числами по образцу.
На главной и побочных диагоналях стоят нули, эти диагонали делят массив
на четыре части. В верхней части записаны единицы, в правой записаны
двойки, в нижней записаны тройки, в левой записаны четверки.
Заполните прямоугольный массив целыми числами начиная с единицы
по строчкам слева направо, строчки обходятся сверху вниз.
При этом в левом верхнем углу записано число 1, далее заполняются
только клетки, имеющие тот же цвет в шахматной раскраске, что и левый
верхний угол, а в остальных клетках записано число 0.
Заполните прямоугольный массив вложенными прямоугольниками.
Клетки, находящиеся на краях прямоугольника, заполняются числом 0, соседние с ними
клетки заполняются числом 1, соседние с ними — числом 2 и т.д.
Заполните квадратный массив целыми числами по образцу.
В углах записан число 0, в соседних с ними с углами клетках
записано число 1, в соседних с ними клетках записано число 2 и т.д.
Клетки считаются соседними, если у них есть общая сторона или вершина.
Заполните квадратный массив целыми числами по образцу.
В углах записан число 0, в соседних с ними с углами клетках
записано число 1, в соседних с ними клетках записано число 2 и т.д.
Клетки считаются соседними, если у них есть общая сторона.
Заполните квадратный массив целыми числами по образцу.
Часть массива ниже главной диагонали заполнена нулями. На главной диагонали
записаны числа 0, 1, ..., n - 1. На диагонали выше главной —
числа n, n + 1, ..., 2n - 2. Следующая диагональ заполняется, начиная
с числа 2n - 1 и т.д.
Заполните прямоугольный массив целыми числами начиная с нуля
вдоль диагоналей, параллельных побочной диагонали. Заполнение
проводится сверху вниз, диагонали обходятся слева направо.
Необходимо проверить числа на простоту. Для данного числа \(n\) составьте
список из \(n-1\) элемента. \(i\)-й элемент списка будет равен True,
если число \(i+2\) — простое, и False — если составное,
то есть список содержит признаки простоты для чисел от 2 до \(n\).
Ограничения на \(n\) от 2 до 4000, поэтому проверка числа
\(i\) на простоту должна иметь сложность \(O(\sqrt{i})\).
Последовательность Туе–Морса является бесконечной последовательностью из
0 и 1, построенной следующим образом:
Последовательность начинается с числа 0. Далее построенная часть последовательности
удваивается: к уже построенной части в конец дописывается эта же часть, но с инвертированием
всех символов: 0 меняется на 1, а 1 меняется на 0.
Например, к последовательности 0 дописывается 1, получилось 01. Затем к 01 дописывается 10, получилось 0110.
Затем к 0110 дописывается 1001, получилось 01101001. Затем получится 0110100110010110 и т.д.
По данному числу \(n \le 1000\) постройте первые \(n\) элементов последовательности Туе–Морса
в виде списка из чисел 0 и 1.
Например для n = 12 необходимо вернуть список:
[0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1]
Примечание: вряд ли вам удастся построить нужный генератор, используя только определение последовательности Туе–Морса.