Где решать задачи python
Перейти к содержимому

Где решать задачи python

  • автор:

Где решать задачи по программированию, чтобы пройти путь from zero to hero

Если вам о чём-то говорят фамилии Зив, Хомченко и Рымкевич, иди сюда, дай обниму, бедолага-олимпиадник, то вы наверняка знаете, как важно прорешивать задачи для полноценного, осознанного и глубокого понимания изученного материала. Когда нет или совсем мало реальной практики, задачи дают возможность покрыть практикой все теоретические знания, погрузиться в неожиданные выводы, сложности, баги, препятствия. Более того, даже если практики достаточно, задачи помогают относительно быстро, комплексно и глубоко проработать типичные и нетипичные ситуации, возникающие в разработке (любой другой науке). Это всегда безопасный (никто не взрывает лабораторию и не роняет прод), доступный и удобный способ подробно разобраться в предмете. Определённо, программирования это касается в первую очередь.

Как решать задачи?

Большинство сайтов из этого дайджеста предоставляют удобные и интуитивные интерфейсы для работы с кодом онлайн, и, кажется, этого вполне достаточно. Но такая практика быстро выветривается из головы: на 12-15 задаче ты уже напрочь не помнишь даже формулировку первых, не то что свои выводы и находки. Это неудобно и иногда сводит все старания на нет.

  • Положите перед собой блокнот или тетрадку, чтобы фиксировать там две важных вещи: свои находки и вопросы, в которых нужно не забыть разобраться (они обязательно возникают по ходу решения задач, особенно более высокого уровня сложности).
  • После окончания работы над очередным сетом задач пройдитесь по записям, подчеркните самое главное, начните искать ответы на вопросы.
  • Перед новым подходом просмотрите предыдущие записи, освежите в памяти решённое.
  • Если вы нашли изящный путь решения, обязательно используйте его в дальнейшем. Старайтесь, как и в математике, найти наиболее рациональное и даже красивое решение.
  • Если вам удалось решить очередную задачу, нагородив костылей, вернитесь к ней позже и попробуйте отрефакторить своё же решение — это не напрасная трата времени, а практика работы над хорошим кодом, которая не помешает любому уровню специалиста.
  • Если на портале есть какие-то челленджи или соревнования, обязательно участвуйте — даже если у вас нет ни шанса на победу, вы испытаете своё мышление в новых экстремальных условиях и сможете сравнить себя с другими участниками. В таком опыте обычно лежат точки роста.
  • Если не получается — не сдавайтесь, разбирайтесь, используйте источники и сторонние сайты, не стесняйтесь обращаться к менторам и коммьюнити.
  • Помните: путь в любую разработку начинается с hello world.

�� Kaggle — сайт содержит множество исследовательских задач, связанных с машинным обучением и большими данными. Особенно ценно то, что на Kaggle можно найти крутые датасеты, код и материалы для самостоятельного изучения и тренировок.

  • Kaggle titanic dataset. Анализ данных с помощью SQL запросов
  • Разговор с дата-сайентистом — гроссмейстером Kaggle
  • Kaggle: Британские спутниковые снимки. Как мы взяли третье место
  • Как я занял 13 место из 3500+ участников и стал Kaggle Competition Master / Хабр
  • «Айсберг вместо Оскара!» или как я пробовал освоить азы DataScience на kaggle / Хабр
  • Kaggle: История о том как мы учились предсказывать релевантность поисковых запросов и заняли 3-е место

�� Codewars — сборник задач и челленджей по широком спектру тем: алгоритмам, проектированию, паттернам, различным языкам программирования.

�� LeetCode — популярный сайт с задачами, который особенно любят соискатели, мечтающие о работе в FAANG. Отличается от остальных тем, что решение задач нацелено именно на подготовку к собеседованиям в крупных компаниях.

  • From Zero to Hero: определите ваш уровень решения LeetCode задач от 1 до 5
  • Я решил 500 задач на LeetCode — и они действительно меня чему-то научили
  • Есть ли польза от решения алгоритмических задач на LeetCode?
  • Пройти LeetCode за год: экскурсия по сайту и roadmap
  • Моя история подготовки к интервью в FAANG
  • Разбор алгоритмических задач с собеседований в Google, Facebook, Amazon
  • Первые 255 задач на «‎литкоде»‎ / Хабр

