📌 Задача
У вас есть девять цифр:
Три функции:
-
-
Здесь просится решение, избавленное от if-ов и кодирования операций с помощью символов.
👉 Это не оптимальное решение. Пишите свое решение в комментариях👇
@python_job_interview
У вас есть девять цифр:
 1, 2, …, 9. Именно в таком порядке. Вы можете вставлять между ними знаки «+», «-» или ничего. У вас будут получаться выражения вида 123+45-6+7+89. Найдите все из них, которые равны 100.def all_combinations(a):
    if len(a) <= 1:
        yield a
    else:
        head = ''
        tail = list(a)
        while len(tail) > 0:
            head += tail.pop(0)
            for s in all_combinations(tail):
                yield [head] + s
def all_signs(n):
    if n == 0:
        yield ()
    else:
        for tail in all_signs(n-1):
            for s in '+-':
                yield (s,) + tail
def perform_operations(nums, signs):
    nums = list(map(int, nums))
    result = nums.pop(0)
    n = 1
    for s in signs:
        if s == '+':
            result += nums.pop(0)
        if s == '-':
            result -= nums.pop(0)
        n += 1
    return result
for numbers in all_combinations(tuple(map(str, range(1, 10)))):
    #print(numbers)
    for signs in all_signs(len(numbers) - 1):
        #print(signs)
        summ = perform_operations(numbers, signs)
        if summ == 100:
            print(
                ''.join(map(
                    lambda x: ''.join(x),
                    zip(numbers, signs)))
                + numbers[-1])
Три функции:
-
all_combinations — итератор, который выдает все числа для операций (в терминах задачи: вставляет пустые места); -
all_signs — выдаёт все возможные сочетания знаков + и - заданной длинны (для единообразия, это тоже итератор с рекурсией); - perform_operations — выполняет операции.Здесь просится решение, избавленное от if-ов и кодирования операций с помощью символов.
👉 Это не оптимальное решение. Пишите свое решение в комментариях👇
@python_job_interview
🔥8👍3👏2❤1
  📌 Тестовое задание по python
