Серия «101 игра на python. Информатика»

GitHub Copilot Free: Бесплатный ИИ-помощник для начинающих разработчиков

GitHub Copilot Free: Бесплатный ИИ-помощник для начинающих разработчиков Copilot, Git, Программирование, Microsoft

GitHub Copilot Free — это бесплатная версия ИИ-помощника для написания кода. Она позволяет попробовать основные функции без подписки.

Copilot Free недоступен, если:

  • У вас корпоративный аккаунт.

  • Ваша организация предоставляет Copilot.

  • У вас уже есть подписка Copilot Pro или пробная версия.

  • Вы студент, преподаватель или участник open-source проектов с бесплатным доступом к Copilot Pro.


Что входит в Copilot Free?

  • Подсказки кода в Visual Studio Code, Visual Studio, JetBrains IDE, Vim/Neovim, Xcode и Azure Data Studio.

  • Редактирование кода (только в Visual Studio Code и Visual Studio).

  • Чат с Copilot в Visual Studio Code, Visual Studio, JetBrains IDE и на GitHub.com.

  • Доступ к модели Claude 3.5 Sonnet и расширениям Copilot.


Ограничения Copilot Free

  • 2000 подсказок в месяц для кода.

  • 50 сообщений в чате в месяц (включая редактирование файлов).

При достижении лимита можно перейти на Copilot Pro.

Для компаний Copilot Free не подходит, так как в нём нет:

Показать полностью 1
8

101 игра на python. Информатика. Работа с файловой системой Google colab

Что такое Google Colab?

101 игра на python. Информатика. Работа с файловой системой Google colab Гайд, Программирование, Jupyter notebook, Python, Длиннопост

Посмотреть код можно в Google Colab

Google Colab — это облачная платформа, созданная Google, для работы с интерактивными блокнотами Jupyter Notebook. Она предоставляет мощные инструменты для написания и выполнения кода на Python, анализа данных, обучения моделей машинного обучения и совместной работы над проектами.

Colab предлагает доступ к мощным ресурсам, включая графические и тензорные процессоры. Это позволяет решать сложные задачи, такие как работа с большими объёмами данных или обучение нейросетей, без покупки дорогого оборудования. Colab работает на основе Jupyter Notebook. Использовать Colab можно сразу после открытия — ничего дополнительно устанавливать не нужно, всё уже готово к работе. Ты можешь подключить Google Диск, чтобы легко данные, сохранять проекты и получать доступ к файлам откуда угодно. Также в Colab можно работать вместе с другими пользователями.

Как работает Google Colab?

- Jupyter запускается в браузере. Код выполняется на удаленных серверах Google, а результаты отображаются в блокноте. Данные могут загружаться из локального устройства или из облака, такого как Google Drive. Ты можете использовать Colab для работы с библиотеками для машинного обучения (например, TensorFlow, PyTorch), анализа данных с использованием Pandas или создания визуализаций через Matplotlib и Seaborn.

Как выглядит Google Colab?

101 игра на python. Информатика. Работа с файловой системой Google colab Гайд, Программирование, Jupyter notebook, Python, Длиннопост

Интерфейс Colab состоит из нескольких основных частей:

  • Строки кода: Это ячейки, в которые ты будешь писать и выполнять свой код на Python.

  • Текстовые ячейки: Здесь ты можешь добавлять описания, пояснения и заметки к своему коду.

  • Меню: Сверху есть меню с различными опциями для работы с блокнотом (файл, правка, вид, инструменты и т.д.).

  • Файловый менеджер: Слева есть панель файлового менеджера, где ты можешь просматривать файлы и папки в своей среде Colab.

Файловая система colab

В Google Colab, ты работаешь в облачной среде, где файловая система организована как на обычном компьютере с папками и файлами. Ты можешь взаимодействовать с файловой системой с помощью магических команд Jupyter (начинаются с `%`) и команд bash (начинаются с `!`).

Список основных команд:

  1. %pwd (print working directory):

    • Описание: Показывает текущую рабочую директорию (где ты сейчас "находишься" в файловой системе).

    • Пример: %pwd

    • Результат: /content (или другая текущая директория)

  2. %ls (list):

    • Описание: Выводит список файлов и папок в текущей директории.

    • Пример: %ls

    • Результат: Список файлов и папок, например: sample_data/ my_file.txt

  3. %cd <путь> (change directory):

    • Описание: Переходит в указанную директорию.

    • Пример: %cd sample_data

    • Результат: Текущая рабочая директория меняется на /content/sample_data

  4. !head -<количество строк> <имя файла>:

    • Описание: Выводит первые несколько строк указанного текстового файла.

    • Пример: !head -5 README.md

    • Результат: Первые 5 строк файла README.md.

  5. !cat <имя файла>:

    • Описание: Выводит содержимое указанного текстового файла.

    • Пример: !cat sample_file.txt

    • Результат: Всё содержимое файла sample_file.txt.

  6. !echo "<текст>" > <имя файла> * Описание: Создаёт новый файл с указанным именем и записывает в него текст. Если файл уже существует, он будет перезаписан * Пример: !echo "Это мой новый файл!" > new_file.txt * Результат: Создаёт файл new_file.txt с содержимым Это мой новый файл!.

Ключевые моменты:

  • Магические команды (%) - это специальные команды Jupyter для работы с окружением Colab.

  • Команды bash (!) - это команды, которые выполняются в командной строке Linux.

  • Путь к файлу: Путь к файлу указывает, где именно файл находится в файловой системе (например, /content/sample_data/my_file.txt).

  • Текущая директория: Твоё положение в файловой системе (изменяется командой %cd).

Посмотреть в Google colab

Загрузка файлов в Google Colab

Есть несколько способов загрузить файлы в Colab, и мы рассмотрим наиболее распространенные из них.

  1. Загрузка через файловый менеджер (GUI)

  • Описание: Самый простой способ загрузить файлы, особенно небольшие, – использовать графический интерфейс файлового менеджера Colab.

  • Как это сделать:

    1. Открой панель файлового менеджера слева (значок папки).

    2. Нажми на значок загрузки (обычно это значок с плюсом или стрелкой вверх).

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

    4. Нажми "Открыть" или "Загрузить".

  • Плюсы: Простота, наглядность, не требует написания кода.

  • Минусы: Подходит для небольших файлов, нужно делать вручную.

101 игра на python. Информатика. Работа с файловой системой Google colab Гайд, Программирование, Jupyter notebook, Python, Длиннопост

2. Загрузка через код Python (google.colab.files.upload())

  • Описание: Этот способ позволяет загружать файлы с помощью кода Python, что дает больше гибкости.

  • Как это сделать:

    1. Импортируй модуль files из библиотеки google.colab.

    from google.colab import files

    1. Вызови функцию files.upload()

      uploaded = files.upload()

    2. При запуске этого кода, появится диалоговое окно, где ты можешь выбрать файлы для загрузки.

  • После выполнения этого кода загруженные файлы будут доступны в виде словаря uploaded, где ключи – имена файлов, а значения – их содержимое в виде байтовых строк.

3. Клонирование репозитория GitHub (git clone)

  • Если твои файлы находятся в репозитории GitHub, ты можешь загрузить их, клонировав репозиторий в Colab.

  • Как это сделать:

    1. Используй команду git clone с URL репозитория.

      !git clone <URL_репозитория>

      Например:

    !git clone https://github.com/username/my_repository.git

    1. После клонирования репозитория, содержимое будет доступно в папке, названной также как репозиторий.

  • Плюсы: Легко загрузить все файлы из репозитория, удобный способ для проектов с контролем версий.

  • Минусы: Подходит только для файлов в репозиториях GitHub.

4. Скачивание отдельного файла с GitHub

Если тебе нужен только один или несколько файлов из репозитория GitHub, ты можешь скачать их по прямой ссылке.

  • Как это сделать:

    1. Открой нужный файл в репозитории GitHub.

    2. Нажми на кнопку "View raw" (или "Необработанный вид").

    3. Скопируй URL этого файла. 4. Используй wget или curl для скачивания файла.

    !wget <URL_файла>

    или python !curl <URL_файла> -o <имя_файла_в_colab>

  • Плюсы: Просто скачать только нужные файлы, без клонирования всего репозитория.

  • Минусы: Требуется знать прямую ссылку на файл.

Какой способ выбрать?

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

  • Если нужно программно обрабатывать загруженные файлы, используй files.upload().

  • Для загрузки целых проектов, используй git clone.

  • Для скачивания отдельных файлов, используй wget или curl

Посмотреть код можно в Google Colab

UPD:

ИСХОДНЫЙ КОД ПЕРЕЕХАЛ ПО ЭТОМУ АДРЕСУ

Показать полностью 2
14

Полиномиальное и экспоненциальное время выполнения алгоритма. В чем разница

Полиномиальное время

  • Полиномиальное время —время выполнения алгоритма, которое растёт как полином (многочлен) от размера входных данных. Если время выполнения алгоритма можно выразить как (O(n^k)), где (n) — размер входных данных, а (k) — константа, то такой алгоритм работает за полиномиальное время.

    Примеры:

    1. Сортировка списка: Алгоритмы, такие как сортировка слиянием или быстрая сортировка, работают за (O(n \log n)), что является полиномиальным временем.

    2. Поиск кратчайшего пути в графе: Алгоритм Дейкстры работает за (O(n^2)) или (O(n \log n)) в зависимости от реализации, что также полиномиально.

    Особенности:

    • Алгоритмы, работающие за полиномиальное время, считаются эффективными и практически применимыми.

    • Задачи, которые можно решить за полиномиальное время, относятся к классу P.

    Экспоненциальное время

    Экспоненциальное время — время выполнения алгоритма, которое растёт экспоненциально в зависимости от размера входных данных. Если время выполнения можно выразить как (O(k^n)), где (n) — размер входных данных, а (k) — константа, то такой алгоритм работает за экспоненциальное время.

    Примеры:

    1. Задача коммивояжёра: Решение методом полного перебора всех возможных маршрутов требует (O(n!)) времени, что хуже экспоненциального.

    2. Перебор всех подмножеств: Алгоритм, который проверяет все возможные подмножества множества из (n) элементов, работает за (O(2^n)).

    Особенности:

    • Алгоритмы, работающие за экспоненциальное время, считаются неэффективными для больших входных данных, так как время выполнения становится непрактично большим даже при относительно небольших (n).

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

Полиномиальное и экспоненциальное  время выполнения алгоритма. В чем разница Программирование, Гайд, Алгоритм, Длиннопост
  1. Полиномиальное время:

    • Алгоритмы, работающие за полиномиальное время, считаются практически применимыми, так как они могут обрабатывать большие объёмы данных за разумное время.

    • Задачи класса P (решаемые за полиномиальное время) являются основой для многих приложений в компьютерных науках, таких как обработка данных, сети, криптография и искусственный интеллект.

Полиномиальное и экспоненциальное  время выполнения алгоритма. В чем разница Программирование, Гайд, Алгоритм, Длиннопост
  1. Экспоненциальное время:

    • Алгоритмы, работающие за экспоненциальное время, становятся непрактичными даже для относительно небольших входных данных. Например, при (n = 100), (2^n) уже превышает количество атомов в наблюдаемой Вселенной.

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

Полиномиальное и экспоненциальное  время выполнения алгоритма. В чем разница Программирование, Гайд, Алгоритм, Длиннопост

Пример для понимания

Задача её для (n = 10) и (n = 100):

  • Полиномиальное время ((n^2)):

    • При (n = 10): (10^2 = 100) операций.

    • При (n = 100): (100^2 = 10,000) операций.

  • Экспоненциальное время ((2^n)):

    • При (n = 10): (2^{10} = 1,024) операций.

    • При (n = 100): (2^{100} \approx 1.26 \times 10^{30}) операций.

При (n = 100) полиномиальный алгоритм выполнит 10 000 операций, что вполне реально, а экспоненциальный алгоритм потребует (1.26 \times 10^{30}) операций, что практически невозможно.

Полиномиальное и экспоненциальное  время выполнения алгоритма. В чем разница Программирование, Гайд, Алгоритм, Длиннопост

GIT

Показать полностью 4
3

Классификация вычислительной сложности задач

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


Класс P (Polynomial Time)

- Задачи, которые можно решить за полиномиальное время на детерминированной машине Тьюринга (например, на обычном компьютере). Например: сортировка списка, поиск кратчайшего пути в графе (алгоритм Дейкстры). Считается, что задачи класса P "легко" решаемы.


Класс NP (Nondeterministic Polynomial Time)

- Задачи, для которых проверка правильности решения может быть выполнена за полиномиальное время, но само решение может быть найдено только за экспоненциальное время (или хуже). Например: задача о рюкзаке, задача коммивояжёра, задача выполнимости булевых формул (SAT). Вопрос о том, равны ли классы P и NP, является одной из главных нерешённых проблем в информатике.


Класс NP-полные (NP-complete)

- Задачи, которые одновременно являются NP-трудными и принадлежат классу NP. Это самые сложные задачи в классе NP. Например: задача коммивояжёра, задача о раскраске графа, задача о выполнимости булевых формул (SAT). Если для одной NP-полной задачи будет найден полиномиальный алгоритм, то все задачи в классе NP также смогут быть решены за полиномиальное время.


Класс NP-трудные (NP-hard)

- Задачи, которые не менее сложны, чем самые сложные задачи в классе NP, но не обязательно принадлежат самому классу NP. Например: задача оптимизации, задача остановки, головоломка о перемещении пианино. Даже если задача не является NP-полной, она может быть NP-трудной, что делает её крайне сложной для решения.


Класс EXPTIME (Exponential Time)

- Задачи, которые могут быть решены за экспоненциальное время на детерминированной машине Тьюринга. Например: задача проверки выигрышной стратегии в шахматах или го. Эти задачи сложнее, чем задачи класса P или NP, так как их решение требует значительно больше времени.


Класс PSPACE (Polynomial Space)

- Задачи, которые могут быть решены с использованием полиномиального количества памяти, но время решения может быть экспоненциальным. Например: задача проверки истинности формул в логике, задача планирования в искусственном интеллекте. Класс PSPACE включает в себя как P, так и NP, и считается, что он может быть строго больше.


Класс Co-NP

- Задачи, для которых проверка неправильности решения может быть выполнена за полиномиальное время. Например: задача проверки, что булева формула невыполнима. Co-NP является "дополнительным" классом к NP, и вопрос о равенстве NP и Co-NP также остаётся открытым.


Класс BPP (Bounded-error Probabilistic Polynomial Time)

- Задачи, которые могут быть решены за полиномиальное время с использованием вероятностного алгоритма, допускающего небольшую вероятность ошибки. Например: тестирование простоты числа (алгоритм Миллера-Рабина). BPP считается классом задач, которые могут быть эффективно решены на практике, даже если они не принадлежат P.


Класс #P

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


Класс L (Logarithmic Space)

- Задачи, которые могут быть решены с использованием логарифмического количества памяти относительно размера входных данных. Например: проверка связности графа в ограниченных условиях. L является подклассом P и изучается в контексте задач, которые можно решить с минимальными ресурсами памяти.


Класс NC (Nick's Class)

- Задачи, которые могут быть решены за полилогарифмическое время с использованием полиномиального числа процессоров. Например: параллельная сортировка, быстрое преобразование Фурье. NC изучается в контексте параллельных вычислений и считается классом задач, которые могут быть эффективно решены на многопроцессорных системах.


Класс RE (Recursively Enumerable)

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


Класс Co-RE

- Задачи, для которых неправильность решения может быть перечислена алгоритмом, но не обязательно правильность. Например: задача проверки, что машина Тьюринга не останавливается на данном входе. Co-RE является "дополнительным" классом к RE.


Класс R (Randomized Polynomial Time)

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


Класс PH (Polynomial Hierarchy)

- Иерархия классов сложности, которая обобщает классы P, NP, Co-NP и другие. PH строится на основе чередования кванторов в логических формулах и включает в себя бесконечное число уровней сложности. Например: задачи, связанные с проверкой сложных логических утверждений. PH считается более широким, чем NP, но его точное соотношение с другими классами остаётся предметом исследований.

Показать полностью
3

Муравьи превосходят людей в решении групповых задач в эксперименте с лабиринтом

Муравьи превосходят людей в решении групповых задач в эксперименте с лабиринтом Сотрудничество, Координация, Исследования, Длиннопост, Видео, YouTube, Яндекс Дзен (ссылка)

Ants and humans compete in maneuvering a T-shaped load across a maze. Credit: Weizmann Institute of Science

Мой перевод статьи: Ants prove superior to humans in group problem-solving maze experiment

В Институте науки Вейцмана провели эксперимент, в котором муравьи и люди соревновались в решении групповой задачи: нужно было провести крупный груз через лабиринт. Результаты, опубликованные в Proceedings of the National Academy of Sciences, оказались неожиданными и пролили свет на преимущества и недостатки коллективного принятия решений.

Муравьи и люди — единственные существа в природе, которые регулярно сотрудничают при транспортировке объектов, значительно превышающих их собственные размеры. Профессор Офер Файнерман и его команда использовали эту общую черту, чтобы выяснить, кто справится с задачей лучше. Для этого они создали реальную версию классической задачи из области робототехники — "головоломку о перемещении пианино" *) . Участникам нужно было провести Т-образный объект через прямоугольное пространство, разделённое на три камеры с узкими проходами.

Эксперимент проводился с двумя видами лабиринтов — для муравьёв и людей, а также с группами разного размера. Люди участвовали добровольно, а муравьи (Paratrechina longicornis, также известные как "сумасшедшие муравьи") были привлечены, думая, что перемещают еду в свой муравейник.

Муравьи справлялись с задачей в трёх вариантах: в одиночку, в малой группе (около семи особей) и в большой группе (около 80). Люди также работали в трёх аналогичных комбинациях. Чтобы сравнение было максимально точным, людям в некоторых случаях запрещали общаться, а также использовали ручки с датчиками для измерения прилагаемой силы.

Credit: Weizmann Institute of Science

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

"Муравейник — это семья, где все особи связаны общими интересами. Это тесно сплочённое общество, где сотрудничество преобладает над конкуренцией. Именно поэтому муравейник иногда называют суперорганизмом, где каждая особь действует как часть единого целого", — объясняет Файнерман.

Исследование подтвердило, что муравьи в группе умнее, чем по отдельности, а у людей коллективная работа не всегда приводит к лучшим результатам. "Знаменитая "мудрость толпы", столь популярная в эпоху социальных сетей, в наших экспериментах не проявилась", — отметил учёный.

Несмотря на сложности человеческого сотрудничества, авторы исследования успешно объединили усилия, включая доктора Эхуда Фонио, профессора Нира Гова и доктора Амира Халуца. Их работа открывает новые горизонты в понимании группового поведения и эволюции сотрудничества.

More information: Tabea Dreyer et al, Comparing cooperative geometric puzzle solving in ants versus humans, Proceedings of the National Academy of Sciences (2024). DOI: 10.1073/pnas.2414274121

Journal information: Proceedings of the National Academy of Sciences

