Nome do problema dos números da contagem regressiva - e soluções algorítmicas?

10

Para os não britânicos na platéia, há um segmento de um game show diurno em que os participantes têm um conjunto de 6 números e um número alvo gerado aleatoriamente. Eles precisam atingir o número alvo usando qualquer um (mas não necessariamente todos) dos 6 números usando apenas operadores aritméticos. Todos os cálculos devem resultar em números inteiros positivos.

Um exemplo: Youtube: Countdown - O jogo de números mais extraordinários de todos os tempos?

Uma descrição detalhada é dada na Wikipedia: Countdown (Game Show)

Por exemplo:

  • O contente seleciona 6 números - dois grandes (as possibilidades incluem 25, 50, 75, 100) e quatro pequenos (números 1 a 10, cada um incluído duas vezes no pool).
  • Os números escolhidos são 75, 50, 2, 3, 8, 7são dadas com um número de destino 812.
  • Uma tentativa é (75 + 50 - 8) * 7 - (3 * 2) = 813 (Isso marca 7 pontos para uma solução dentro de 5 do alvo)
  • Uma resposta exata seria (50 + 8) * 7 * 2 = 812 (Isso teria marcado 10 pontos exatamente no alvo).

Obviamente, esse problema existia antes do advento da TV, mas o artigo da Wikipedia não o nomeou. Eu também vi esse jogo em uma escola primária em que participei, onde o jogo foi chamado de "Crypto" como uma competição entre classes - mas a busca por ele agora não revela nada.

Participei algumas vezes e meu pai escreveu uma planilha do Excel que tentou forçar o problema com força bruta; não me lembro como ele funcionava (apenas que não funcionava, com o limite de 65535 linhas do Excel), mas certamente deve haver uma solução algorítmica para o problema. Talvez exista uma solução que funcione da mesma forma que a cognição humana (por exemplo, paralelamente, para encontrar números 'suficientemente próximos', depois pegar candidatos e realizar operações 'menores').

Dai
fonte
1
Eu resolvi isso graficamente - nós uso para representar os resultados dos cálculos e bordas para representar as operações que podem ser feitas nesses números, em seguida, usar um algoritmo de busca gráfico para encontrar o caminho desejado
ell
1
Pela leitura das regras, parece que é possível não alcançar uma solução perfeita - por exemplo, se os números selecionados forem (1, 1, 2, 2, 3, 3) e o número de destino for 999. Então, realmente o alvo para qualquer algoritmo seria encontrar a solução mais próxima possível.
rico Smith
1
@ell: A sua solução de pesquisa gráfica é basicamente uma pesquisa de força bruta?
Martin
Acabei de usar uma primeira pesquisa aprofundada em minha implementação, mas não vejo por que algo como Dijkstra não pôde ser usado.
quer
1
Temos alguns shows semelhantes nos Estados Unidos: mantivermos aproximadamente 6 idiotas sub-alfabetizados em uma casa por várias semanas e filmá-los falando sobre o outro e gritando em outro. É o mais perto que a nossa TV chega de algo que esse intelectual nos programas populares.
RBarryYoung

Respostas:

4

Isenção de responsabilidade: Esta resposta não responde completamente à pergunta. Mas é muito longo para um comentário.

NP-difícil? Eu acredito que esse problema pode ser difícil para o NP .

Considere um caso especial do problema da mochila :

Dado um conjunto de números inteiros positivos e um número inteiro positivo b , existe um subconjunto do conjunto de forma que a soma de todos os números inteiros nesse subconjunto seja igual a b ?

Isso soa um pouco semelhante ao nosso problema de contagem regressiva, e parece ser muito mais simples. No entanto, a mochila (e este caso especial da mochila) é NP-difícil (e NP-completo, é claro).

Não consegui usar isso para provar que a contagem regressiva é difícil para o NP. Não consegui me livrar da divisão. Considere que temos mil 2 eb = 7. Isso nunca será solucionável com a mochila, mas sempre (?) Com a contagem regressiva, pelo menos de todas as maneiras que tentei transferir o problema.

Agora, se a contagem regressiva realmente fosse difícil para NP, poderíamos deduzir que, com uma probabilidade muito alta, não há algoritmo que seja significativamente mais eficiente do que a força bruta tentando todas as possibilidades. (E se encontrarmos esse algoritmo, nos tornaremos muito famosos.)

Não, acho que não deve haver um algoritmo eficiente.

Heurística. O vídeo do Youtube vinculado à pergunta tem um bom exemplo: O competidor encontrou uma resposta exata 952 = ((100 + 6) * 3 * 75 - 50) / 25. Isso é completamente contra a minha intuição, eu nunca teria tentado isso. maneira pela primeira vez: produza um número muito grande, divida-o e produza o resultado.

Por outro lado, nós, humanos, sentimos que não precisamos tentar (exemplo arbitrário) 50 * 75 * 100/2/3/7 para alcançar um número de três dígitos. Mas os computadores não sentem nada, eles simplesmente calculam.

Afinal, se implementarmos algumas heurísticas, e essas heurísticas não encontrarem uma solução exata, ainda teremos que tentar todas as outras soluções para garantir que realmente não haja nenhuma.

O que o concorrente no vídeo do Youtube faz é, eu acho, verificar muito rapidamente um grande número de possibilidades e descartar rapidamente aquelas que não darão (ou provavelmente não darão) uma solução.

Conclusão. Ao implementar um algoritmo, pode-se tomar o cuidado de eliminar cálculos iguais, como a / b / c = a / (b * c), mas acho que isso é bastante difícil de fazer e não sei se isso melhora significativamente o tempo de execução.

Os computadores, é claro, são mais rápidos que os humanos na verificação de um grande número de possibilidades. E hoje em dia, mesmo os smartphones são tão rápidos que, em um segundo, podem resolver esse problema, simplesmente tentando todas as possibilidades. (Eu não testei isso.) Existem apenas seis números, seria diferente se houvesse, por exemplo, 60 deles.

Martin
fonte
A solução para o exemplo, por mais impressionante que seja, não é tão complicada quanto pode parecer à primeira vista. Seu processo de pensamento, menos as coisas mais óbvias que ele pode ter tentado, provavelmente foi "Eu posso chegar ao 954 usando (100 + 6) * 9, o que posso fazer via (100 + 6) * 3 * 75/25. Eu tenho 50 restantes e 50/25 é dois, então eu posso tirar os 50 (100 + 6) * 3 * 75 antes de dividir por 25 ".
Tim Baixo
1

Um algoritmo não é realmente muito difícil.

Dados dois números aeb, podemos produzir os resultados a + b, abs (a - b) (não sei se números negativos são permitidos; nesse caso, podemos produzir a - b e a + b), a * b, e possivelmente a / b ou b / a se o resultado for um número inteiro. Portanto, os resultados possíveis são um conjunto de até cinco números. Chame esse conjunto de S (a, b).

Tome seis números a, b, c, d, e ef.

Para cada subconjunto de dois números, encontre os números que eles podem produzir.

Então, para cada subconjunto de três números, encontre os números que eles podem produzir: S (a, b, c) = S (S (a, b), c) união S (S (a, c), b) união S ( S (b, c), a).

O mesmo para cada subconjunto de 4 ou 5 números e, em seguida, para todos os 6 números.

gnasher729
fonte