Мы уже создавали матрицу спирали, теперь создадим полноценный проект.
Необходимо реализовать Python-библиотеку, которая осуществляет получение квадратной матрицы (NxN) с удалённого сервера и возвращает её пользователю в виде List[int]. Этот список должен содержать результат обхода полученной матрицы по спирали: против часовой стрелки, начиная с левого верхнего угла (см. test case ниже).
Пример исходной матрицы:
Матрица гарантированно содержит целые неотрицательные числа. Форматирование границ иными символами не предполагается.
Требования к выполнению и оформлению
Библиотека содержит функцию со следующим интерфейсом:
...
Функция единственным аргументом получает URL для загрузки матрицы с сервера по протоколу HTTP(S).
Функция возвращает список, содержащий результат обхода полученной матрицы по спирали: против часовой стрелки, начиная с левого верхнего угла.
Взаимодействие с сервером должно быть реализовано асинхронно - посредством aiohttp, httpx или другого компонента на asyncio.
Библиотека должна корректно обрабатывать ошибки сервера и сетевые ошибки (5xx, Connection Timeout, Connection Refused, ...).
В дальнейшем размерность матрицы может быть изменена с сохранением форматирования. Библиотека должна сохранить свою работоспособность на квадратных матрицах другой размерности.
Решение задачи необходимо разместить на одном из публичных git-хостингов (GitHub, GitLab, Bitbucket). Можно также выслать решение в виде архива (zip, tar). Загружать библиотеку в PyPi или другие репозитории не требуется.
Проверка решения
Для самостоятельной проверки можно использовать следующий test case:
Загружайте свои решения и отправляйте ссылки в комментарии👇
@python_job_interview
Мы уже создавали матрицу спирали, теперь создадим полноценный проект.
Необходимо реализовать Python-библиотеку, которая осуществляет получение квадратной матрицы (NxN) с удалённого сервера и возвращает её пользователю в виде List[int]. Этот список должен содержать результат обхода полученной матрицы по спирали: против часовой стрелки, начиная с левого верхнего угла (см. test case ниже).
Пример исходной матрицы:
+-----+-----+-----+-----+
|  10 |  20 |  30 |  40 |
+-----+-----+-----+-----+
|  50 |  60 |  70 |  80 |
+-----+-----+-----+-----+
|  90 | 100 | 110 | 120 |
+-----+-----+-----+-----+
| 130 | 140 | 150 | 160 |
+-----+-----+-----+-----+Матрица гарантированно содержит целые неотрицательные числа. Форматирование границ иными символами не предполагается.
Требования к выполнению и оформлению
Библиотека содержит функцию со следующим интерфейсом:
async def get_matrix(url: str) -> List[int]:...
Функция единственным аргументом получает URL для загрузки матрицы с сервера по протоколу HTTP(S).
Функция возвращает список, содержащий результат обхода полученной матрицы по спирали: против часовой стрелки, начиная с левого верхнего угла.
Взаимодействие с сервером должно быть реализовано асинхронно - посредством aiohttp, httpx или другого компонента на asyncio.
Библиотека должна корректно обрабатывать ошибки сервера и сетевые ошибки (5xx, Connection Timeout, Connection Refused, ...).
В дальнейшем размерность матрицы может быть изменена с сохранением форматирования. Библиотека должна сохранить свою работоспособность на квадратных матрицах другой размерности.
Решение задачи необходимо разместить на одном из публичных git-хостингов (GitHub, GitLab, Bitbucket). Можно также выслать решение в виде архива (zip, tar). Загружать библиотеку в PyPi или другие репозитории не требуется.
Проверка решения
Для самостоятельной проверки можно использовать следующий test case:
SOURCE_URL = 'https://raw.githubusercontent.com/avito-tech/python-trainee-assignment/main/matrix.txt'TRAVERSAL = [
    10, 50, 90, 130,
    140, 150, 160, 120,
    80, 40, 30, 20,
    60, 100, 110, 70,
]def test_get_matrix():
    assert asyncio.run(get_matrix(SOURCE_URL)) == TRAVERSALЗагружайте свои решения и отправляйте ссылки в комментарии👇
@python_job_interview
👍10🔥3❤1
  Каким будет результат выполнения кода?
  Anonymous Quiz
    24%
    True a
      
    3%
    a True
      
    7%
    a
      
    14%
    True
      
    18%
    True True
      
    3%
    None
      
    14%
    Error
      
    18%
    Узнать ответ
      
    👏2👍1
  📌 Дана последовательность, в которой находятся рандомные числа в произвольном порядке, в ней находятся только парные элементы.
 
Пример: 2 1 5 5 2 1
К ним добавляют элемент в произольное место
Например: 2 3 1 5 5 2 1
Найти этот уникальный элемент используя только один цикл
=========================================
(сложность программ - линейная)
Это громоздкое решение. Пишите свое решение в комментариях👇
@python_job_interview
Пример: 2 1 5 5 2 1
К ним добавляют элемент в произольное место
Например: 2 3 1 5 5 2 1
Найти этот уникальный элемент используя только один цикл
=========================================
(сложность программ - линейная)
import random
import numpy as np
def merge(lst1, lst2):
    yield from lst1
    yield from lst2
def shuffle_list(n: int):
    lst = np.arange(1, n)
    np.random.shuffle(lst)
    return lst
def random_insert(lst, item):
    lst.insert(random.randrange(len(lst)+1), int(item))
def find_item(lst: list):
    init_lst  = []
    for item in lst:
        if lst.count(item) == 1:
            init_lst.append(item)
    return init_lst
n = int(input("n > "))
a_list = shuffle_list(n)
b_list = shuffle_list(n)
c_list = list(merge(a_list, b_list))
e = input("e > ")
random_insert(c_list, e)
print(find_item(c_list))Это громоздкое решение. Пишите свое решение в комментариях👇
@python_job_interview
👍5❤1🔥1
  Ответ
