Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Google ha appena rinnovato la sua celebre serie A con il Pixel 10a, lo smartphone della serie più conveniente se consideriamo il rapporto tra costo e prestazioni. Con il chip Tensor G4, un design raffinato soprattutto sul retro e l'integrazione profonda di Gemini, il colosso di Mountain View promette un'esperienza premium a un prezzo accessibile. E il retro non ha nessuno scalino
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
Al MWC Qualcomm annuncia una coalizione industriale per lanciare il 6G entro il 2029 e introduce agenti IA per la gestione autonoma della RAN. Ericsson, presente sul palco, conferma la direzione: le reti del futuro saranno IA-native fin dalla progettazione
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air è un ultraleggero da 1 kg con Ryzen 5 6600H, display 14" 16:10 e 16 GB LPDDR5. Offre buona portabilità, autonomia discreta e costruzione in alluminio, ma storage PCIe 3.0 e RAM saldata limitano l'espandibilità. A 549 euro sfida brand più noti nella stessa fascia di mercato.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-05-2008, 23:12   #1
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
[Algoritmi & C++] Algoritmo Mastermind

Ciao a tutti!
Sto creando un semplice gioco del mastermind per tenermi in esercizio in vista dell'apertura della finestra d'esami.

Per i pochi che non conoscono questo gioco, consiste nell'indovinare un codice segreto: ad ogni turno, il giocatore compone un tentativo e l'altro (nel mio caso il computer) lo confronta con il codice segreto e compone un "feedback" composto dal numero di "cifre" (o pioli) corrette in posizione corretta e di cifre corrette ma in posizione errata.

Mentre la maggior parte degli algoritmi di cui ho avuto bisogno sono molto banali, quello per determinare le cifre corrette in posizione errata mi sta dando dei grattacapi.

Per iniziare, avevo adottato un algoritmo di questo tipo (sia N il numero richiesto):
Codice:
1. Crea un array delle singole occorrenze numeriche nel codice segreto
2. Scorri gli elementi di questo array
'-> Confronta ogni elemento con tutti gli elementi del codice segreto
     '-> se gli elementi sono uguali e la posizione diversa, incrementa N
Questo algoritmo ha un chiaro problema: mettiamo il caso che il nostro codice segreto sia 2 4 5 2 e il tentativo del giocatore 2 2 2 2.
L'algoritmo dirà che sono presenti 2 pioli corretti in posizione errata (i due 2 "centrali").
Ma questo non è corretto! Infatti i 2 che servono a comporre il codice sono soltanto... due! E sono quelli già correttamente posizionati ai bordi.
Dunque l'algoritmo dovrebbe restituire un N uguale a 0.

Ho allora perfezionato l'algoritmo calcolando, anzitutto, per ogni singola occorrenza numerica il numero di volte che appare nel codice segreto (sia OCC_NUM), e dunque calcolando il numero di volte in cui il piolo appare, nel codice, in posizione corretta (sia NUM_FOUND).

Il valore massimo che potrà assumere il nostro caro N è dunque (OCC_NUM - NUM_FOUND), che chiameremo MAX.

Il mio nuovo algoritmo funziona dunque così:
Codice:
1. Crea un array delle singole occorrenze numeriche nel codice segreto
2. Scorri gli elementi di questo array
|-> Calcola MAX per il valore corrente come spiegato sopra
'-> Confronta ogni elemento con tutti gli elementi del codice segreto
     '-> se gli elementi sono uguali e la posizione diversa, e inoltre
          N non è stato incrementato più di MAX volte per l'elemento 
          corrente, incrementa N
Purtroppo anche questo algoritmo, sebbene più affidabile, non funziona perfettamente in tutte le occasioni, e non riesco a capire se l'errore è concettuale o di implementazione.

Spero che qualcuno di voi mi sappia dare qualche dritta, in particolare sarei contento se qualcuno mi rassicurasse sulla correttezza dell'algoritmo per permettermi di concentrarmi solo sui dettagli dell'implementazione che potrebbe contenere degli errori: così lavoro "su due fronti" e mi trovo un po' in difficoltà.

