Главная | Все статьи | Мотивация

Решаем задачу: компьютерные шахматы и вес Хэмминга

Время чтения статьи ~2 минуты
Решаем задачу: компьютерные шахматы и вес Хэмминга главное изображение

Условия

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

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

Тогда Денис решил добавить функцию проверки потери данных — вес Хэмминга, который по определенной схеме перебирает все биты в пакете и указывает на тот, в котором произошло искажение.

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

Условия примера звучат так:

Число Хэмминга количество единиц в двоичном представлении числа. Нужно реализовать функцию hammingWeight(), которая принимает целое число в качестве параметра и возвращает вес Хэмминга.

hammingWeight(0); // 0
hammingWeight(4); // 1
hammingWeight(101); // 4

Читайте также: Как сохранять фокус на протяжении всего обучения: советы от Хекслета

Решение

Эта задача — из испытаний базового курса по Java на Хекслете. С ней справились 89% наших студентов. Ниже опубликован разбор решения — вы можете сравнить свое решение с нашим или посмотреть реализацию, если самостоятельно решить задачу не удается.

Задачу можно решить на нескольких языках программирования например, на Java или PHP. Ниже опубликован вариант решения на Java, по которому можно воспроизвести определение веса Хемминга.

import java.util.Arrays;
import java.util.List;

public class HammingWeight {
    public static int hammingWeight(int value) {

        int weight = 0;
        List<String> digits = Arrays.asList(Integer.toBinaryString(value).split(""));
        for (String digit : digits) {
            if (digit.equals("1")) {
                weight += 1;
            }
        }
        return weight;
    }
}

О решении этой задачи на PHP на примере код-ревью одного из студентов Хекслета можно почитать здесь.

Никогда не останавливайтесь: В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть сотни курсов по разработке на разных языках и технологиях

Аватар пользователя Oleg Sabitov
Oleg Sabitov 11 февраля 2022
3
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 25 апреля
профессия
от 6 183 ₽ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 25 апреля
профессия
от 5 025 ₽ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 25 апреля
профессия
от 5 840 ₽ в месяц
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 25 апреля
профессия
от 9 900 ₽ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 25 апреля
профессия
новый
Автоматизированное тестирование веб-приложений на JavaScript
8 месяцев
c опытом
в разработке
Старт 25 апреля
профессия
Верстка с использованием последних стандартов CSS
5 месяцев
с нуля
Старт в любое время