s = 'To be, or not to be, that is the question!'
new_s = ''
eng_lower_alphabet = 'abcdefghijklmnopqrstuvwxyz'
eng_upper_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in range(len(s)):
    if s[i].isupper():
        ind = eng_upper_alphabet.find(s[i])
        while not ind + 17 < len(eng_upper_alphabet):
            eng_upper_alphabet += eng_upper_alphabet
        new_s += eng_upper_alphabet[ind + 17]
    elif s[i].islower():
        ind = eng_lower_alphabet.find(s[i])
        while not ind + 17 < len(eng_lower_alphabet):
            eng_lower_alphabet += eng_lower_alphabet
        new_s += eng_lower_alphabet[ind + 17]
    else:
        new_s += s[i]
print(new_s)
Kf sv, fi efk kf sv, kyrk zj kyv hlvjkzfe!#junior
Пишите свое решение в комментариях👇
@python_job_interview
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍8🔥2❤1👎1
  Напиши программу для очистки и нормализации первой главы 'Моби Дика', находящегося в файле moby.txt.
▪Все символы должны относиться к одному регистру.
▪Удалить все знаки препинания.
▪Записать слова по одному на строку во второй файл с именем moby_clean.txt
Подсказка:
> trantab = str.maketrans({'i': '1', 'e': None})
> print(trantab)
> s = "this is string example....wow!!!"
> print(s.translate(trantab))
> intab = "aeiou"
> outtab = "12345"
> trantab = str.maketrans(intab, outtab)
> print(trantab)
> s = "this is string example....wow!!!"
> print(s.translate(trantab))
> trantab = str.maketrans("", "", "sw")
> print(trantab)
> s = "this is string example....wow!!!"
> print(s.translate(trantab))Пишите свое решение в комментариях👇
@python_job_interview
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍5🔥3🥰1
  Потому что Python не "знает" цифр больше 35. Первые десять берутся из обычной десятичной: 0...9, следующие 26 — буквы латиницы a...z. Так исторически сложилось ещё полвека назад. А какой символ по вашему он должен использовать для цифры 36?
Кcтати, а разве бывает позиционная система счисления с основанием 0? Почему её Python разрешает?
0 используется как специальное значение, означающее автоматическое определение основания системы счисления по формату строки.
 int("10", 0) == 10, int("0x10", 0) == 16, int("0b10", 0) == 2.
Если же основание системы счисления не указано, то считается равным 10.
Чтобы работать с числами в системе счисления больше 36, можно воспользоваться библиотекой intlib.
from intlib import Int
n = 12345
base = 37
n_base_37 = Int(n).to_base(base)Также в
intlib есть метод from_base(), который можно использовать для перевода числа из другой системы счисления в 10-ую:from intlib import Int
n_base_37 = "a1b2c3d4e5"
base = 37
n = Int(n_base_37, base=base)@python_job_interview
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍19🔥5🤯4❤2
  Предупреждения обычно выводятся на экран в ситуациях, когда не гарантируется ошибочное поведение и программа, как правило, может продолжать работу, однако пользователя следует уведомить о чём-либо. Базовым классом для предупреждений является
Warning, который наследуется от Exception. Базовым классом-наследником Warning для пользовательских предупреждений является UserWarning.Для чего нужен модуль warning
В модуле
warning собраны функции для работы с предупреждениями. Основной является функция warn, которая принимает один обязательный параметр message, который может быть либо строкой-сообщением, либо экземпляром класса или подкласса Warning (в таком случае параметр category устанавливается автоматически) и два опциональных параметра: category (по умолчанию – UserWarning) – класс предупреждения и stacklevel (по умолчанию – 1) – уровень вложенности функций, начиная с которого необходимо выводить содержимое стека вызовов (полезно, например, для функций-обёрток для вывода предупреждений, где следует задать stacklevel=2, чтобы предупреждение относилось к месту вызова данной функции, а не самой функции).@python_job_interview
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍4❤3🔥3
  ⚡️ Задачи на Python с использованием dfs + bfs
