Поздравляем победителей
Задачу о подстроке верно решили:
— @GeorKu;
— @StSav012;
— @IPyth0n (@X_Python);
— @stalker1337;
— @HackingSection;
— @Shihiyev;
— @sidor0912
— @patriarch_chesslovo.
Кратчайшие верные решения предложили @HackingSection:
и @SmirnGreg:
Отдельное спасибо @SmirnGreg за замер скорости исполнения функций (!)
NB! Учитывайте повторяющиеся буквы в подстроке s. Для некоторых решений следующая пара строк отдаёт True, что явно неверно:
Присоединяйтесь: раз в неделю задачу решить — это вполне оптимальная нагрузка для занятого кодера.
#задача
@zen_of_python
Задачу о подстроке верно решили:
— @GeorKu;
— @StSav012;
— @IPyth0n (@X_Python);
— @stalker1337;
— @HackingSection;
— @Shihiyev;
— @sidor0912
— @patriarch_chesslovo.
Кратчайшие верные решения предложили @HackingSection:
def is_substring(s, t, nxt = 0):
return len(s) == [nxt := nxt + 1 for i in t if i == s[nxt]][-1]
и @SmirnGreg:
def is_substring(s: str, t: str):
return bool(re.match('.*' + '.*'.join(s) + '.*', t))
Отдельное спасибо @SmirnGreg за замер скорости исполнения функций (!)
NB! Учитывайте повторяющиеся буквы в подстроке s. Для некоторых решений следующая пара строк отдаёт True, что явно неверно:
s = "agggc"
t = "cgxggxxgxxa"
Присоединяйтесь: раз в неделю задачу решить — это вполне оптимальная нагрузка для занятого кодера.
#задача
@zen_of_python
👍5❤1❤🔥1🔥1😁1
Задача о комбинировании подстрок
Впрочем, почему бы и нет! Задача от подписчика @StSav012:
Есть две последовательности элементами без повторов в каждой. Часть элементов одной последовательности есть в другой, часть из второй — в первой. Напишите функцию merge, чтобы сгенерировать общую последовательность, в которой будут обе подпоследовательности в неизменном порядке.
Если у вас есть интересная задачка, и вы хотите посмотреть на решения коллег-подписчиков (плюс опционально получить фидбэк своего решения), оставляйте задачи в комментах под этим постом.
#задача
@zen_of_python
Впрочем, почему бы и нет! Задача от подписчика @StSav012:
Есть две последовательности элементами без повторов в каждой. Часть элементов одной последовательности есть в другой, часть из второй — в первой. Напишите функцию merge, чтобы сгенерировать общую последовательность, в которой будут обе подпоследовательности в неизменном порядке.
>>> merge('acfg', 'bcht')
... 'abcfght'
Если у вас есть интересная задачка, и вы хотите посмотреть на решения коллег-подписчиков (плюс опционально получить фидбэк своего решения), оставляйте задачи в комментах под этим постом.
#задача
@zen_of_python
🍌2
Поздравляем победителей
Задачу о клумбе верно решили:
— Cool and Fun Python (@Python3k);
— @Cheshir78;
— Лев Выскубов;
— @patriarch_chesslovo;
— @vsugoyak;
— @sidor0912;
Кратчайшие верные решения предложили Лев Выскубов:
и @patriarch_chesslovo:
Отдельное спасибо @patriarch_chesslovo за описание пограничных случаев (одноместная клумба) и проверку некоторых решений.
Присоединяйтесь: одна задача в неделю — это вполне оптимальная нагрузка, а навык решать задачи все равно будет расти.
#задача
@zen_of_python
Задачу о клумбе верно решили:
— Cool and Fun Python (@Python3k);
— @Cheshir78;
— Лев Выскубов;
— @patriarch_chesslovo;
— @vsugoyak;
— @sidor0912;
Кратчайшие верные решения предложили Лев Выскубов:
def is_fitting(flowerbed, n):
flowerbed = [0] + flowerbed + [0] # Чтобы на краю можно было цветочек посадить :-)
k = 0
for slot in range(1, len(flowerbed) - 1):
if not any(flowerbed[(slot - 1) : (slot + 2)]):
flowerbed[slot] = 1
k += 1
return k >= n
и @patriarch_chesslovo:
def is_fitting(flowerbed, required_slots):
is_prev_slot_filled = sum(flowerbed[0:2]) == 0
vacant_slots = int(is_prev_slot_filled)
for i in range(1, len(flowerbed)):
is_curr_slot_filled = not is_prev_slot_filled and sum(flowerbed[i-1:i+2]) == 0
vacant_slots += int(is_curr_slot_filled)
is_prev_slot_filled = is_curr_slot_filled
if vacant_slots >= required_slots:
return True
return vacant_slots >= required_slots
Отдельное спасибо @patriarch_chesslovo за описание пограничных случаев (одноместная клумба) и проверку некоторых решений.
Присоединяйтесь: одна задача в неделю — это вполне оптимальная нагрузка, а навык решать задачи все равно будет расти.
#задача
@zen_of_python
🎉6
Поздравляем победителей
Задачу про комбинирование строк верно решили:
— @beibarysm;
— Лев Выскубов;
— @impreza555;
— @sidor0912;
— @vsugoyak
Кратчайшие верные решения предложили Лев Выскубов:
и @impreza555:
#задача
@zen_of_python
Задачу про комбинирование строк верно решили:
— @beibarysm;
— Лев Выскубов;
— @impreza555;
— @sidor0912;
— @vsugoyak
Кратчайшие верные решения предложили Лев Выскубов:
def merge(str1, str2):
return ''.join(sorted(set(list(str1) + list(str2))))
и @impreza555:
def merge(str1: str, str2: str) -> str:
return "".join(sorted(set(str1) | set(str2)))
#задача
@zen_of_python
👍6🍌1
Задача про поворот изображения
На вход подаётся двоичная матрица n x n из нулей и единиц. Наша задача — перевернуть изображение по горизонтали, затем инвертировать его значения.
— Переворот [1,1,0] по горизонтали приводит к [0,1,1].
— Инвертирование изображения означает, что каждый 0 заменяется 1, а каждая 1 заменяется 0.
1. Переворот по горизонтали: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]
2. Инверсия: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
#задача
@zen_of_python
На вход подаётся двоичная матрица n x n из нулей и единиц. Наша задача — перевернуть изображение по горизонтали, затем инвертировать его значения.
— Переворот [1,1,0] по горизонтали приводит к [0,1,1].
— Инвертирование изображения означает, что каждый 0 заменяется 1, а каждая 1 заменяется 0.
>>> image = [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
>>> flip(image)
... [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
1. Переворот по горизонтали: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]
2. Инверсия: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
#задача
@zen_of_python
👍2❤1🍌1
Поздравляем победителей
Задачу о драгоценностях верно решили:
— Cool and Fun Python (@Python3k);
— @v1ktoriia_romanova;
— @leo5051;
— @lomserman;
— @vsugoyak;
— @sidor0912;
— @ganrre.
Тот редкий случай, когда кратчайшие верные решения в две строки предложили все: @Python3k, @v1ktoriia_romanova, @leo5051, @lomserman, @vsugoyak, @sidor0912, @ganrre.
#задача
@zen_of_python
Задачу о драгоценностях верно решили:
— Cool and Fun Python (@Python3k);
— @v1ktoriia_romanova;
— @leo5051;
— @lomserman;
— @vsugoyak;
— @sidor0912;
— @ganrre.
Тот редкий случай, когда кратчайшие верные решения в две строки предложили все: @Python3k, @v1ktoriia_romanova, @leo5051, @lomserman, @vsugoyak, @sidor0912, @ganrre.
#задача
@zen_of_python
❤5🍌2😍1🍾1
Задача о горном массиве
Вам даётся массив целых чисел
Существует некий
Дополнительное условие:
Для проверки:
#задача
@zen_of_python
Вам даётся массив целых чисел
arr
. Напишите функцию check_mountain()
, которая проверит ряд на последовательное увеличение, затем снижение (смотри картинку).Существует некий
i
при условии 0 < i < arr.length - 1
, чтобы:- arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
- arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
Дополнительное условие:
arr.length >= 3
Для проверки:
>>> arr = [3,5,5]
>>> check_mountain(arr)
... False
#задача
@zen_of_python
Telegram
Zen of Python
Полный Дзен Пайтона в одном канале
Разместить рекламу: @tproger_sales_bot
Правила общения: https://tprg.ru/rules
Другие каналы: @tproger_channels
Сайт: https://tprg.ru/site
Регистрация в перечне РКН: https://tprg.ru/xZOL
Разместить рекламу: @tproger_sales_bot
Правила общения: https://tprg.ru/rules
Другие каналы: @tproger_channels
Сайт: https://tprg.ru/site
Регистрация в перечне РКН: https://tprg.ru/xZOL
👍5
Поздравляем победителей
Задачу про поворот изображения верно решили:
— @Cheshir78;
— @ipipe_host;
— @savelevgeo;
— @vsugoyak;
— Cool and Fun Python (@Python3k).
Кратчайшие верные решения предложили @Cheshir78:
и @ipipe_host:
Отдельный респект @Python3k за решение, которое понятно на любом уровне Py-знания:
#задача
@zen_of_python
Задачу про поворот изображения верно решили:
— @Cheshir78;
— @ipipe_host;
— @savelevgeo;
— @vsugoyak;
— Cool and Fun Python (@Python3k).
Кратчайшие верные решения предложили @Cheshir78:
def flip(image):
return [[1 - x for x in row[::-1]] for row in image]
и @ipipe_host:
def flip(image):
return [[abs(j - 1) for j in i[::-1]] for i in image]
Отдельный респект @Python3k за решение, которое понятно на любом уровне Py-знания:
def flip(image: list[list[int]]) -> list[list[int]]:
"""Поворот изображения."""
n = len(image)
for row in image:
row.reverse()
for i in range(n):
row[i] = 1 - row[i]
return image
# пример работы
image = [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
flipped_image = flip(image)
for row in flipped_image:
print(row)
#задача
@zen_of_python
👍6🍾2🍌1
Задача об email
Адрес электронной почты состоит из локального и доменного имён, разделённых знаком «@». Помимо строчных букв, электронное письмо может содержать один или несколько символов «.» (точка) или «+» (плюс).
Например, в «alice@tproger.ru» alice — это локальное имя, а tproger.ru — доменное. Если вы добавите точки '.' в локальное имя (например, al.ice), почта все равно полетит на тот же адрес alice.
Если вы добавите + в локальное имя, все, что находится после первого такого плюса, будет игнорироваться. Это позволяет фильтровать определённые письма. Например, письмо на m.y+name@email.com будет перенаправлено на my@email.com».
NB! эти правила не распространяются на доменные имена. Возможно использование обоих этих правил одновременно.
Напишите функцию, которая принимает список почт и рассчитывает количество различных адресов, которые фактически получают почту.
Объяснение: из перечисленных адресов только testemail@tproger.ru и "testemail@tproger.ru" действительно получат письма.
#задача
@zen_of_python
Адрес электронной почты состоит из локального и доменного имён, разделённых знаком «@». Помимо строчных букв, электронное письмо может содержать один или несколько символов «.» (точка) или «+» (плюс).
Например, в «alice@tproger.ru» alice — это локальное имя, а tproger.ru — доменное. Если вы добавите точки '.' в локальное имя (например, al.ice), почта все равно полетит на тот же адрес alice.
Если вы добавите + в локальное имя, все, что находится после первого такого плюса, будет игнорироваться. Это позволяет фильтровать определённые письма. Например, письмо на m.y+name@email.com будет перенаправлено на my@email.com».
NB! эти правила не распространяются на доменные имена. Возможно использование обоих этих правил одновременно.
Напишите функцию, которая принимает список почт и рассчитывает количество различных адресов, которые фактически получают почту.
>>> emails = ["test.email+alex@tproger.com","test.e.mail+bob.cathy@tproger.ru","testemail+david@t.proger.ru"]
>>> count_emails()
... 2
Объяснение: из перечисленных адресов только testemail@tproger.ru и "testemail@tproger.ru" действительно получат письма.
#задача
@zen_of_python
👍4❤1😁1
Поздравляем победителей
Задачу о горном массиве верно решили:
— @ganrre;
— Sergey;
— @v1ktoriia_romanova;
— @sidor0912;
— @vsugoyak.
Кратчайшие верные решения предложили @sidor0912:
и @vsugoyak:
#задача
@zen_of_python
Задачу о горном массиве верно решили:
— @ganrre;
— Sergey;
— @v1ktoriia_romanova;
— @sidor0912;
— @vsugoyak.
Кратчайшие верные решения предложили @sidor0912:
check_mountain = lambda a: all((len(i)>1 and i == sorted(set(i)) for i in (a[:a.index(max(a))+1], a[len(a)-1:a.index(max(a))-1:-1])))
и @vsugoyak:
def check_mountain(arr):
return all([arr[nm-1]<arr[nm] for nm in range(1,len(arr))])
#задача
@zen_of_python
👍3🍾1
Поздравляем победителей
Задачу про email верно решили:
—@Indiv06;
— @nxiqns;
— @vsugoyak;
— @flydzen;
— @sidor0912.
Кратчайшее верное решение предложил @@flydzen:
#задача
@zen_of_python
Задачу про email верно решили:
—@Indiv06;
— @nxiqns;
— @vsugoyak;
— @flydzen;
— @sidor0912.
Кратчайшее верное решение предложил @@flydzen:
def count_emails(emails: list[str]) -> int:
return len({(sp[0].replace('.', '').split('+')[0], sp[1]) for m in emails if (sp := m.split('@'))})
#задача
@zen_of_python
🔥2👍1
Задача о частом числе
На входе — массив целых чисел, отсортированный в порядке возрастания, и в нем есть ровно одно целое число, которое встречается чаще в 25% случаев. Напишите функцию find_frequent_num(), которая найдёт это число.
#задача
@zen_of_python
На входе — массив целых чисел, отсортированный в порядке возрастания, и в нем есть ровно одно целое число, которое встречается чаще в 25% случаев. Напишите функцию find_frequent_num(), которая найдёт это число.
>>> arr = [1,2,2,6,6,6,6,7,10]
>>> find_frequent_num(arr)
... 6
#задача
@zen_of_python
🌚1
Задача о счастливом числе
На входе матрица m x n различных чисел. Создайте функцию find_luckiest_number(), которая вернет счастливое число — такой элемент, который является минимальным в своей строке и максимальным в своём столбце.
Объяснение: 12 — минимальное число в своем ряду № 4 и максимальное в столбце № 4.
#задача
@zen_of_python
На входе матрица m x n различных чисел. Создайте функцию find_luckiest_number(), которая вернет счастливое число — такой элемент, который является минимальным в своей строке и максимальным в своём столбце.
>>> matrix = [[1,10,4,2],[9,3,8,7],[15,16,17,12]]
>>> find_luckiest_number(matrix)
... 12
Объяснение: 12 — минимальное число в своем ряду № 4 и максимальное в столбце № 4.
#задача
@zen_of_python
❤2
Поздравляем победителей
Задачу о счастливом числе верно решили:
— @Metimol;
— @longcompetition;
— Sergey;
— @xpos587;
— @vsugoyak;
Кратчайшее верное решение предложил @vsugoyak:
Отдельный респект @longcompetition за решения с учётом временной сложности алгоритма. Самое то для новичков в этой теме.
#задача
@zen_of_python
Задачу о счастливом числе верно решили:
— @Metimol;
— @longcompetition;
— Sergey;
— @xpos587;
— @vsugoyak;
Кратчайшее верное решение предложил @vsugoyak:
def find_luckiest_number(matrix):
return ls[0] if len(ls:=[mn for arr in matrix if (mn:=min(arr)) == max(matrix[el][arr.index(mn)] for el in range(len(matrix)))])>0 else None
Отдельный респект @longcompetition за решения с учётом временной сложности алгоритма. Самое то для новичков в этой теме.
#задача
@zen_of_python
👍4🍾2
Задача о Р̶о̶с̶с̶т̶а̶т̶е̶ зарплатах
Вам дан массив уникальных целых чисел, где salary[i] — это зарплата i-го сотрудника.
Напишите функцию, которая вернёт среднюю зарплату сотрудников без учёта минимальной и максимальной зарплаты.
Для теста:
#задача
@zen_of_python
Вам дан массив уникальных целых чисел, где salary[i] — это зарплата i-го сотрудника.
Напишите функцию, которая вернёт среднюю зарплату сотрудников без учёта минимальной и максимальной зарплаты.
Для теста:
>>> salaries = [4000,3000,1000,2000]
>>> get_mean_salary(salaries)
... 2500
#задача
@zen_of_python
❤1
Поздравляем победителей
Задачу о повороте матрицы верно решили:
— @Python3k;
— @erg_y;
— @vsugoyak.
Кратчайшее верное решение предложил @vsugoyak:
#задача
@zen_of_python
Задачу о повороте матрицы верно решили:
— @Python3k;
— @erg_y;
— @vsugoyak.
Кратчайшее верное решение предложил @vsugoyak:
def turn_matrix(grid, k):
return [[grid[(place:=(_n+(n:=len(grid[0]))*_m-k))%(n*len(grid))//n][place%n] for _n in range(len(grid[0]))] for _m in range(len(grid))]
#задача
@zen_of_python
🍾1
Задача о расстоянии между массивами
На входе два массива
Расстояния определяется как количество элементов
Для проверки:
Объяснение:
#задача
@zen_of_python
На входе два массива
arr1
и arr2
и целое число d
. Напишите функцию find_arr_distance()
, которая вернёт расстояние между двумя массивами. Расстояния определяется как количество элементов
arr1[i]
таких, что не существует элемента arr2[j]
, где arr1[i] - arr2[j]| <= d
.Для проверки:
>>> arr1 = [4,5,8],
>>> arr2 = [10,9,1,8]
>>> d = 2
>>> find_arr_distance(arr1, arr2, d)
... 2
Объяснение:
Для arr1[0]=4 имеем:
|4-10|=6 > d=2
|4-9|=5 > d=2
|4-1|=3 > d=2
|4-8|=4 > d=2
Для arr1[1]=5 имеем:
|5-10|=5 > d=2
|5-9|=4 > d=2
|5-1|=4 > d=2
|5-8|=3 > d=2
Для arr1[2]=8 имеем:
|8-10|=2 <= d=2
|8-9|=1 <= d=2
|8-1|=7 > d=2
|8-8|=0 <= d=2
#задача
@zen_of_python
❤1
Задача о Рокфеллере
Вам дан тензор с суммами на счетах, где account[i][j] — это сумма денег, которую имеет i-й клиент в j-м банке.
Напишите функцию find_richest(), которая найдет Рокфеллера — самого богатого клиента.
Для проверки:
#задача
@zen_of_python
Вам дан тензор с суммами на счетах, где account[i][j] — это сумма денег, которую имеет i-й клиент в j-м банке.
accounts = [[1,2,5],[3,6,1]]
У 1-го клиента два счета на сумму 4 (1 + 3)
У 2-го — 8 (2 + 6)
У 3-го — 6 (5 + 1)
Напишите функцию find_richest(), которая найдет Рокфеллера — самого богатого клиента.
Для проверки:
>>> accounts = [[1,2,5],[3,6,1]]
>>> find_richest(accounts)
... 2
#задача
@zen_of_python
🔥4👍1🍌1