Grazie a tutti per l'aiuto! =)
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
--Gerald Weinberg
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2008, 01:59   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Secondo me hai bisogno di ricordare anche le posizioni, metti il caso che la combinazione sia 2 4 5 2 e il tentativo sia 2 2 7 8, darebbe come risultato un piolo giusto e due mal posizionati, il che è evidentemente non corretto (ma il valore delle posizioni errate sarebbe ammissibile secondo il tuo algoritmo, perché non superiore a MAX).

Puoi quindi quindi usare magari un vettore che ricordi più di un dato (ad esempio due interi, il primo dei quali rappresenta il codice e il secondo la flag riconosciuto/non riconosciuto) e incrementare solo a seconda delle corrispondenze, o altrimenti inserire la combinazione in un dato come una lista e rimuovere prima gli elementi trovati nelle posizioni corrette, e contare tra gli elementi rimasti quelli contenuti nel tentativo (che, se presenti, avranno valori corretti con posizioni errate).

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2008, 12:01   #3
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Io propongo il seguente:
- Un primo ciclo per cercare le corrispondenze esatte, marcando con un valore impossibile ogni volta che trovo qualcosa.
- Un secondo ciclo per cercare le corripondenze nel posto sbagliato, marcando di nuovo ogni volta che trovo qualcosa.

ES:
2278 valore da indovinare
5286 valore proposto



Primo ciclo O(N), passo, trovo solo il 2 in seconda posizione come esatto.
Ogni volta che trovo qualcosa devo marcare. Ne risultera' quindi alla fine la seguente.

2X78
5Y86

Secondo ciclo O(N logN), passo, trovo solo un 8 in posizione ovviamente sbagliata. Ogni volta che trovo qualcosa devo marcare subito. Ne risultera' quindi alla fine la seguente

2X7X
5YY6

L'algoritmo e' distruttivo, quindi e' necessario fare una copia preventiva dei due vettori, e lavorare su di queste.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2008, 19:18   #4
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Secondo me hai bisogno di ricordare anche le posizioni, metti il caso che la combinazione sia 2 4 5 2 e il tentativo sia 2 2 7 8, darebbe come risultato un piolo giusto e due mal posizionati, il che è evidentemente non corretto (ma il valore delle posizioni errate sarebbe ammissibile secondo il tuo algoritmo, perché non superiore a MAX).

Puoi quindi quindi usare magari un vettore che ricordi più di un dato (ad esempio due interi, il primo dei quali rappresenta il codice e il secondo la flag riconosciuto/non riconosciuto) e incrementare solo a seconda delle corrispondenze, o altrimenti inserire la combinazione in un dato come una lista e rimuovere prima gli elementi trovati nelle posizioni corrette, e contare tra gli elementi rimasti quelli contenuti nel tentativo (che, se presenti, avranno valori corretti con posizioni errate).

ciao
Mh non credo perchè io MAX l'ho calcolato come (OCC_NUM - NUM_FOUND) dove OCC_NUM era il numero di occorrenze (nel nostro caso 2) mentre NUM_FOUND il numero di volte che il piolo è già trovato in posizione corretta (quindi nel nostro caso 1).
Dunque MAX sarebbe 1 e, per il caso che porti, l'algoritmo funzionerebbe
Però sono abbastanza sicuro che ci siano casi per cui questo non vale... mi armo di carta e penna e cerco di trovarne qualcuno

Eventualmente opterò per la soluzione di Gugo che mi sembra sicuramente funzionante... anche se mi rimarrà "in canna" il mio algoritmo fallimentare
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
--Gerald Weinberg

Ultima modifica di Albi89 : 16-05-2008 alle 19:21.
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2008, 19:50   #5
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2787
Quote:
Codice:
1. Crea un array delle singole occorrenze numeriche nel codice segreto
2. Scorri gli elementi di questo array
|-> Calcola MAX per il valore corrente come spiegato sopra
'-> Confronta ogni elemento con tutti gli elementi del codice segreto
     '-> se gli elementi sono uguali e la posizione diversa, e inoltre
          N non è stato incrementato più di MAX volte per l'elemento 
          corrente, incrementa N