�� Codeforces — популярнейший сайт с задачами, тренировками, соревнованиями (раундами) и прочими активностями для прокачки практики программирования. Кроме того, что позволяет решать всё про всё и содержит одну из крутейших баз заданий, имеет развитое сообщество, систему рейтинга и множество встроенных элементов геймификации.

  • Если хочешь разобраться, найдешь возможность»: говорим о Codeforces с основателем проекта
  • Как выиграть ВСОШ по информатике и больше не волноваться о ЕГЭ?

�� Exercism — классический задачник для 67 языков программирования. Подразумевает геймификацию, систему менторинга, обучение и т.д. При таких параметрах, конечно, имеет своё коммьюнити (хоть и не такое впечатляющее, как у предыдущих ресурсов).

�� All Cups — соревновательно-обучательно-решательный портал с множеством задач от VK. Включает задачи по спортивному программированию (привет участникам олимпиады!), машинному обучению, искусственному интеллекту и, что особенно важно, по системному администрированию и всяческому хайлоаду. Если так можно сказать, это самый комфортный сайт для русскоязычного программиста (но мы же помним, что без английского далеко всё равно не уйти, даже здесь).

  • All Cups — новая экосистема чемпионатов для IT-специалистов / Хабр
  • Соревнования по программированию на платформе All Cups
  • All Cups: история одного дизайна экосистемы с большой историей

�� Задачи для программистов — раздел задач на ТПрогере, который включает задачи и их разбор от компаний и пользователей. Ещё один комфортный русскоязычный ресурс с форматом статей-разборов.

�� SQL-EX.ru — совершенно вырвиглазный сайт с наикрутейшими задачами и базой знаний по SQL. Отличное русскоязычное сообщество, справочники, учебники, обсуждения, статьи и книги. Настоящий мир SQL, пригодный как для школьника, так и для старшего инженера и разработчика.

  • Как изучать SQL в 2023 году
  • Ультимативная дорожная карта для изучения SQL и баз данных в 2023 году + источники для знаний

�� Питонтьютор — интерактивный учебник-задачник по Python с задачами разной сложности. Русскоязычный, приятный, пошаговый и комфортный. Отличная помощь начинающим (и не только) питонистам.

  • Как не стать Python-разработчиком
  • Изучаем Python за 6 месяцев. Подробный план обучения

Подборки от авторов Хабра — где-то есть неактуальные ссылки, но в целом подборки полезные.

  • Сайты для обучения программированию: Топ 100
  • Топ 8 лучших ресурсов для практики программирования в 2018
  • 11 крупнейших международных соревнований по программированию на 2022 год / Хабр

P.S. Если вы давно хотели написать статью на Хабр, но сомневаетесь в своих силах или качестве материала, пишите мне в личку или присылайте черновик и свои вопросы на neo@habr.team — поможем, подскажем, дадим редакторский совет.

  • обучение
  • практика программирования
  • обучение программированию
  • задачи по программированию

Задачи по Python

Python 3 логотип

Каждому изучающему Python нужно писать код для закрепления. Вашему вниманию предлагаются несколько задач для реализации (не слишком простых (кроме первой) и не слишком сложных).

Для выполнения заданий крайне рекомендуется пройти самоучитель.

Также для этих задач есть репозиторий с тестами и моими решениями (чтобы проверить себя).

Для запуска тестов для вашей функции проще всего будет добавить код из папки с тестами в конец файла с функцией.

А теперь, собственно, задачи:

Простейшие арифметические операции (1)

Написать функцию arithmetic, принимающую 3 аргумента: первые 2 — числа, третий — операция, которая должна быть произведена над ними. Если третий аргумент +, сложить их; если , то вычесть; * — умножить; / — разделить (первое на второе). В остальных случаях вернуть строку «Неизвестная операция«.

