Convertendo sete posições de cartas em um único número.
Quando este boletim for publicado, faltarão quatro dias para o eclipse total. Espero que todos estejam animados e que todos aqueles que têm condições físicas e financeiras para testemunhá-lo na faixa de totalidade o façam. Infelizmente, a previsão do tempo no Texas, onde pretendo observá-lo, indica tempestades para esse dia. No entanto, continuo esperançoso de que o céu esteja limpo.
Antes de abordar o tema principal, gostaria de mencionar a grande repercussão que tive com meu último boletim informativo sobrecuriosidades da Páscoa. Parece que alguns de vocês conhecem bem a Bíblia e questionaram algumas das minhas respostas. Aqui estão as duas principais perguntas contestadas, que estão intimamente relacionadas:
Questão 8: Judas devolveu posteriormente o dinheiro aos sacerdotes que recebeu para trair Jesus. O que eles fizeram com o dinheiro?
Resposta 8: Eles compraram um cemitério para oleiros, que é onde os corpos não reclamados são enterrados. (Mateus 27:6-8)
Me foi apontado que o livro de Atos conta uma história diferente sobre o que aconteceu com as 30 moedas de prata. Lá diz que Judas comprou o campo do oleiro com o próprio dinheiro (Atos 1:18).
Pergunta 9: Como Judas se matou?
Resposta 9: Enforcamento (Mateus 27:3-5)
Novamente, o livro de Atos parece apresentar uma versão diferente. Não sei exatamente o que pensar a respeito, então deixarei que as Escrituras falem por si mesmas: “Com o pagamento que recebeu por sua maldade, Judas comprou um campo; ali caiu de cabeça, seu corpo se abriu e todas as suas entranhas se derramaram.” – Atos 1:18.
Minha interpretação é que Judas adoeceu, ficando inchado e com feridas abertas. Eventualmente, ele ficou tão fraco que caiu e suas entranhas se romperam. É possível que a queda tenha sido intencional.
Ao pesquisar sobre o assunto, percebi que alguns defensores da inerrância bíblica se esforçaram bastante para tentar fundir as duas histórias em uma só, confusa e complexa. No entanto, só me resta revirar os olhos diante de tais explicações.
Dito isso, vamos ao tópico principal desta semana: programação eficiente para calcular a pontuação de uma mão de pôquer de sete cartas. Isso pode não parecer um grande problema, dada a velocidade dos computadores.No entanto, o Ultimate Texas Hold 'Em envolve a análise de 56 trilhões de maneiras diferentes pelas quais as cartas podem ser distribuídas. Cada uma delas requer a pontuação de duas mãos de pôquer de sete cartas. Isso poderia levar anos sem atalhos.
Existem combin(52,7) = 133.784.560 maneiras de escolher sete cartas de um baralho de 52 cartas. Uma técnica importante para economizar tempo é calcular a pontuação de cada combinação possível uma única vez e salvar as pontuações em um array. No entanto, como obter uma única posição em um array a partir de sete cartas individuais?
Antes de dar minha resposta, alguém poderia sugerir o uso de uma matriz de sete dimensões com tamanho 52^7. Tal matriz precisaria armazenar 1.028.071.702.528 inteiros. Não creio que nenhum computador de mesa permita tanta alocação de memória. Não, precisamos mapear de alguma forma 7 cartas para um inteiro de 0 a 133.784.559. Meu compilador C++ permite matrizes desse tamanho sem problemas.
Primeiro, atribua a cada carta um número inteiro de 0 a 51. Você pode fazer isso da maneira que preferir. Pessoalmente, eu começo com os 2, atribuindo valores de 0 a 3, os 3, de 4 a 7, e assim por diante até os ases, que variam de 48 a 51. É importante que, ao dividir o número de uma carta por 4, o resto da divisão seja sempre do mesmo naipe. Por exemplo, todos os copas podem ter um resto de 0, os espaços de 1, os paus de 2 e os ouros de 3.
Minha função mapeará o conjunto de cartas mais baixo, 0, 1, 2, 3, 4, 5, 6, para o número 0. Da mesma forma, o conjunto máximo, 45, 46, 47, 48, 49, 50, 51, será mapeado para o valor máximo de 133.784.559.
Por exemplo, vamos considerar o conjunto de cartas numeradas 5, 10, 15, 20, 25, 30 e 35 e determinar a qual número inteiro esse conjunto deve ser associado.
Primeiro, considere a carta de menor valor, o 5. Podemos descartar muitas combinações que envolvam pelo menos uma carta numerada de 0 a 4. O número de maneiras de escolher 7 cartas dentre as 47 restantes do baralho é combin(47,7) = 62.891.499. Como mencionado anteriormente, existem combin(52,7) = 133.784.560 maneiras de escolher 7 cartas dentre 52. Portanto, podemos descartar 133.784.560 - 62.891.499 = 70.893.061 números que possuem pelo menos uma carta no intervalo de 0 a 4.
Em seguida, considere a segunda carta com valor 10. Podemos ignorar mais combinações que envolvam pelo menos uma carta no intervalo de 6 a 9. O número de maneiras de escolher as 6 cartas restantes dentre as 42 restantes no baralho é combin(42,6) = 5.245.786. Isso representa um total de combin(46,6) = 9.366.819 maneiras possíveis de escolher as outras seis cartas com valor superior a 5, que é a primeira carta. Portanto, podemos ignorar 9.366.819 - 5.245.786 = 4.121.033 conjuntos de cartas que incluem pelo menos um valor entre 6 e 9.
Em seguida, considere a terceira carta com valor 15. Podemos pular mais combinações que envolvam pelo menos uma carta no intervalo de 11 a 14. O número de maneiras de escolher as 5 cartas restantes das 37 restantes no baralho é combin(37,5) = 435.897.Isso resulta em 749.398 maneiras possíveis de escolher as outras cinco cartas acima do valor 10 da segunda carta, dentre combin(41,5). Portanto, podemos pular 749.398 - 435.897 = 313.501 números para conjuntos de cartas que incluem pelo menos um valor entre 11 e 14.
Em seguida, considere a quarta carta com valor 20. Podemos pular mais combinações que envolvam pelo menos uma carta no intervalo de 16 a 19. O número de maneiras de escolher as 4 cartas restantes dentre as 32 restantes no baralho é combin(32,4) = 35.960. Isso representa combin(36,4) = 58.905 maneiras possíveis de escolher as outras quatro cartas acima do valor 15 da terceira carta. Portanto, podemos pular 58.905 - 35.960 = 22.945 conjuntos de cartas que incluam pelo menos um valor entre 16 e 19.
Em seguida, considere a quinta carta com valor 25. Podemos pular mais combinações que envolvam pelo menos uma carta no intervalo de 21 a 24. O número de maneiras de escolher as três cartas restantes dentre as 27 no baralho é combin(27,3) = 2.925. Isso representa um total de combin(31,3) = 4.495 maneiras possíveis de escolher as outras três cartas acima do valor 20 da quarta carta. Portanto, podemos pular 4.495 - 2.925 = 1.570 conjuntos de cartas que incluam pelo menos um valor entre 21 e 24.
Em seguida, considere a sexta carta com valor 30. Podemos pular mais combinações que envolvam pelo menos uma carta no intervalo de 26 a 29. O número de maneiras de escolher as duas cartas restantes dentre as 22 no baralho é combin(22,2) = 231. Isso representa combin(26,3) = 325 maneiras possíveis de escolher as outras duas cartas acima do valor 20 da quinta carta. Portanto, podemos pular 325 - 231 = 94 conjuntos de cartas que incluem pelo menos um valor entre 26 e 29.
Agora só nos resta uma carta. A partir da sexta carta, sabemos que o valor deve ser maior que 30. Na verdade, sabemos que é 35. Portanto, podemos pular as quatro cartas numeradas de 31 a 34 e ir direto para a sétima carta.
No total, pulamos 70.893.061+4.121.033+313.501+22.945+1.570+94+4 = 75.352.208 cartas.
Como começamos a numeração em zero, como todo bom programador faz, podemos atribuir o valor 75.352.208 ao conjunto de números 5, 10, 15, 20, 25, 30 e 35.
Obviamente, essa mesma lógica funcionará para qualquer tamanho de baralho e para qualquer número de cartas escolhidas dele.
Na próxima semana, pretendo apresentar a vocês pelo menos um relatório preliminar sobre o eclipse total de 8 de abril de 2024!