Преобразование семи позиций на карте в одно число.
Когда этот информационный бюллетень будет опубликован, до полного затмения останется четыре дня. Я надеюсь, что вы все взволнованы, и все, кто физически и финансово способен наблюдать за ним в зоне полной полосы, обязательно это сделают. К сожалению, в Техасе, где я планирую наблюдать затмение, на этот день прогнозируются грозы. Тем не менее, я надеюсь на ясное небо.
Прежде чем перейти к основной теме, я получил неожиданно сильный отклик на свою последнюю рассылку опасхальных фактах. Похоже, некоторые из вас хорошо знают Библию и оспорили некоторые из моих ответов. Вот два основных вопроса, вызвавших возражения, которые тесно связаны между собой:
Вопрос 8: Позже Иуда вернул деньги священникам, которым заплатил за предательство Иисуса. Что они сделали с деньгами?
Ответ 8: Они купили кладбище для бедняков, где хоронят неопознанные тела. (Матфея 27:6-8)
Мне указали на то, что в книге Деяний рассказывается другая история о том, что случилось с 30 серебряными монетами. Там говорится, что Иуда сам купил поле горшечника (Деяния 1:18).
Вопрос 9: Как Иуда покончил с собой?
Ответ 9: Повешение (Матфея 27:3-5)
Опять же, в книге Деяний, кажется, другая версия. Я не совсем уверен, что это значит, поэтому позволю Писанию говорить самому за себя: «На плату, полученную за злодеяние свое, Иуда купил поле; там он упал вниз головой, и тело его разорвалось, и все внутренности его вывалились наружу» – Деяния 1:18.
Я так это интерпретирую: Иуда заболел, у него раздулось тело, появились открытые язвы. В конце концов, он так ослабел, что упал, и его внутренности вывалились наружу. Возможно, падение было преднамеренным.
В ходе исследования я обнаружил, что некоторые сторонники непогрешимости Библии приложили немало усилий, чтобы объединить две истории в одну запутанную. Однако подобные объяснения вызывают у меня лишь закатывание глаз.
Итак, перейдём к главной теме этой недели: эффективному программированию для подсчёта семикарточной покерной комбинации. Учитывая скорость компьютеров, это может показаться не такой уж большой проблемой.Однако, чтобы освоить Техасский Холдем, нужно проанализировать 56 триллионов вариантов выпадения карт. Для каждого из них необходимо составить две комбинации из семи карт. Без использования каких-либо упрощений это может занять годы.
Существует 133 784 560 способов выбрать семь карт из колоды в 52 карты (combin(52,7) = 133 784 560). Важный способ экономии времени — оценить каждую возможную комбинацию один раз и сохранить результаты в массиве. Однако как перейти от семи отдельных карт к одной позиции в массиве?
Прежде чем дать свой ответ, можно было бы предложить использовать семимерный массив размером 52^7. Такой массив должен был бы вмещать 1 028 071 702 528 целых чисел. Я не думаю, что какой-либо настольный компьютер позволит выделить такой объем памяти. Нет, нам нужно каким-то образом сопоставить 7 карт с целым числом от 0 до 133 784 559. Мой компилятор C++ позволяет использовать массивы такого размера без ошибок.
Сначала присвойте каждой карте целое число от 0 до 51. Вы можете сделать это любым удобным для вас способом. Лично я начинаю с чисел от 0 до 3 (двойки), от 4 до 7 (тройки) и так далее до тузов (от 48 до 51). Важно, чтобы при делении числа карты на 4 остаток неизменно давал одну и ту же масть. Например, для всех червей остаток может быть равен 0, для треф — 1, для бубен — 2, а для масти 3.
Моя функция сопоставит наименьший набор карт 0, 1, 2, 3, 4, 5, 6 с числом 0. Аналогично, максимальный набор 45, 46, 47, 48, 49, 50, 51 будет сопоставлен с максимальным значением 133 784 559.
В качестве примера рассмотрим набор карт с номерами 5, 10, 15, 20, 25, 30, 35 и определим, какому целому числу следует соответствовать этот набор.
Для начала рассмотрим самую младшую карту с номером 5. Мы можем пропустить множество комбинаций, включающих хотя бы одну карту с номером от 0 до 4. Количество способов выбрать 7 карт из оставшихся 47 в колоде равно combin(47,7) = 62 891 499. Как упоминалось ранее, существует combin(52,7) = 133 784 560 способов выбрать 7 карт из 52. Таким образом, мы можем пропустить 133 784 560 - 62 891 499 = 70 893 061 чисел, в которых есть хотя бы одна карта в диапазоне от 0 до 4.
Далее рассмотрим вторую карту со значением 10. Мы можем пропустить больше комбинаций, включающих хотя бы одну карту со значением от 6 до 9. Количество способов выбрать оставшиеся 6 карт из 42 в колоде равно combin(42,6) = 5 245 786. Это из combin(46,6) = 9 366 819 возможных способов выбрать остальные шесть карт со значением выше 5, чем у первой карты. Таким образом, мы можем пропустить 9 366 819 - 5 245 786 = 4 121 033 числа для наборов карт, включающих хотя бы одно значение от 6 до 9.
Далее рассмотрим третью карту со значением 15. Мы можем пропустить другие комбинации, в которых есть хотя бы одна карта в диапазоне от 11 до 14. Количество способов выбрать оставшиеся 5 карт из 37 в колоде равно combin(37,5) = 435 897.Это из комбинации (41,5) = 749 398 возможных способов выбрать остальные пять карт со значением выше 10, как у второй карты. Таким образом, мы можем пропустить 749 398 - 435 897 = 313 501 чисел для наборов карт, в которых есть хотя бы одно значение от 11 до 14.
Далее рассмотрим четвертую карту со значением 20. Мы можем пропустить больше комбинаций, в которых есть хотя бы одна карта со значением от 16 до 19. Количество способов выбрать оставшиеся 4 карты из 32 в колоде составляет combin(32,4) = 35 960. Это из combin(36,4) = 58 905 возможных способов выбрать остальные четыре карты со значением выше 15, как у третьей карты. Таким образом, мы можем пропустить 58 905 - 35 960 = 22 945 чисел для наборов карт, в которых есть хотя бы одно значение от 16 до 19.
Далее рассмотрим пятую карту со значением 25. Мы можем пропустить больше комбинаций, в которых есть хотя бы одна карта со значением от 21 до 24. Количество способов выбрать оставшиеся три карты из 27 в колоде равно combin(27,3) = 2925. Это из combin(31,3) = 4495 возможных способов выбрать остальные три карты со значением выше 20, как у четвертой карты. Таким образом, мы можем пропустить 4495-2925 = 1570 чисел для наборов карт, в которых есть хотя бы одно значение от 21 до 24.
Далее рассмотрим шестую карту со значением 30. Мы можем пропустить больше комбинаций, включающих хотя бы одну карту со значением от 26 до 29. Количество способов выбрать две оставшиеся карты из 22 в колоде равно combin(22,2) = 231. Это из combin(26,3) = 325 возможных способов выбрать две другие карты со значением выше 20, чем у пятой карты. Таким образом, мы можем пропустить 325-231=94 числа для наборов карт, включающих хотя бы одно значение от 26 до 29.
Теперь у нас осталась всего одна карта. Шестая карта должна быть больше 30. На самом деле, мы знаем, что это 35. Поэтому мы можем пропустить четыре карты с номерами от 31 до 34 и перейти к седьмой карте.
В общей сложности мы пропустили 70 893 061 + 4 121 033 + 313 501 + 22 945 + 1 570 + 94 + 4 = 75 352 208 карт.
Поскольку нумерация начинается с нуля, как это делают все хорошие программисты, мы можем присвоить набору чисел 5, 10, 15, 20, 25, 30, 35 значение 75 352 208.
Разумеется, эта же логика будет работать для колоды любого размера и при выборе любого количества карт из неё.
На следующей неделе я планирую представить вам хотя бы предварительный отчет о полном солнечном затмении 8 апреля 2024 года!