Високосный год (2)

Написать функцию is_year_leap, принимающую 1 аргумент — год, и возвращающую True, если год високосный, и False иначе.

Квадрат (3)

Написать функцию square, принимающую 1 аргумент — сторону квадрата, и возвращающую 3 значения (с помощью кортежа): периметр квадрата, площадь квадрата и диагональ квадрата.

Времена года (4)

Написать функцию season, принимающую 1 аргумент — номер месяца (от 1 до 12), и возвращающую время года, которому этот месяц принадлежит (зима, весна, лето или осень).

Банковский вклад (5)

Пользователь делает вклад в размере a рублей сроком на years лет под 10% годовых (каждый год размер его вклада увеличивается на 10%. Эти деньги прибавляются к сумме вклада, и на них в следующем году тоже будут проценты).

Написать функцию bank, принимающая аргументы a и years, и возвращающую сумму, которая будет на счету пользователя.

Простые числа (6)

Написать функцию is_prime, принимающую 1 аргумент — число от 0 до 1000, и возвращающую True, если оно простое, и False — иначе.

Правильная дата (7)

Написать функцию date, принимающую 3 аргумента — день, месяц и год. Вернуть True, если такая дата есть в нашем календаре, и False иначе.

XOR-шифрование (8)

Написать функцию XOR_cipher, принимающая 2 аргумента: строку, которую нужно зашифровать, и ключ шифрования, которая возвращает строку, зашифрованную путем применения функции XOR (^) над символами строки с ключом. Написать также функцию XOR_uncipher, которая по зашифрованной строке и ключу восстанавливает исходную строку.

Для вставки кода на Python в комментарий заключайте его в теги

  • Модуль csv - чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ
  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов
  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

Где практиковаться начинающему разработчику

Где практиковаться начинающему разработчику

После освоения основ любого языка программирования необходимо как можно больше практиковаться. Это поможет закрепить полученные знания и запомнить конструкции языка. Один из способов — решение задач. Такой подход заставляет использовать все возможности изученной технологии и думать над оптимальным алгоритмом решения.

«IT-специалист с нуля» наш лучший курс для старта в IT

Проект Эйлера

Проект Эйлера — сайт с математическими задачами по программированию, основанный в 2001 году. Задачи разделяются по уровню сложности, всего их более 800 штук. Для решения начинающим разработчикам необходимо вспомнить школьную математику, а в некоторых случаях — даже университетскую программу. Решать задачи можно на любом удобном языке программирования.

Профессия / 14 месяцев
Java-разработчик
Освойте востребованный язык
4 290 ₽/мес 7 150 ₽/мес

Group 1321314345 (4)

w3resource

W3resource предлагает пользователям подробные обучающие материалы и задачи по технологиям веб-разработки. В сервисе есть встроенный редактор кода, чтобы решать задачи в браузере. Можно отточить знания JavaScript, Python, HTML, CSS, SQL, PHP и Java.

Codewars

Скрин с примером задачи на сайте Codewars

Сервис с задачами на 45+ языках программирования. Пользователям доступны практические задания на закрепление основ, паттернов и алгоритмов. В Codewars есть внутренняя система рангов, которая помогает выбирать задачи подходящего уровня. Ранг повышается при каждом правильном решении. Доступен как общий уровень пользователя, так и уровень владения каждым языком программирования.

Сборник задач CppStudio

Онлайн-сборник задач на языке C++. На сайте доступны задачи 5 уровней сложности на знание основ программирования и умение пользоваться алгоритмами. Условия задач не подстроены под особенности С++, поэтому решение можно реализовать на любом удобном языке.

CheckIO

Скрин интерфейса браузерной игры CheckIO

Браузерная игра, мотивирующая решать задачи с помощью инструментов геймификации. Проходить испытания можно с помощью Python или TypeScript. Сложность возрастает по мере приближения к последним уровням, а если пройти регистрацию, то можно сохранить прогресс и вернуться к решению задач позже. Спонсор и партнер проекта — компания JetBrains.