Дана двоичная матрица размера n x n, где 1 представляет сушу, а 0 представляет воду.
Остров — это 4-направленно связанная группа 1, не связанная ни с какими другими 1. В сетке ровно два острова.
Вы можете изменить 0 на 1, чтобы соединить два острова в один остров.
Возвращает наименьшее количество нулей, которое нужно перевернуть, чтобы соединить два острова.
1. Для начала я предлагаю найти 1-ый остров в матрице, с помощью обхода в глубину
# Перебираем двумерный массив, пока не найдем первый элемент суши
2. С помощью обхода в ширину мы найдем кратчайший путь до 2-го острова, для этого мы заполнили очередь координатами элементов 1-го острова.
# Чтобы убрать больше количество условных операторов
# я буду использовать цикл for, в котором я буду перебирать
# все возможные варианты дальнейшего пути
@python_job_interview
Дана двоичная матрица размера n x n, где 1 представляет сушу, а 0 представляет воду.
Остров — это 4-направленно связанная группа 1, не связанная ни с какими другими 1. В сетке ровно два острова.
Вы можете изменить 0 на 1, чтобы соединить два острова в один остров.
Возвращает наименьшее количество нулей, которое нужно перевернуть, чтобы соединить два острова.
1. Для начала я предлагаю найти 1-ый остров в матрице, с помощью обхода в глубину
(dfs), если мы нашли элемент 1-го острова, тогда меняем значение в двумерной матрице на 2. Для экономии времени мы будем заранее заполнять очередь для будущего обхода в ширину (bfs).n = len(grid)
queue = []
def dfs(x, y):
  if x > 0 or x >= n or 0 > y or y >= n or grid[x][y] != 1:
    return
  grid[x][y] = 2
  queue.append([x, y, 0])
  dfs(x - 1, y)
  dfs(x + 1, y)
  dfs(x, y - 1)
  dfs(x, y + 1)# Перебираем двумерный массив, пока не найдем первый элемент суши
flag = False
for i in range(n):
  for j in range(n):
    if grid[i][j]:
      dfs(i, j)
      flag = True
      break
  if flag:
  break
2. С помощью обхода в ширину мы найдем кратчайший путь до 2-го острова, для этого мы заполнили очередь координатами элементов 1-го острова.
# Чтобы убрать больше количество условных операторов
# я буду использовать цикл for, в котором я буду перебирать
# все возможные варианты дальнейшего пути
dirct = [(0, 1), (0, -1), (1, 0), (-1, 0)]
while len(queue) != 0:
  # step - расстояние до 2-го острова
  x, y, step = queue[0][0], queue[0][1], queue[0][2]
  queue.pop(0)
  for dx, dy in dirct:
    x1, y1 = x + dx, y + dy
    if 0 > x1 or x1 >= n or 0 > y1 or y1 >= n:
      continue
    if grid[x1][y1] == 1:
      return step # ответ на задачу
    if grid[x1][y1] == 0:
      grid[x1][y1] = 2
      queue.append([x1, y1, step + 1])
Весь код:class Solution(object):
    def shortestBridge(self, grid):
        n = len(grid)
        queue = []
        def dfs(x, y):
            if 0 > x or x >= n or 0 > y or y >= n or grid[x][y] != 1:
                return
            grid[x][y] = 2
            queue.append([x, y, 0])
            dfs(x - 1, y)
            dfs(x, y - 1)
            dfs(x + 1, y)
            dfs(x, y + 1)
        flag = False
        for i in range(n):
            for j in range(n):
                if grid[i][j]:
                    dfs(i, j)
                    flag = True
                    break
            if flag:
                break
        dirct = [(0, 1), (1, 0), (-1, 0), (0, -1)]
        while len(queue) != 0:
            x, y, step = queue[0][0], queue[0][1], queue[0][2]
            queue.pop(0)
            for dx, dy in dirct:
                x1, y1 = x + dx, y + dy
                if 0 > x1 or x1 >= n or 0 > y1 or y1 >= n:
                    continue
                if grid[x1][y1] == 1:
                    return step
                if grid[x1][y1] == 0:
                    grid[x1][y1] = 2
                    queue.append([x1, y1, step + 1])@python_job_interview
