Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Игры в сжатие, Анонимные объединения и структуры 
:(
    Опции темы
Chaos A.D.
Дата 3.3.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

Репутация: 6
Всего: 7



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

Код

class TurnRep
{
    /* ... */
        union
        {
            unsigned non_contiguous_rep_ : 12;
            struct
            {
                unsigned letter_first  : 3;
                unsigned digit_first   : 3;
                unsigned letter_second : 3;
                unsigned digit_second  : 3;
            };
        } rep_;
    public :
        /* Много полезных функций */
}


По логике вещей, TurnRep должен занимать 2 байта (с правильно поставленным выравниванием, естесственно). Но у меня он, блин, равен 4. Я несчастный обладатель BCB6, другого компилера сейчас под рукой нет. Буду очень признателен, если кто-нибудь проверит, мой код на своем компилере. Или, может, я где нибудь ошибся?
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
Romikgy
Дата 3.3.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



по идее твой код занимает 3 байта , без выравнивания
12+3+3+3+3=24
24/8=3


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Дрон
Дата 3.3.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 92



Chaos A.D.,
Замени первый unsigned на short
А оставшиеся 4 на char

Во всяком случае в VC++ 7 сработало smile
А вообще это выглядит ужасно... Совмещать класс С++ с битовым полем smile
Добавлено @ 16:14
Цитата(Romikgy @ 3.3.2006, 16:09 Найти цитируемый пост)
по идее твой код занимает 3 байта , без выравнивания
12+3+3+3+3=24

Нет. Там же union. Общий объём 12 бит -- выделяется 2 байта.


--------------------
Да. Именно так.
PM   Вверх
Romikgy
Дата 3.3.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Дрон @ 3.3.2006, 15:13 Найти цитируемый пост)
Нет. Там же union. Общий объём 12 бит -- выделяется 2 байта.

Точно проглядел , сорри


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
maxim1000
Дата 3.3.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(Chaos A.D. @ 3.3.2006, 14:56 Найти цитируемый пост)
Причем, желательно, чтобы один ход занимал минимальное количество данных

ну тогда, возможно, стоит рассмотреть еще и такое представление хода:
на каждом ходу у текущего игрока есть не более, чем 16 фигур
их можно упорядочить (например, сверху вниз, слева направо), таким образом, хранить координаты исходной клетки уже избыточно - можно хранить номер фигуры - 4 бита
кроме того, каждая фигура имеет свои ограничения на ходы
точно не считал, но на первый взгляд кажется, что их не может быть более, для ферзя, который стоит на одной из 4-х центральных клеток, и ходить ему никто не запрещает, тогда возможных ходов будет: (7+6)(по диагонали)+(7+7)(по вертикали и горизонтали)=27, т.е. достаточно 5 бит
итого, для кодирования хода достаточно 9 бит...
теперь вспомним, что не все фигуры могуделать такое большое количество ходов, для ладьи оно уже будет 14, а для пешек (которые будут составлять половину при максимальном количестве) - вообще 4 (на одну клетку, на две и два боя)...
чтобы это использовать, можно перейти от независимого кодирования исходной и целевой клетки к просто записи номера хода
а количество возможных ходов можно оценить сверху так:
у ферзя - 27
у ладьи - 14
у остальных - не больше ладьи
т.е. 27*1 ферзь + 14*7 остальных фигур+4*8 пешек=178
конечно же, реально возможных ходов будет меньше, причем, значительно...
дальше остается как-то их упорядочить, т.е. пронумеровать
например, сначала упорядочить по исходной клетке (а ту - сверху вниз, слева направо), а потом - по целевой
из вышеописанных рассчетов мы можем быть уверены, что число будет не больше 178, а значит, вполне хватит и байта...
P.S.
вполне возможно, что при более точной оценке максимального количества ходов, выяснится, например, что оно не больше 128 - тогда можно использовать уже и 7 бит, но тогда ходы не будут удобно разделены побайтно, что не очень удобно...
Добавлено @ 17:38
в конце концов, если уж минимировать, так минимизировать smile
перед каждым ходом считаем количество возможных ходов (это можно сделать ина восстанавливающей стороне)
смотрим, сколько бит надо для сохранения одного из этих ходов (т.е. берем двоичный логарифм и округляем вверх), и именно столько бит и используем...
на принимающей (т.е. восстанавливающей) стороне тоже считаем количество бит и именно столько и читаем и уже декодируем сам ход

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

дальше, наверное, можно было бы привлечь сюда и вероятностное кодирование, чтобы еще уменьшить среднее количество бит, но это, пожалуй, уже слишком

smile


--------------------
qqq
PM WWW   Вверх
Chaos A.D.
Дата 3.3.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

Репутация: 6
Всего: 7



maxim1000, спасибо, очень любопытно. Плюс тебе. Был приятно удивлен твоей фантазией, но для меня и это слишком...

Дрон, спасибо, помогло, правда непонятно, чем компилеру простой unsigned не понравился...
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
Дрон
Дата 3.3.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 92



Цитата(Chaos A.D. @ 3.3.2006, 19:02 Найти цитируемый пост)
Дрон, спасибо, помогло, правда непонятно, чем компилеру простой unsigned не понравился...

Вероятно, для битового поля выделяется сколько байт, сколько нужно для указаного типа переменной.
Любопытно было бы найти соответствующую главу в стандарте... Но это уже не ко мне. Я вообще на С++ больше не пишу smile


--------------------
Да. Именно так.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0902 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.