Nome del problema rotondo dei numeri di conto alla rovescia - e soluzioni algoritmiche?


10

Per i non britannici nel pubblico, c'è un segmento di uno spettacolo di gioco durante il giorno in cui i concorrenti hanno un set di 6 numeri e un numero target generato casualmente. Devono raggiungere il numero target usando uno (ma non necessariamente tutti) i 6 numeri usando solo operatori aritmetici. Tutti i calcoli devono comportare numeri interi positivi.

Un esempio: Youtube: Countdown - Il gioco di numeri più straordinario di sempre?

Una descrizione dettagliata è fornita su Wikipedia: Countdown (Game Show)

Per esempio:

  • Il contendente seleziona 6 numeri: due grandi (le possibilità includono 25, 50, 75, 100) e quattro piccole (numeri 1 .. 10, ciascuna inclusa due volte nel pool).
  • I numeri raccolti sono 75, 50, 2, 3, 8, 7sono indicati con un numero di destinazione di 812.
  • Un tentativo è (75 + 50 - 8) * 7 - (3 * 2) = 813 (totalizza 7 punti per una soluzione entro 5 dal bersaglio)
  • Una risposta esatta sarebbe (50 + 8) * 7 * 2 = 812 (questo avrebbe segnato 10 punti esattamente corrispondenti al bersaglio).

Ovviamente questo problema è esistito prima dell'avvento della TV, ma l'articolo di Wikipedia non gli dà un nome. Ho anche visto questo gioco in una scuola elementare a cui ho partecipato, dove il gioco si chiamava "Crypto" come una competizione interclassista, ma la ricerca ora non rivela nulla.

Ci ho preso parte alcune volte e mio padre ha scritto un foglio di calcolo Excel che ha tentato di forzare il problema, non ricordo come ha funzionato (solo che non ha funzionato, con il limite di 65535 righe di Excel), ma sicuramente ci deve essere una soluzione algoritmica per il problema. Forse c'è una soluzione che funziona come fa la cognizione umana (ad esempio in parallelo per trovare i numeri "abbastanza vicini", quindi prendere i candidati ed eseguire operazioni "più piccole").


1
L'ho risolto graficamente - usa i nodi per rappresentare i risultati di calcoli e bordi per rappresentare le operazioni che possono essere fatte su quei numeri, quindi usa un algoritmo di ricerca del grafico per trovare il percorso desiderato
ell

1
Da una lettura delle regole, sembrerebbe che non sia possibile raggiungere una soluzione perfetta, ad esempio se i numeri selezionati sono (1, 1, 2, 2, 3, 3) e il numero obiettivo è 999. Quindi davvero l'obiettivo di qualsiasi algoritmo sarebbe trovare la soluzione più vicina possibile.
Rich Smith,

1
@ell: La tua soluzione di ricerca grafica è fondamentalmente una ricerca di forza bruta?
Martin,

Ho appena usato una prima ricerca approfondita nella mia implementazione, ma non vedo perché qualcosa come Dijkstra non possa essere usato.
ell

1
Abbiamo alcuni spettacoli simili negli Stati Uniti: restiamo circa 6 idioti sub-letterati in una casa per diverse settimane e li filmiamo parlando l'uno dell'altro e urlando a vicenda. Questo è quasi quanto la nostra TV arriva a qualcosa di così intellettuale in programmi popolari.
RBarryYoung,

Risposte:


4

Disclaimer: questa risposta non risponde completamente alla domanda. Ma è troppo lungo per un commento.

NP-hard? Credo che questo problema potrebbe essere NP-difficile .

Considera un caso speciale del problema dello zaino :

Dato un insieme di numeri interi positivi e un numero intero positivo b , esiste un sottoinsieme dell'insieme in modo tale che la somma di tutti i numeri interi in quel sottoinsieme sia uguale a b ?

Questo suona in qualche modo simile al nostro problema con il conto alla rovescia e sembra essere molto più semplice. Tuttavia, Zaino (e questo caso speciale di Zaino) è NP-difficile (e NP-completo, ovviamente).

Non sono riuscito a usarlo per provare che Countdown è NP-difficile. Non riuscivo a liberarmi della divisione. Considera che ne abbiamo mille 2 e b = 7. Questo non sarà mai risolvibile con Zaino, ma sempre (?) Con Conto alla rovescia, almeno in tutti i modi in cui ho provato a trasferire il problema.

Ora, se Countdown fosse davvero NP-difficile, potremmo dedurre che lì con probabilità molto elevata non esiste un algoritmo che sia significativamente più efficiente della forza bruta che prova tutte le possibilità. (E se dovessimo trovare un tale algoritmo, diventeremo molto famosi.)

No, non credo che ci debba essere un algoritmo efficiente.

Euristico. Il video di Youtube collegato alla domanda ha un buon esempio: il concorrente ha trovato una risposta esatta 952 = ((100 + 6) * 3 * 75 - 50) / 25. Questo è completamente contro la mia intuizione, non avrei mai provato che per la prima volta: produci un numero molto grande, quindi dividilo e produci il risultato.

Dall'altro, noi umani sentiamo di non aver bisogno di provare (esempio arbitrario) 50 * 75 * 100/2/3/7 per raggiungere un numero di tre cifre. Ma i computer non sentono nulla, calcolano semplicemente.

Dopotutto, se abbiamo implementato alcune euristiche e questa euristica non trova una soluzione esatta, dovremo comunque provare tutte le altre soluzioni per assicurarci che non ce ne sia davvero.

Ciò che il concorrente nel video di Youtube fa è, penso, controllare molto rapidamente un gran numero di possibilità e scartare rapidamente quelle che non (o probabilmente non forniranno) una soluzione.

Conclusione. Quando si implementa un algoritmo, si potrebbe fare attenzione a eliminare calcoli uguali come a / b / c = a / (b * c), ma penso che questo sia abbastanza difficile da fare e non so se questo migliora significativamente il tempo di esecuzione.

I computer ovviamente sono più veloci degli umani nel controllare un gran numero di possibilità. E al giorno d'oggi, anche gli smartphone sono così veloci che riescono a risolvere questo problema, penso, in un secondo semplicemente provando tutte le possibilità. (Non l'ho provato.) Ci sono solo sei numeri, sarebbe diverso se ce ne fossero ad esempio 60.


La soluzione dell'esempio, per quanto estremamente impressionante, non è così complicata come potrebbe sembrare. Il suo processo di pensiero, meno cose più ovvie che potrebbe aver provato, è probabilmente stato "Posso arrivare a 954 usando (100 + 6) * 9, che posso fare tramite (100 + 6) * 3 * 75/25. Ho un 50 a sinistra e 50/25 sono due, quindi posso togliere 50 (100 + 6) * 3 * 75 prima di dividere per 25 ".
Tim Down

1

Un algoritmo non è in realtà molto difficile.

Dati due numeri a e b, possiamo produrre i risultati a + b, abs (a - b) (non so se sono consentiti numeri negativi, nel qual caso possiamo produrre a - b e a + b), a * b, e possibilmente a / b o b / a se il risultato è un numero intero. Quindi i possibili risultati sono un insieme di un massimo di cinque numeri. Chiama questo set S (a, b).

Prendi sei numeri a, b, c, d, e e f.

Per ogni sottoinsieme di due numeri, trova i numeri che possono produrre.

Quindi, per ogni sottoinsieme di tre numeri, trova i numeri che possono produrre: S (a, b, c) = S (S (a, b), c) unione S (S (a, c), b) unione S ( S (b, c), a).

Quindi lo stesso per ogni sottoinsieme di 4 o 5 numeri, quindi per tutti e 6 i numeri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.