
Хочу предложить к обозрению небольшую коллекцию функций, для удобной работы со списком структур. Такие списки представляются как таблицы, к ним со временем у меня приработался своеобразный функционал.
программист
Хочу предложить к обозрению небольшую коллекцию функций, для удобной работы со списком структур. Такие списки представляются как таблицы, к ним со временем у меня приработался своеобразный функционал.
Вот как бывает, пишешь программу, и вдруг видишь, что какой-то кусочек повторяется, и даже не второй раз. Начинаешь понимать, что это кандидат на новую функцию. Не потому, что логика обосабливаемая, а просто потому, что оно повторяется.
Этот кусочек нужно скопипастить, выбрать ему место, подровнять, дать имя этой новорожденной функции, и всем ее параметрам и переменным. Ведь теперь это самостоятельная функция, а не какой-то там временный тестовый код.
И вот получилась маленькая красивенькая функция, которая имеет всего одну функцию, один смысл, одну аккуратную страницу кода. Рекурсия блестит и сверкает своей стройностью и логичностью. В ней ничего лишнего, к ней ничего не нужно добавлять. Пока...
Некоторое время назад обратились ко мне с вопросом, как сделать программу, которая будет выигрывать в покер. После некоторого количества обсуждений, заказчик не захотел узнавать результат моих размышлений на эту тему, посчитал что дорого. Поэтому я разместил эти свои размышления здесь и за бесплатно.
Так же будет небольшая программка, которая может грубо и быстро обсчитать начальный расклад.
Сразу оговорюсь, что я в покер не играю, и знаю его хуже чем те, кто играет свои первые партии в жизни. Но может это не так уж и важно?
struct Stat {
uint value; // прогнозируемое значение
uint count; // количество прошедших таких значений
// функция index используется шаблонным классом Index - ключ для rb-дерева
static uint index(const Stat& s) { return s.value; }
Ptrn* owner;
double probability() const { return (double)count/(double)owner->sum_count_of_stat; }
};
// шаблонный класс Index это rb-дерево,
// первый параметр шаблона — тип значения по которому происходит сортировка,
// второй, это класс сохраняемых значений в узлах. Этот класс должен содержать
// функцию index.
struct Ptrn {
// узел, подсчитывающий, какое распределение вероятностей будет
// следовать за значением value
uint value;
Index<uint,Stat> index_of_stat; // распределение вероятностей
uint sum_count_of_stat;
// путем добавления к текущему value еще влево
// будут образовываться паттерны
Index<uint,Ptrn> index_of_prev;
static uint index(const Ptrn& s) { return s.value; }
Ptrn* owner; // owner->index_of_prev->find(value) == this,
// для root этот owner равен nullptr
};
Ptrn root;