Premetto che potrei non aver compreso bene l'algoritmo, o meglio il modo in cui l'hai implementato, detto questo provo a darti una mano.
Secondo me l'algoritmo non funziona bene per quella che è la natura di N e quella che è la natura di MAX, mi spiego: N è condiviso tra tutti i numeri che compongono il codice mentre MAX è calcolato in base al numero su cui sei posizionato, questo comporta degli errori, ti faccio un esempio che mi è venuto in mente
CODICE: 1133
TENTATIVO: 3311
ora i primi due 3 faranno incrementare N a 2, quando andrò a controllare gli ultimi 2 "1" MAX varrà 2 ma essendo N=2 questo non verrà più incrementato...
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2008, 20:09   #6
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Albi89 Guarda i messaggi
Mh non credo perchè io MAX l'ho calcolato come (OCC_NUM - NUM_FOUND) dove OCC_NUM era il numero di occorrenze (nel nostro caso 2) mentre NUM_FOUND il numero di volte che il piolo è già trovato in posizione corretta (quindi nel nostro caso 1).
Dunque MAX sarebbe 1 e, per il caso che porti, l'algoritmo funzionerebbe
Hai ragione in effetti. Ma guarda che ora era, non avevo certo la lucidità necessaria per fare due sottrazioni.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 17-05-2008, 00:22   #7
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Premetto che potrei non aver compreso bene l'algoritmo, o meglio il modo in cui l'hai implementato, detto questo provo a darti una mano.
Secondo me l'algoritmo non funziona bene per quella che è la natura di N e quella che è la natura di MAX, mi spiego: N è condiviso tra tutti i numeri che compongono il codice mentre MAX è calcolato in base al numero su cui sei posizionato, questo comporta degli errori, ti faccio un esempio che mi è venuto in mente
CODICE: 1133
TENTATIVO: 3311
ora i primi due 3 faranno incrementare N a 2, quando andrò a controllare gli ultimi 2 "1" MAX varrà 2 ma essendo N=2 questo non verrà più incrementato...
Grazie per avermi illuminato
L'errore non era proprio questo, e in realtà temo che non sapremo mai quale fosse... semplicemente il metodo deputato al calcolo di N era stato scritto in serata "non ispirata"... righe e righe di codice convulso e incomprensibile...
L'ho appena riscritto ed in 3 righe, pratiche pratiche, fa quello che dovrebbe fare: finalmente il gioco fa il suo

Per ora sto usando una classe console_game per testare il gioco, il prossimo obiettivo è realizzare la parte grafica!
Grazie a tutti per i drittoni, è una sera felice
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
--Gerald Weinberg
Albi89 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso CHUWI CoreBook Air alla prova: design premium, b...
Roborock Saros 20: il robot preciso e molto sottile Roborock Saros 20: il robot preciso e molto sott...
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm ASUS ROG Kithara: quando HIFIMAN incontra il gam...
Rocket Lab ha posticipato il lancio del ...
Dalla missione Artemis IV il razzo spazi...
Una delle sonde europee di ESA Proba-3 h...
Un modder fa girare Linux su PS5: GTA V ...
MacBook Neo: nessuna sorpresa nei primi ...
La serie POCO X8 Pro è pronta al ...
Smartphone: 2026 difficile per il mercat...
Star Wars: Knights of the Old Republic R...
Huang, NVIDIA: OpenClaw ha realizzato in...
Annunciano il recupero di 4,8 milioni di...
Oggi degli ottimi auricolari Sony con ca...
Muffa in casa? Questo deumidificatore da...
Sonos Era 100: il punto d'ingresso per u...
"Non stiamo sostituendo nessuno con...
Tutti i robot in offerta ora: prezzi bas...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:10.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v