👍13🔥2❤1
  ⚡️ Задачи на Python 
Дана переменная, в которой хранится информация о затратах и доходе рекламных кампаний по различным источникам. Необходимо дополнить исходную структуру показателем ROI по формуле:
Пример работы программы:
Результат:
Пишите свое решение в комментариях👇
@python_job_interview
Дана переменная, в которой хранится информация о затратах и доходе рекламных кампаний по различным источникам. Необходимо дополнить исходную структуру показателем ROI по формуле:
(revenue / cost - 1) * 100Пример работы программы:
results = {
    'vk': {'revenue': 103, 'cost': 98},
    'yandex': {'revenue': 179, 'cost': 153},
    'ok': {'revenue': 103, 'cost': 110},
    'adwords': {'revenue': 35, 'cost': 34},
    'twitter': {'revenue': 11, 'cost': 24},
}Результат:
{'adwords': {'revenue': 35, 'cost': 34, 'ROI': 2.94},
 'ok':      {'revenue': 103, 'cost': 110, 'ROI': -6.36},
 'twitter': {'revenue': 11, 'cost': 24, 'ROI': -54.17},
 'vk':      {'revenue': 103, 'cost': 98, 'ROI': 5.1},
 'yandex':  {'revenue': 179, 'cost': 153, 'ROI': 16.99}}Пишите свое решение в комментариях👇
@python_job_interview
👍10❤2🔥2
  Вам дан набор чисел в виде списка Python. Необходимо найти медиану этого числового ряда.
Задание
Напишите функцию FindMedian, которая будет возвращать одно число - медианное значение.
Функция FindMedian принимает на вход arr - исходный список с числами.
Пример:
arr = [1, 5, 2, 3, 6]
Ответ: 3
Пример:
arr = [100, 5, 2, 4, 3, 6]
Ответ: 4.5
Дополнительная информация
Обратите внимание, что шаблон решения представлен в виде (на примере языка Python):
class Answer:
    def function(self, arg1, arg2):
        # напишите свой код ниже
        return res
Здесь function - функция, которую вам нужно написать (от задачи к задаче ее имя меняется), а arg1, arg2 - аргументы этой функции.Чтобы решить задачу, напишите свой код между комментарием и выражением return ....
print(Answer().function(arg1, arg2))Если вам нужно импортировать какой-то модуль, указывайте модуль до class Answer. Например:
import mymodule 
class Answer:
    ...
Полный пример:# импортируем модуль
import collections
class Answer:
    def problemSolve(self, n, m):
        # напишите свой код ниже
        ...
        return res
# промежуточно смотрим результат
print(Answer().problemSolve(n=2, m=3))Пишите свое решение в комментариях👇
@python_job_interview
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍12❤2🔥1
  Напишите декоратор TimeDecorator, который будет замерять время выполнения декорированной функции.
Исходная функция должна возвращать результат, а декоратор должен просто выводить строку "Затрачено N секунд" на экран.
Пример:
def func(...):
  ... 
  print('Я закончила работать!')
func()
# Затрачено 0.5 секунд
# Я закончила работать!Пишите свое решение в комментариях👇
@python_job_interview
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍9🔥2🥰1
  Напишите декоратор RepeatDecorator, который проверяет, запускалась ли ранее обернутая функция с заданными позиционными аргументами. Если такие аргументы уже подавались на вход данной функции, то нужно вывести на экран сообщение: «Функция с такими аргументами уже запускалась!».
