Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@tumani1
Last active February 16, 2022 09:58
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save tumani1/8801673 to your computer and use it in GitHub Desktop.
Save tumani1/8801673 to your computer and use it in GitHub Desktop.
Тестовые задания на вакансию python разработчика в Yandex. Подробнее: http://company.yandex.ru/job/vacancies/dev_python_mysql.xml
# coding: utf-8
import unittest
"""
Есть два списка разной длины. В первом содержатся ключи, а во втором значения. Напишите функцию, которая создаёт из этих ключей и значений словарь. Если ключу не хватило значения, в словаре должно быть значение None. Значения, которым не хватило ключей, нужно игнорировать. Подробнее: http://company.yandex.ru/job/vacancies/dev_python_mysql.xml
"""
def dictFromKeyAndValue(key, value):
return dict(zip(key, value)) if (len(key) <= len(value)) else dict(map(None, key, value))
# Класс с юнит тестами
class createDict(unittest.TestCase):
def testLenKeyEqLenValue(self):
key = [1,2,3]
value = ['q','w','e']
result = {
1: 'q',
2: 'w',
3: 'e'
}
self.assertEqual(dictFromKeyAndValue(key, value), result)
def testLenKeyGtLenValue(self):
key = [1,2,3,4,5]
value = ['q','w','e']
result = {
1: 'q',
2: 'w',
3: 'e',
4: None,
5: None
}
self.assertEqual(dictFromKeyAndValue(key, value), result)
def testLenKeyLteLenValue(self):
key = [1,2,3]
value = ['q','w','e', 'r', 't']
result = {
1: 'q',
2: 'w',
3: 'e'
}
self.assertEqual(dictFromKeyAndValue(key, value), result)
if __name__ == "__main__":
unittest.main()
# coding: utf-8
import re
import os
import operator
from IPy import IP
from collections import Counter
"""
Предположим, у нас есть access.log веб-сервера. Как с помощью стандартных консольных средств найти десять IP-адресов, от которых было больше всего запросов?
Подробнее: http://company.yandex.ru/job/vacancies/dev_python_mysql.xml
"""
# Кол-во адресов версии 4
COUNT_IPV4 = 2**32 - 1
# Регулярные выражения для разбора стандарного access.log
# файла веб-сервера Apache (http://httpd.apache.org/docs/2.4/logs.html#common)
parts = [
r'(?P<host>\S+)', # host %h
r'\S+', # indent %l (unused)
r'(?P<user>\S+)', # user %u
r'\[(?P<time>.+)\]', # time %t
r'"(?P<request>.+)"', # request "%r"
r'(?P<status>[0-9]+)', # status %>s
r'(?P<size>\S+)', # size %b (careful, can be '-')
r'"(?P<referer>.*)"', # referer "%{Referer}i"
r'"(?P<agent>.*)"', # user agent "%{User-agent}i"
]
class FileNotFound(Exception):
""" Raised when file not found """
# Функция подсчитывает кол-во ip-адресов в access.log
# файле веб-сервера Apache
def count_ipaddress(filename, first=None, try_replace_ipv6=False, **kwargs):
# Проверяем, что файл существует
if not os.path.exists(filename):
raise FileNotFound
# Init
ipcounter = Counter()
pattern = re.compile(r'\s+'.join(parts) + r'\s*\Z')
first = validation_int(first)
# Читаем файл
with open(filename) as infile:
for line in infile:
match = pattern.match(line)
result = match.groupdict()
ipcounter[result['host']] += 1
# Если выбрана опция замены адресов
if try_replace_ipv6 is True:
ipcounter = try_replace_ipv6_to_ipv4(ipcounter)
# Делаем сортировку и берем n-ое кол-во ip-адресов
ipcounter = sorted(ipcounter.iteritems(), key=operator.itemgetter(1), reverse=True)[:first]
return dict(ipcounter)
# Функция пытается конвертировать ipv6 адрес в ipv4 адрес.
# Если конвертируется то пытается создать или прибавить к значению ipv4 адреса
# и удаляет ipv6 адрес.
def try_replace_ipv6_to_ipv4(ipcounter, **kwargs):
ipv6_keys = filter((lambda x: x.version() == 6), map(IP, ipcounter.keys()))
for item in ipv6_keys:
if item.int() < COUNT_IPV4:
ipcounter[IP(item.int()).__str__()] += ipcounter[item.__str__()]
del ipcounter[item.__str__()]
return ipcounter
# Проверка на целое
def validation_int(number):
return number if (isinstance(number, int) and number > 0) else 10
if __name__ == '__main__':
params = {
'filename': '/var/log/apache2/access.log',
}
result = count_ipaddress(**params)
print "Result: %s" % result
result = count_ipaddress(first=1, **params)
print "Result: %s" % result
result = count_ipaddress(try_replace_ipv6=True, **params)
print "Result: %s" % result
# coding: utf-8
import re
import unittest
"""
В системе авторизации есть ограничение: логин должен начинаться с латинской буквы, состоять из латинских букв, цифр, точки и минуса, но заканчиваться только латинской буквой или цифрой; минимальная длина логина — один символ, максимальная — 20. Напишите код, проверяющий соответствие входной строки этому правилу. Придумайте несколько способов решения задачи и сравните их.
Подробнее: http://company.yandex.ru/job/vacancies/dev_python_mysql.xml
"""
def check_password_var_1(value):
if not isinstance(value, basestring):
return False
len_value = len(value)
if not len_value:
return False
if len_value == 1:
if not re.match(r"^[a-zA-Z]$", value):
return False
else:
if not re.match(r"^[a-zA-Z][a-zA-Z0-9]$", value[::len_value-1]):
return False
if len_value > 2:
if not re.match(r"^[a-zA-Z0-9-\.]{0,18}$", value[1:-1]):
return False
return True
def check_password_var_2(value):
if not isinstance(value, basestring):
return False
if not re.match(r"^[a-zA-Z0-9-\.]{1,20}$", value):
return False
if not re.match(r"^[a-zA-Z]$", value[0]):
return False
if not re.match(r"^[^-\.]$", value[-1]):
return False
return True
class checkPassword(unittest.TestCase):
def testCheckPasswordVar1(self):
password = u"r"
self.assertTrue(check_password_var_1(password))
password = u"r9"
self.assertTrue(check_password_var_1(password))
password = u"r$"
self.assertFalse(check_password_var_1(password))
password = u"r.9"
self.assertTrue(check_password_var_1(password))
password = u"restkevegfv;eeeeeee8"
self.assertFalse(check_password_var_1(password))
password = u"restkevegfveeee8e"
self.assertTrue(check_password_var_1(password))
password = u"restkevegfveeeeeee8e"
self.assertTrue(check_password_var_1(password))
password = u"restkevegfveeeeeee8ee"
self.assertFalse(check_password_var_1(password))
def testCheckPasswordVar2(self):
password = u""
self.assertFalse(check_password_var_2(password))
password = u"r"
self.assertTrue(check_password_var_2(password))
password = u"r9"
self.assertTrue(check_password_var_2(password))
password = u"r$"
self.assertFalse(check_password_var_2(password))
password = u"r.9"
self.assertTrue(check_password_var_2(password))
password = u"restkevegfv;eeeeeee8"
self.assertFalse(check_password_var_2(password))
password = u"restkevegfveeee8e"
self.assertTrue(check_password_var_2(password))
password = u"restkevegfveeeeeee8e"
self.assertTrue(check_password_var_2(password))
password = u"restkevegfveeeeeee8ee"
self.assertFalse(check_password_var_2(password))
if __name__ == "__main__":
unittest.main()
@david-shiko
Copy link

Ссылка на вакансию битая. А задачки детские.

@tumani1
Copy link
Author

tumani1 commented Jan 28, 2022

@david-shiko тебя не смущает, что этому gist больше 8 лет?)

@david-shiko
Copy link

david-shiko commented Feb 14, 2022

Дата создание не указана на странице, а ходить специально смотреть не вижу резона

@tumani1
Copy link
Author

tumani1 commented Feb 14, 2022

@david-shiko, спасибо, ваше мнение очень важно для меня. я тебе перезвоню)

@david-shiko
Copy link

До обеда или после?)

@tumani1
Copy link
Author

tumani1 commented Feb 16, 2022

В следующей жизни)) Ты, главное, жди звонка)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment