101 игра нa python. Информатика. Системы счисления
Статья из серии 101 игра на python, где я публикую разбор кода учебного репозитория для делающих первые шаги в разработке на python и просто любителей хорошего кода. В репозитории находится сборник программ и игр, написанных лёгким языком, по которым ты можешь изучать код.
Системы Счисления
1. Абстрактная система счисления
На важно, как обoзначать числа, можно использовать любой набор символов, главное, чтобы они соответствовали прaвилам:
Основание (базис): Это количество уникальных символов (цифр), которые мы используем. Обозначим основание как b.
Цифры: Это символы, которые мы используем для представления чисел. Обычно это арабские цифры (0, 1, 2, 3, ...), латинские(I,II,II,..), но могут быть и другие символы. Например:
Позиция: Каждая цифра в записи числа имеет свою позицию, которая влияет на её значение.
Разряды: Каждая позиция называется разрядом (например, единицы, десятки, сотни и т.д.)
Как строится система счисления?
Выбор основания: Выбираем целое число b, которое будет основанием нашей системы.
Выбор цифр: Нам нужно b уникальных цифр. Обычно это 0, 1, 2, ..., b-1.
Запись числа: Число записывается как последовательность цифр. Значение каждой цифры умножается на основание, возведенное в степень, равную ее позиции (начиная с 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³
и так далее
Правила:
Диапазон цифр: Используются цифры от 0 до b-1.
Позиционный принцип: Значение цифры зависит от её позиции.
Переход к следующему разряду: Когда в разряде достигается значение b, происходит перенос в следующий разряд (аналог того как после 9 в десятичной системе прибавляется 1 к следующему разряду и получается 10)
Груши - яблоки:
🍎 (яблоко)
🍐 (груша)
🍉 (дыня)
🧺 (корзинка)
Правила:
3 🍎 = 1 🍐
5 🍐 = 3 🍉
2 🍉 = 1 🧺
Представление чисел:
Мы будем представлять количество фруктов в виде строки, где каждый символ юникода соответствует одному фрукту. Например, "🍎🍎🍎" - это 3 яблока, а "🍉🍉" - это 2 дыни.
Арифметические операции:
Примеры:
Разъяснение кода:
normalize_fruits(fruits): Эта функция преобразует строку с фруктами к минимальному виду. Она сначала считает количество каждого фрукта, а затем, используя правила обмена, преобразует их к более крупным единицам (яблоки в груши, груши в дыни, дыни в корзины), после преобразования склеивает обратно в строку с минимальным набором фруктов.
add_fruits(fruits1, fruits2): Эта функция выполняет сложение двух строк с фруктами. Она просто конкатенирует две строки и затем нормализует результат.
sub_fruits(fruits1, fruits2): Это функция для вычитания одной строки фруктов из другой. Она преобразует всё в "количество яблок" и затем выполняет вычитание, а потом обратно переводит яблоки в нормализованный вид, при этом проверяет возможность вычитания.
Примеры: В конце кода приведены примеры сложения и вычитания с различными комбинациями фруктов и выводом результатов.
Задания:
Попробуй добавить в код функцию для умножения фруктов на целое число (например, multiply_fruits(fruits, n)).
Реализуй функцию compare_fruits(fruits1, fruits2), которая сравнивает две строки с фруктами и возвращает "больше", "меньше" или "равно".
Придумай свои собственные правила обмена фруктов и модифицируй код под них.
Добавь проверку на корректность входных данных (чтобы строка состояла только из разрешенных символов юникода)
Реализуй более продвинутое вычитание, например, не выдавать ошибку "Невозможно вычесть", а выводить результат со знаком минус (усложненное задание).
2. Конкретные системы счисления
Теперь давай рассмотрим конкретные примеры систем счисления и поработаем с ними.
2.1. Двоичная (бинарная) система (основание 2)
Цифры: 0, 1
Используется в компьютерах: Все данные в компьютерах представлены в двоичном коде (битах).
Пример:
Число 1011₂ (читается как "один ноль один один по основанию 2"). Перевод в десятичную систему:
1 * 2³ + 0 * 2² + 1 * 2¹ + 1 * 2⁰ = 8 + 0 + 2 + 1 = 11₁₀
2.2. Троичная система (основание 3)
Цифры: 0, 1, 2
Интересна в теории: Применяется в некоторых областях математики и информатики.
Пример:
Число 210₂ (читается как "два один ноль по основанию 3"). Перевод в десятичную систему:
2 * 3² + 1 * 3¹ + 0 * 3⁰ = 18 + 3 + 0 = 21₁₀
2.3. Семеричная система (основание 7)
Цифры: 0, 1, 2, 3, 4, 5, 6
Менее распространена: Используется в некоторых узких областях, например, в некоторых системах кодирования.
Пример:
Число 345₇ (читается как "три четыре пять по основанию 7"). Перевод в десятичную систему:
3 * 7² + 4 * 7¹ + 5 * 7⁰ = 147 + 28 + 5 = 180₁₀
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:
КОД ПЕРЕЕХАЛ ПО НОВОМУ АДРЕСУ







Программирование на python
1K постов12K подписчика
Правила сообщества
Публиковать могут пользователи с любым рейтингом. Однако!
Приветствуется:
• уважение к читателям и авторам
• конструктивность комментариев
• простота и информативность повествования
• тег python2 или python3, если актуально
• код публиковать в виде цитаты, либо ссылкой на специализированный сайт
Не рекомендуется:
• допускать оскорбления и провокации
• распространять вредоносное ПО
• просить решить вашу полноценную задачу за вас
• нарушать правила Пикабу