Примечание: Если одна функция запускалась с заданными аргументами, а потом другая запускается с теми же аргументами, то декоратор не должен выводить сообщение.
Пример:
func1(1, 2)
> Ничего не выводится
func1(2, 1)
> Ничего не выводится
func1(3, 1)
> Ничего не выводится
func1(1, 2)
# Функция с такими аргументами уже запускалась!
func2(1, 2)
> Ничего не выводится, т.к. функция другая
func2(1, 2)
# Функция с такими аргументами уже запускалась!Пишите свое решение в комментариях👇
@python_job_interview
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍10❤1🔥1
  В шеренгу друг за другом стоят
n человек, рост i-го из них равен ai условных единиц. Вы тоже собираетесь встать в эту шеренгу, при чем вам хочется встать на такую позицию p, чтобы f(p) = [количество людей левее вас того же роста, что и вы] умножить на [количество людей правее вас ростом, не равным росту вас] было максимально. Для этого вы можете встать в начало шеренги, в её конец, или между любыми 2мя соседними людьми. К сожалению вы не можете точно вспомнить ваш рост, у вас есть только m предположений о том, каким он может быть, и для каждого из них вы хотели бы знать оптимальную позицию, на которую вам стоило бы встать.Решение:
Cчитаем сразу для нулевой позиции, сколько в списке не вашего роста для каждой гипотезы. А потом на каждом шаге изменяем кол-во равных слева и неравных справа по текущему значению списка
equal = [0 for i in range(len(m))]
notequal = [len(list(filter(lambda x: x != m[i], n))) for i in range(len(m))]
valsave = [0 for i in range(len(m))]
possave = [0 for i in range(len(m))]
for i in range(len(n)):
    for x in range(len(m)):
        if n[i] == m[x]:
            equal[x] += 1
        if n[i] != m[x]:
            notequal[x] -= 1
        val = equal[x] * notequal[x]
        if val > valsave[x]:
            valsave[x] = val
            possave[x] = i+1
print(possave)Пишите свое решение в комментариях👇
@python_job_interview
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍7🔥2❤1
  Задача количество последовательных вхождений
Вам дана строка s. Предположим, что некоторый символ x встречается последовательно n раз в строке. Напишите функцию
Примечание: все символы строки s являются целыми числами от 0 до 9.
Пример:
Входные данные:
Пояснение: вначале 1 встречается только один раз. Меняем на (1, 1). Затем, 2 появляется три раза и заменяется на (3, 2) и так далее.
Важно: не забудьте пробелы между скобками.
Пишите свое решение в комментариях👇
@python_job_interview
Вам дана строка s. Предположим, что некоторый символ x встречается последовательно n раз в строке. Напишите функцию
occurence(), которая принимает строку s и заменяет последовательные вхождения символа x на (n, x). Результат выведите на экран.Примечание: все символы строки s являются целыми числами от 0 до 9.
Пример:
Входные данные:
s = '1222311'
Вывод:(1, 1) (3, 2) (1, 3) (2, 1)Пояснение: вначале 1 встречается только один раз. Меняем на (1, 1). Затем, 2 появляется три раза и заменяется на (3, 2) и так далее.
Важно: не забудьте пробелы между скобками.
Пишите свое решение в комментариях👇
@python_job_interview
👍6🔥4❤1
  👍7❤1🔥1
  
if __debug__:
    assert False, ("error")Пишите свой ответ в комментариях👇
@python_job_interview
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍8❤1🔥1
  _MangledGlobal__mangled = 23
class MangledGlobal:
def test(self):
return __mangled
>>> MangledGlobal().test()
23
Пишите свой ответ в комментариях👇
@python_job_interview
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍8❤1🔥1
  big_num_1   = 1000
big_num_2   = 1000
small_num_1 = 1
small_num_2 = 1
big_num_1 is big_num_2
small_num_1 is small_num_2Пишите свой ответ в комментариях👇
@python_job_interview
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍6🔥2❤1
  