Zen of Python
20.1K subscribers
1.29K photos
179 videos
36 files
3.3K links
Полный Дзен Пайтона в одном канале

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
Задача о горном массиве

Вам даётся массив целых чисел 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
👍5
Поздравляем победителей

Задачу про поворот изображения верно решили:

@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! эти правила не распространяются на доменные имена. Возможно использование обоих этих правил одновременно.

Напишите функцию, которая принимает список почт и рассчитывает количество различных адресов, которые фактически получают почту.


>>> 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
👍41😁1
Поздравляем победителей

Задачу о горном массиве верно решили:

@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:


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(), которая найдёт это число.


>>> 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(), которая вернет счастливое число — такой элемент, который является минимальным в своей строке и максимальным в своём столбце.


>>> 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:


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-го сотрудника.

Напишите функцию, которая вернёт среднюю зарплату сотрудников без учёта минимальной и максимальной зарплаты.

Для теста:


>>> salaries = [4000,3000,1000,2000]
>>> get_mean_salary(salaries)
... 2500


#задача

@zen_of_python
1
Поздравляем победителей

Задачу  о повороте матрицы верно решили:
@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
Задача о расстоянии между массивами

На входе два массива 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​​​​​​​-м банке.


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