LeetCode

Скрин с главной страниц сервиса LeetCode

Сервис с алгоритмическими задачами, которые помогут подготовиться к собеседованию. Задачи охватывают все аспекты разработки, включая базы данных, алгоритмы, теорию графов, структуры данных и динамическое программирование. Кроме задач доступны обучающие планы, чтобы освоить тему с нуля.

HackerRank

Скрин из личного кабинета в сервисе HackerRank

HackerRank проводит для разработчиков онлайн-соревнования, которые спонсируют мировые IT-компании. Если хорошо зарекомендовать себя и показать свои навыки, то можно получить приглашение на стажировку. Также призовые места в соревнованиях HackerRank могут стать хорошим достижением для резюме.

Codecombat

Скрин из браузерной игры Codecombat

Браузерная стратегия, для игры в которую понадобятся навыки программирования. На выбор доступны Python и JavaScript. Сервис создан для детей, но подойдет и начинающим разработчикам старшего возраста. Также есть режим для преподавателей, позволяющий организовать совместную работу во время занятий.

CodeAbbey

Сервис с более чем 300 задачами. Часть из них доступна на русском языке, а за решение 125 задач можно получить сертификат. Также на сайте есть форум с активными участниками сообщества, которые могут помочь с решением.

Ruby Quiz

Сборник головоломок на языке Ruby. Решения задач описаны с учетом особенностей Ruby, но условия позволяют использовать любой язык программирования.

Станьте Java-разработчиком
и создавайте сложные сервисы
на востребованном языке

Rosalind

В Rosalind собраны задачи для разработчиков в области биоинформатики. Сервис подойдет далеко не всем, так как охватывает узкую область знаний. Разработчики Rosalind рекомендуют использовать головоломки из списка для закрепления изученных ранее тем.

CodingBat

Сборник задач на Java и Python. С помощью сервиса пользователи могут освоить основы и особенности этих языков программирования. Доступны как легкие задачи на знание синтаксиса, так и более сложные, заставляющие разобраться со структурами данных и логикой.

Читайте также Где взять опыт в Java-программировании: 10 идей для тренировочных проектов

UVa Online Judge

Сборник сложных задач олимпиадного программирования, требующих глубоких знаний не только синтаксиса, но и алгоритмов. Решение необходимо оптимизировать по скорости выполнения кода и потребляемой памяти.

Школа программиста

Сервис с задачами для школьных олимпиад. Но его часто используют для преподавания на младших курсах университетов. Большой сборник включает головоломки разного уровня, требующие глубоких знаний информатики. На сайте есть автоматическая проверка решений и форум поддержки.

Codechef

Платформа для соревнований программистов, которые проводят несколько раз в месяц. К ним можно готовиться с помощью коллекции задач. В некоторых соревнованиях можно участвовать только командой. Codechef регулярно разыгрывает денежные призы, а на сайте есть внутренний рейтинг пользователей.

Codingame

Скрин сервиса Codingame

Браузерный квест, который можно пройти с помощью решения задач. Управлять игровым процессом можно с помощью написания кода, а на выбор доступно более 20 языков программирования. Также на сайте есть геймифицированный сервис для проверки навыков во время собеседований.

Exercism

Скрин для выбора упражнений в сервисе Exercism

Exercism предоставляет пользователям доступ к большому количеству головоломок на разных языках программирования. В списке есть как популярные, так и редкие языки. Все задачи построены на реальных ситуациях из жизни. Так новички могут лучше понять условия. Кроме задач на сайте есть образовательные программы для самостоятельного обучения.

InterviewBit

code-9-9550443

Сервис для подготовки к собеседованиям в мировые IT-компании. На сайте есть сложные задачи на знание алгоритмов и особенностей синтаксиса, теоретические вопросы и советы для подготовки. Сервис содержит более 800 задач по различным направлениям разработки.

SQL EX