*) "Головоломка о перемещении пианино" (англ. **Piano Movers' Problem**) — это классическая задача из области робототехники, теории планирования движений и вычислительной геометрии. Она была впервые сформулирована в 1980-х годах и стала одной из ключевых проблем в разработке алгоритмов для перемещения объектов в сложных пространствах.

Суть задачи

Задача заключается в поиске оптимального пути для перемещения крупного объекта (например, пианино) из точки **А** в точку **Б** в ограниченном пространстве, которое может содержать препятствия. Основная сложность состоит в том, что объект имеет нестандартную форму и размеры, что требует тщательного планирования его траектории, чтобы избежать столкновений с окружающими объектами.

Математическая формулировка

С математической точки зрения задача сводится к поиску пути в **конфигурационном пространстве** (англ. **Configuration Space**), где каждая точка представляет возможное положение и ориентацию объекта. Пространство делится на допустимые и недопустимые области (например, где объект сталкивается с препятствиями). Задача заключается в нахождении непрерывного пути от начальной до конечной конфигурации, который лежит только в допустимых областях.

Пример

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

Сложность

Задача относится к классу **NP-трудных**, что означает, что для её решения в общем случае не существует эффективного алгоритма, работающего за полиномиальное время. Поэтому на практике используются приближённые методы, эвристики и алгоритмы, такие как:

- Алгоритмы поиска пути (например, A*, RRT — Rapidly-exploring Random Tree).

- Методы декомпозиции пространства (разбиение пространства на более простые области).

- Использование симуляций для проверки возможных траекторий.

Показать полностью 1 1
8

101 игра на python. Информатика. Алгоритмы сортировки

В повседневной жизни и в программировании мы сталкиваемся с необходимостью упорядочить данные. Это может быть что угодно: список покупок, книги на полке или результаты поиска. Алгоритмы сортировки – это набор инструкций, которые помогают нам расположить элементы в определенном порядке, будь то по возрастанию, убыванию или по какому-либо другому критерию.

Для примера я возьму фрукты разного размера.

Сопоставим фрукты с размерами. Будем использовать кортежи (tuple), где:

  • Первый элемент – это размер фрукта:

    • 🍎 (мелкий) – яблоко

    • 🍐 (средний) – груша

    • 🍉 (большой) – дыня

    • 🧺 (очень большой) – корзина

  • Второй элемент – это уникальный идентификатор, для работы программы.

Пример: (🍎, 1) – это мелкое яблоко с идентификатором 1.

101 игра на python. Информатика. Алгоритмы сортировки Инструкция, Программирование, Информатика, Длиннопост

Алгоритмы сортировки (сравнение по размеру фрукта):

Сортировка пузырьком (Bubble Sort):

(Более легкие пузырьки всплывают раньше)

  • Алгоритм сравнивает соседние фрукты по размеру. Если фрукт больше, чем соседний, он меняется с ним местами.

  • Этот процесс повторяется до тех пор, пока весь список фруктов не будет отсортирован от меньшего к большему.

  • Аналогия: Представь, что у тебя есть аквариум с разными по размеру пузырьками воздуха. Более легкие пузырьки (соответствующие более мелким фруктам) будут всплывать на поверхность раньше, чем более тяжелые (соответствующие более крупным фруктам). Таким образом, более легкие фрукты "всплывают" наверх списка, а тяжелые опускаются вниз.

101 игра на python. Информатика. Алгоритмы сортировки Инструкция, Программирование, Информатика, Длиннопост
101 игра на python. Информатика. Алгоритмы сортировки Инструкция, Программирование, Информатика, Длиннопост

Сортировка вставками (Insertion Sort):

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

  • Аналогия: Представь, что ты играешь в карты, и тебе нужно собрать их по порядку (например, от меньшей к большей). Ты берешь карту за картой и, как только получаешь новую карту, ты вставляешь ее на нужное место в уже собранной части карт, раздвигая другие карты, если это необходимо. Ты строишь отсортированный ряд карт, добавляя в него новые.

101 игра на python. Информатика. Алгоритмы сортировки Инструкция, Программирование, Информатика, Длиннопост
101 игра на python. Информатика. Алгоритмы сортировки Инструкция, Программирование, Информатика, Длиннопост

Сортировка выбором (Selection Sort):

  • Алгоритм находит самый маленький фрукт в неотсортированной части списка. Затем он ставит этот фрукт на первое место в неотсортированной части списка.

  • Этот процесс повторяется до тех пор, пока все фрукты не будут отсортированы.

  • Аналогия: Представь, что ты участвуешь в конкурсе на самый маленький фрукт, и тебе нужно построить ряд фруктов в порядке возрастания размера. Ты внимательно осматриваешь все фрукты и выбираешь самый маленький из них, ставишь его первым в ряд. Затем ты снова выбираешь самый маленький из оставшихся и ставишь его вторым, и так далее, пока все фрукты не будут выстроены в ряд.

101 игра на python. Информатика. Алгоритмы сортировки Инструкция, Программирование, Информатика, Длиннопост
101 игра на python. Информатика. Алгоритмы сортировки Инструкция, Программирование, Информатика, Длиннопост

101 игра на python. Информатика. Алгоритмы сортировки Инструкция, Программирование, Информатика, Длиннопост

Запустить код в google colab

Посмотреть на github

Серия «101 игра на python. Информатика»

Все серии

Удачи!

UPD:

КОД ПЕРЕЕХАЛ ПО АТОМУ АДРЕСУ

Показать полностью 8
5

101 игра нa python. Информатика. Системы счисления

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

Системы Счисления


1. Абстрактная система счисления

На важно, как обoзначать числа, можно использовать любой набор символов, главное, чтобы они соответствовали прaвилам:

  • Основание (базис): Это количество уникальных символов (цифр), которые мы используем. Обозначим основание как b.

  • Цифры: Это символы, которые мы используем для представления чисел. Обычно это арабские цифры (0, 1, 2, 3, ...), латинские(I,II,II,..), но могут быть и другие символы. Например:

  • Позиция: Каждая цифра в записи числа имеет свою позицию, которая влияет на её значение.

  • Разряды: Каждая позиция называется разрядом (например, единицы, десятки, сотни и т.д.)

Как строится система счисления?

  1. Выбор основания: Выбираем целое число b, которое будет основанием нашей системы.

  2. Выбор цифр: Нам нужно b уникальных цифр. Обычно это 0, 1, 2, ..., b-1.

  3. Запись числа: Число записывается как последовательность цифр. Значение каждой цифры умножается на основание, возведенное в степень, равную ее позиции (начиная с 0 справа).

Формула для расчета значения числа:

Если у нас есть число, записанное в виде последовательности цифр dₙ dₙ₋₁ ... d₁ d₀, то его значение в десятичной системе можно вычислить по формуле:

значение = dₙ * bⁿ + dₙ₋₁ * bⁿ⁻¹ + ... + d₁ * b¹ + d₀ * b⁰

Где:

  • dᵢ - цифра в i-ом разряде

  • b - основание системы счисления

  • i - номер разряда (справа налево, начиная с 0)

Пример:

Предположим, у нас есть число 123 в десятичной системе (основание 10). По формуле:

1 * 10² + 2 * 10¹ + 3 * 10⁰ = 100 + 20 + 3 = 123

Порядки счисления (разряды):

Порядки, как мы уже говорили, это позиции цифр в числе, каждая позиция имеет свой вес, который определяется основанием в степени ее порядкового номера.

  • d₀: единицы (b⁰)

  • d₁: b (b¹)

  • d₂: b²

  • d₃: b³

  • и так далее

Правила:

  1. Диапазон цифр: Используются цифры от 0 до b-1.

  2. Позиционный принцип: Значение цифры зависит от её позиции.

  3. Переход к следующему разряду: Когда в разряде достигается значение b, происходит перенос в следующий разряд (аналог того как после 9 в десятичной системе прибавляется 1 к следующему разряду и получается 10)

Груши - яблоки:

  • 🍎 (яблоко)

  • 🍐 (груша)

  • 🍉 (дыня)

  • 🧺 (корзинка)

Правила:

  1. 3 🍎 = 1 🍐

  2. 5 🍐 = 3 🍉

  3. 2 🍉 = 1 🧺

Представление чисел:

Мы будем представлять количество фруктов в виде строки, где каждый символ юникода соответствует одному фрукту. Например, "🍎🍎🍎" - это 3 яблока, а "🍉🍉" - это 2 дыни.

Арифметические операции:

101 игра нa python. Информатика. Системы счисления Программирование, Гайд, Шпаргалка, Информатика, Яндекс Дзен (ссылка), Длиннопост
101 игра нa python. Информатика. Системы счисления Программирование, Гайд, Шпаргалка, Информатика, Яндекс Дзен (ссылка), Длиннопост
101 игра нa python. Информатика. Системы счисления Программирование, Гайд, Шпаргалка, Информатика, Яндекс Дзен (ссылка), Длиннопост

Примеры:

101 игра нa python. Информатика. Системы счисления Программирование, Гайд, Шпаргалка, Информатика, Яндекс Дзен (ссылка), Длиннопост

Разъяснение кода:

  1. normalize_fruits(fruits): Эта функция преобразует строку с фруктами к минимальному виду. Она сначала считает количество каждого фрукта, а затем, используя правила обмена, преобразует их к более крупным единицам (яблоки в груши, груши в дыни, дыни в корзины), после преобразования склеивает обратно в строку с минимальным набором фруктов.

  2. add_fruits(fruits1, fruits2): Эта функция выполняет сложение двух строк с фруктами. Она просто конкатенирует две строки и затем нормализует результат.

  3. sub_fruits(fruits1, fruits2): Это функция для вычитания одной строки фруктов из другой. Она преобразует всё в "количество яблок" и затем выполняет вычитание, а потом обратно переводит яблоки в нормализованный вид, при этом проверяет возможность вычитания.

  4. Примеры: В конце кода приведены примеры сложения и вычитания с различными комбинациями фруктов и выводом результатов.

Задания:

  1. Попробуй добавить в код функцию для умножения фруктов на целое число (например, multiply_fruits(fruits, n)).

  2. Реализуй функцию compare_fruits(fruits1, fruits2), которая сравнивает две строки с фруктами и возвращает "больше", "меньше" или "равно".

  3. Придумай свои собственные правила обмена фруктов и модифицируй код под них.

  4. Добавь проверку на корректность входных данных (чтобы строка состояла только из разрешенных символов юникода)

  5. Реализуй более продвинутое вычитание, например, не выдавать ошибку "Невозможно вычесть", а выводить результат со знаком минус (усложненное задание).


2. Конкретные системы счисления

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

2.1. Двоичная (бинарная) система (основание 2)

  • Цифры: 0, 1

  • Используется в компьютерах: Все данные в компьютерах представлены в двоичном коде (битах).

Пример:

  • Число 1011₂ (читается как "один ноль один один по основанию 2"). Перевод в десятичную систему:
    1 * 2³ + 0 * 2² + 1 * 2¹ + 1 * 2⁰ = 8 + 0 + 2 + 1 = 11₁₀

101 игра нa python. Информатика. Системы счисления Программирование, Гайд, Шпаргалка, Информатика, Яндекс Дзен (ссылка), Длиннопост

2.2. Троичная система (основание 3)

  • Цифры: 0, 1, 2

  • Интересна в теории: Применяется в некоторых областях математики и информатики.

Пример:

  • Число 210₂ (читается как "два один ноль по основанию 3"). Перевод в десятичную систему:
    2 * 3² + 1 * 3¹ + 0 * 3⁰ = 18 + 3 + 0 = 21₁₀

101 игра нa python. Информатика. Системы счисления Программирование, Гайд, Шпаргалка, Информатика, Яндекс Дзен (ссылка), Длиннопост

2.3. Семеричная система (основание 7)

  • Цифры: 0, 1, 2, 3, 4, 5, 6

  • Менее распространена: Используется в некоторых узких областях, например, в некоторых системах кодирования.

Пример:

  • Число 345₇ (читается как "три четыре пять по основанию 7"). Перевод в десятичную систему:
    3 * 7² + 4 * 7¹ + 5 * 7⁰ = 147 + 28 + 5 = 180₁₀

101 игра нa python. Информатика. Системы счисления Программирование, Гайд, Шпаргалка, Информатика, Яндекс Дзен (ссылка), Длиннопост

2.4. Десятичная система (основание 10)

  • Цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

  • Повседневная: Самая распространенная система, которую мы используем каждый день.

Пример:

  • Число 789₁₀. Перевод в десятичную систему: (смысла нет, это и есть десятичное)
    7 * 10² + 8 * 10¹ + 9 * 10⁰ = 700 + 80 + 9 = 789₁₀

2.5. Шестидесятиричная система (основание 60)

  • Цифры: 0-59 (в практическом применении используются комбинации символов)

  • Историческая: Использовалась в Древнем Вавилоне, а сейчас для измерения времени (часы, минуты, секунды) и углов.

Пример:

  • Представим число 25:30:15₆₀ (25 градусов, 30 минут, 15 секунд) или
    25 * 60² + 30 * 60¹ + 15 * 60⁰ = 25 * 3600 + 30 * 60 + 15 * 1 = 90000 + 1800 + 15 = 91815₁₀ (общее число секунд)

3. Задания

Задание 1:

Переведи следующие числа из одной системы в другую:

  • 11011₂ в десятичную

  • 201₃ в десятичную

  • 563₇ в десятичную

  • 45₁₀ в двоичную

  • 34₁₀ в троичную

  • 150₁₀ в семеричную

Задание 2:

Придумай свою собственную систему счисления с основанием, например, 5 (пятеричная). Запиши несколько чисел в этой системе и переведи их в десятичную.

Задание 3:

Реализуй функции для перевода из десятичной системы в двоичную, троичную, семеричную и обратно (как в примерах выше)

Задание 4:

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

Задание 5:

Попробуй перевести какое-то время в секунды, представленное в виде "ч:м:с" в десятичную систему и обратно.

Советы:

  • Практикуйся в переводах. Чем больше ты тренируешься, тем лучше будешь понимать принципы систем счисления.

  • Не бойся экспериментировать. Попробуй создавать свои собственные системы счисления.

  • Используй Python для проверки своих решений и автоматизации перевода.

Запустить код в google colab

Посмотреть на github

Другие шпаргалки

Серия «101 игра на python»

Удачи!

UPD:

КОД ПЕРЕЕХАЛ ПО НОВОМУ АДРЕСУ

Показать полностью 7
Отличная работа, все прочитано!