Русскоязычный сборник задач для изучения SQL и баз данных. На сайте есть внутренний рейтинг пользователей, а после прохождения экзамена можно получить сертификат, подтверждающий уровень знаний.

Питонтьютор

Сайт для практики языка программирования Python на русском языке. В сервис встроен редактор кода, поэтому можно решать задачи в браузере. Для каждой задачи есть альтернативные способы решения, которые помогут найти наиболее лаконичный способ.

Python-разработчик

Освойте Python с нуля. Подготовим к трудоустройству: дадим много практики, реальные проекты для портфолио, поможем с резюме. Лучшие студенты пройдут стажировки в проектах компаний-партнеров.

Пять задачек из тех, которые хорошо бы уметь решать

Зачем я всё это написал? Дело в том, что я давно уже работаю программистом. Прошёл множество собеседований и сам провёл не мало. Видел самых разных разработчиков, наблюдал за ними… И сделал для себя некоторые выводы.

Так как многие спрашивают моего мнения, я решил написать его. Не чтобы кому-то навязать, просто, чтобы не рассказывать много раз.

Конечно, задачи сильно зависят от того, на какую ставку вы идёте и чем предполагаете заниматься. Но поверьте, если вашему работодателю достаточно того, что вы умеете плести цепочки вызовов на jQuery, знаете HTML, или SQL, то задумайтесь, — возможно, вас ждёт скучноватая работёнка.

Если же вашему работодателю не так уж важно на каком языке вам удобней выражать свои мысли. Если он больше обращает внимание на вашу эрудицию, — старайтесь получить эту работу. Вас, скорее всего, ждут разнообразные и интересные задачи.

Ладно, оставим разговоры. Сперва приведу задачи, а потом решения. Вы можете не проматывать до них и решить задачки самостоятельно. Если вы уложитесь в час, то ждём вас не собеседование ,-) Приступим.

Задачи

Первая задача

У вас есть массив чисел. Напишите три функции, которые вычисляют сумму этих чисел: с for-циклом, с while-циклом, с рекурсией.

Вторая задача

Напишите функцию, которая создаёт комбинацию двух списков таким образом:

[1, 2, 3] (+) [11, 22, 33] -> [1, 11, 2, 22, 3, 33] 

Третья задача

Вычислите первые 100 чисел Фибоначчи. (Напишите код.)

Четвёртая задача

У вас есть массив чисел, составьте из них максимальное число. Например:

 [61, 228, 9] -> 961228 

Пятая задача

У вас есть девять цифр: 1, 2, …, 9. Именно в таком порядке. Вы можете вставлять между ними знаки «+», «-» или ничего. У вас будут получаться выражения вида 123+45-6+7+89 . Найдите все из них, которые равны 100.

Постарайтесь решить эти задачи за час.

А теперь ответы

Решения

Я буду приводить решения на Python3. Кроме того, это те решения, которые можно написать за час. В чём-то они не идеальны, это повод поговорить и, возможно, взять дополнительное время.

Задача первая

def sum_for_loop(a): s = 0 for x in a: s += x return s def sum_while_loop(a): s = 0 n = len(a) while n: n -= 1 s += a[n] return s def sum_recursive(a): if len(a) == 0: return 0 return a[0] + sum_recursive(a[1:]) if __name__ == '__main__': t = [5, 3, 4, 1, 7] for f in (sum_for_loop, sum_while_loop, sum_recursive): print(f(t)) 

Конечно, если вы рассказывайте про Python, то имеет смысл сказать и про функцию sum или reduce . Если речь идёт о других языках, будет не лишним упоминать возможности их библиотек. Но здесь интересно ваше решение.

В первой функции говорить особо не о чем. Спасибо Python.

Во втором случае уже можно порассуждать надо ли разрушать массив (вынимая из него элементы). Или пойти по тому пути, который выбрал я. Тут тоже можно обратить внимание на то, как эта функция невыгодно выглядит по сравнению с рекурсивной. Есть множество мест, где можно допустить ошибки.

Рекурсивная функция прекрасна.

Задача вторая

def combine_lists(a, b): len_a = len(a) len_b = len(b) if len_a < len_b: limit = len_a else: limit = len_b i = 0 r = [] while i < limit: r.append(a[i]) r.append(b[i]) i += 1 return r if __name__ == '__main__': a = ['a', 'b', 'c'] b = ['A', 'B', 'C', 'D'] print(repr(combine_lists(a, b))) 

Тут нет ничего необычного, но можно порассуждать о библиотеках. Если речь про Python можно предложить решение типа sum(zip(a, b), ()) .

Задача третья

def fibonacci(n=10, a=0, b=1): yield a yield b n -= 2 while n > 0: c = a + b a = b b = c yield c n -= 1 if __name__ == '__main__': for n in fibonacci(100): print(n) 

Я реализовал итератор. Этим можно было бы показать, что вы про них знаете и здесь их использование уместно.

Тут уже можно поговорить и о языке. Если ваш язык не Python, то, возможно, вам следует задуматься о типе и битности чисел, так как сотое число содержит 68 бит.

Кроме того, есть способ расчёта чисел Фибоначчи путём возведения в степень матриц. Он позволяет не рассчитывать все числа последовательности. Возможно, от вас хотят именно его.

Задача четвёртая

Код (не правильный):

join_to_biggest = lambda a: int(''.join(sorted(map(str, a), reverse=True))) if __name__ == '__main__': print(join_to_biggest([501, 2, 1, 80, 9])) 

Эта задача больше всего зависит от языка. Я её решил, используя возможности Python.

upd:

Этот код провисел на сайте года три, пока, некто Роман Парпалак не указал мне на ошибку.

Я сохраню интригу и не буду говорить в чём ошибка. Но код, дающий правильный результат я всё же приведу:

join_to_biggest = lambda x: ''.join(sorted( map(str, x), cmp=lambda x, y: cmp(y + x, x + y) )) 

Да, тут Python2. В Python3 придётся сделать что-то вроде этого:

class smart_key(object): def __init__(self, obj): self.obj = obj def __lt__(self, other): return (other.obj + self.obj) < (self.obj + other.obj) join_to_biggest = lambda x: ''.join(sorted( map(str, x), key=smart_key )) 

Зачем я сохранил неправильный код? По нескольким причинам.

Во-первых, удалить его было бы не честно с моей стороны. Я же декларировал, что решу задачи за час. За указанное время я дал именно это решение.

Во-вторых, чтобы читатель мог поискать ошибку, подумать, нет ли ошибок в его решении…

В-третьих, чтобы подчеркнуть, что все могут ошибаться. Решение задач на время всегда будет сопровождаться ошибками. Недавно я проходил очень интересное интервью. Будет время, — напишу про него отдельно. Но меня в нём поразило то, что олимпиадных задач не было, и спешки тоже не было. И мне кажется, что эти люди действительно хорошо понимают, кого ищут, и выстраивают интервью адекватно своему пониманию. Но это отдельная интересное история.

А тут я лишь скажу: спасибо, Роман. Интересно было бы узнать ваш вариант решения.

Задача пятая

Тут есть простор для творчества. Мой код таков:

def all_combinations(a): if len(a) 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-ов и кодирования операций с помощью символов. Но это решение будет более громоздким, о нём можно рассказать, но и писать, и читать его дольше. Лично я вышел бы за рамки отведённого часа.

Наверняка вам по душе будет какое-то иное решение. Мой пример — лишь одна из возможных реализаций.

Вместо заключения

Где можно взять таких задачек? Можно начать с Project Euler. Там, правда, немного более математизированные задачки, но это и не плохо. И сложность задач расчёт очень быстро. Я решил восемьдесят.

Если вы знаете ресурсы с хорошими задачками — пожалуйста напишите мне.

upd: В моём решении пятой задачи Мерзляков Александр из Уфы нашел неточность. Спасибо! Я поправил. Получается, что я на эти решения потратил больше часа.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *