Programma Trova-anagrammi [esercizio di programmazione]

Tutto ciò che avete creato con GM, ma che non è a scopo ludico.
Rispondi
Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Programma Trova-anagrammi [esercizio di programmazione]

Messaggio da gameplay_extreme »

Programma Trova-anagrammi [esercizio di programmazione]

tempo fa, per esperimento, ho creato questo software. E' il grado di trovare gli anagrammi (purtroppo non tutti a causa di un difetto che non sono riuscito a fissare) di una parola qualunque.

per esempio inserendo "pane" ci compare come risultato "pena"

caratteristiche:
- miniguida incorporata (F1)
- ricerca parole nel vocabolario italiano
- è possibile (con molta pazienza immagino) creare un proprio vocabolario
- possibilità di scorrere i risultati della ricerca (qualora non ci stiano in un' unica schermata)
- possibilità di salvare i risulati su txt, in caso di txt già esistente puoi scegliere tra annulla, sovrascrivi, aggiungi in coda

se vi interessase vi lascio il link,
download: http://www.giochi3.altervista.org/trova_anagrammi.htm

buone nuove:
[9 mar 2014]
- diffetto descritto sopra risolto!
[21 mar 2014]
- il soft non trova più come anagramma se stesso (viene comunque segnalato se la parola cercata è presente nel vocabolario oppure no)
- ora viene seganalto anche il totale degli anagrammi trovati
- l'elenco viene numerato
[6 dic 2014]
- caricata nel web versione HTML5
Ultima modifica di gameplay_extreme il 03/04/2015, 12:50, modificato 4 volte in totale.
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Programma Trova-anagrammi [esercizio di programmazione]

Messaggio da Homunculus »

Ci dai qualche spiegazione in più sul suo funzionamento? Intendo proprio a livello di logica, potrebbe essere interessante

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Programma Trova-anagrammi [esercizio di programmazione]

Messaggio da gameplay_extreme »

Utilizzo:
- scegli un vocabolario
- attendi un poco
- scrivi una parola
- attendi un poco
- visioni i risultati (se non ci stanno puoi muoverti con le frecce)
- adesso puoi scegliere tra:
1) cercare gli anagrammi per un'altra parola
2) cambiare vocabolario
3) salvare i risultati su txt
4) uscire (fattibile anche dalla crocetta)

Logica di funzionamento:

questo programma è stato creato con GM8.0 lite

il vocabolario è un file txt con una parola per riga, le parole sono in ordine alfabetico, le definizioni sono assenti (sarebbe lo stesso archivio che ha usato Baron per il suo paroliere on-line)

quando il soft legge la lista di parole le carica su array bidimensionale (ora non mi ricordo bene, ma le parole sono molte e mi sembra di aver verificato che non ci stessero in un array monodimensionale).
Una volta che l'utente ha inserito una parola (get_string-->pa1) viene confrontata con tutti gli elementi dell'array (voc[k,gruppo]-->pa2) uno ad uno. Se la parola controllata supera il primo controllo, cioè se

Codice: Seleziona tutto

string_length(pa1) = string_length(pa2)
si passa la secondo controllo. in questo "secondo step" viene verificato se le 2 parole sono formate dalle stesse lettere
Spoiler

Codice: Seleziona tutto

// eseguire solo se length(pa1) = length(pa2)
var i,i2,lett,lett2,pa1,pa2,pa3;

//parole da confrontare
pa1 = argument0
pa2 = argument1

 // confrontiamo ognunna delle lettere di pa1 con ognuna delle lettere di pa2
 for (i=1; i<=string_length(pa1); i+=1)
 {
  lett = string_copy(pa1,i,1)
   for (i2=1; i2<=string_length(pa2); i2+=1)
   {
    lett2 = string_copy(pa2,i2,1)
    // quando troviamo due lettere uguali le sostituiamo, in entrambe le stringhe,
    // con degli asterisci
    if lett = lett2 
     {
      pa1 = string_delete(pa1,i,1)
      pa1 = string_insert("*",pa1,i)
      pa2 = string_delete(pa2,i2,1)
      pa2 = string_insert("*",pa2,i2)
     }
   }
 }
 
 // crea una terza stringa (pa3) tutta asterischi lunga quanto pa1 (e pa2)
 pa3 = ""
 for (i=1; i<=string_length(pa1); i+=1)
 {
  pa3 += "*" 
 }
 
 //se pa1 e uguale a pa3 (ovvero non è rimasta nessuna lettera)
 // vuol dire che pa1 è sicuramente l'anagramma di pa2
 if pa1 = pa3   return true
                else   return false
se anche questo controllo è superato la parola viene aggiunta all'array dei risultati (coorisp) che verrà poi visualizzato tramite draw_event.

Come già detto a volte non funziona bene es: "leonardo" non da come risultato "oleandro" sebbene siano anagrammi e la parola "oleandro" sia nel vocabolario...

ps: ho ricontrollato meglio e il codice colpevole sembrerebbe essere proprio quello che ho postato nello sploiler qui sopra, qualcuno può aiutarmi ?
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Programma Trova-anagrammi [esercizio di programmazione]

Messaggio da Homunculus »

Quello script mi sembra inutilmente complicato francamente... mi vengono in mente mille modi più semplici e efficienti (e probabilmente più semplici da debuggare). Esempio:

- Aggiungi tutti i caratteri (con string_char_at, non string_copy) di ogni parola da una ds_list, fai un sort, crei di nuovo due stringhe dai caratteri sortati e le confronti.
- Crei una ds_map. Per ogni carattere della parola p1, inserisci il carattere come chiavi e aumenta di 1 il suo valore (per ogni carattere hai quindi mappato il numero di presenze nella stringa). Per ogni carattere di p2, fai la stessa cosa nella stessa ds_map, diminuendo di 1 il valore. Alla fine de nella ds_map c'é un valore != 0 vuol dire che non é un anagramma. Sembra un po' macchinoso, ma é estremamente efficiente perché il tempo di confronto é lineare.

Altro consiglio: visto che passare in rassegna tutte le parole italiane e confrontare tutte le lettere di parole lunghe uguali é un processo estremamente lento, hai pensato a precalcolare gli anagrammi? In alternativa (ma questo magari l'hai già fatto) visto che usi un array2d, puoi suddividere le parole per lunghezza. Per esempio, parola[4,81] sarebbe l'ottantunesima parola di lunghezza 4. Qui dipende anche un po' dai limiti di gm8 con le dimensioni degli array però...

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Programma Trova-anagrammi [esercizio di programmazione]

Messaggio da gameplay_extreme »

in una parola mi stai dicendo di ottimizzare...cosa (mea culpa) che per il momento non ho previsto. Ad ogni modo se modifichero il software ottimizzandolo e/o aggiungendo qualcosa statene certi che sarete i primi a saperlo.

ps: va beh non sarà il sistema migliore, però sarei curioso di sapere cosa non va il quello script (con certi anagrammi funziona e con altri no), come dice la firma di sla "eppure mi sembra tutto giusto..." :lol:
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: Programma Trova-anagrammi [esercizio di programmazione]

Messaggio da BotaniciTraffici »

Ciao gameplay_extreme

Posso chiederti di sostituire nello script i nomi delle variabili con nomi più chiari che indichino con precisione la loro funzione?
Te lo chiedo perché penso di aver capito il problema, ma mi perdo nella lettura del codice. Mi fai questo piacere?

Codice: Seleziona tutto

// eseguire solo se length(pa1) = length(pa2)
var i,i2,lett,lett2,pa1,pa2,pa3;

//parole da confrontare
pa1 = argument0
pa2 = argument1

 // confrontiamo ognunna delle lettere di pa1 con ognuna delle lettere di pa2
 for (i=1; i<=string_length(pa1); i+=1)
 {
  lett = string_copy(pa1,i,1)
   for (i2=1; i2<=string_length(pa2); i2+=1)
   {
    lett2 = string_copy(pa2,i2,1)
    // quando troviamo due lettere uguali le sostituiamo, in entrambe le stringhe,
    // con degli asterisci
    if lett = lett2 
     {
      pa1 = string_delete(pa1,i,1)
      pa1 = string_insert("*",pa1,i)
      pa2 = string_delete(pa2,i2,1)
      pa2 = string_insert("*",pa2,i2)
     }
   }
 }
 
 // crea una terza stringa (pa3) tutta asterischi lunga quanto pa1 (e pa2)
 pa3 = ""
 for (i=1; i<=string_length(pa1); i+=1)
 {
  pa3 += "*" 
 }
 
 //se pa1 e uguale a pa3 (ovvero non è rimasta nessuna lettera)
 // vuol dire che pa1 è sicuramente l'anagramma di pa2
 if pa1 = pa3   return true
                else   return false

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Programma Trova-anagrammi [esercizio di programmazione]

Messaggio da gameplay_extreme »

questo script viene eseguito solo se la lungezza di pa1 e di pa2 sono uguali e restituisce vero in caso le 2 parole siano anagrammi (falso in caso contrario)

pa1 e pa2 = parole da confrontare
i e i2 = contatori per i 2 cicli for annidati
lett e let2 = lettere correntemente confrontate
pa3 = stringa lunga quanto pa1 (o pa2) contenente solo asterischi

è tutto...non mi pare di aver tralasciato nessuna variabile...
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: Programma Trova-anagrammi [esercizio di programmazione]

Messaggio da BotaniciTraffici »

Trovato l'errore ;) ed era proprio come immaginavo...

La parola leonardo (oleandro) contiene due "o", come sposa (passo) contiene due "s".

La parola leandro (ladrone) ha tutte lettere diverse, come spora (sopra).

leonardo e sposa non funzionano, leandro e spora sì. ;)

Praticamente leonardo ha 7 lettere confrontate correttamente su un totale di 8.

P.s. se accetti un consiglio, ti suggerisco di aggiungere dei puntatori che facciano partire la ricerca dalla riga del file dove iniziano parole della stessa lunghezza visto che il file ha i vocaboli ordinati per lunghezza. I tempi di ricerca diminuirebbero tantissimo.

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Programma Trova-anagrammi [esercizio di programmazione]

Messaggio da gameplay_extreme »

grazie mille Botanici, non ci avevo fatto caso. Ho risolto aggiungendo un break
Spoiler
if lett = lett2
{
pa1 = string_delete(pa1,i,1)
pa1 = string_insert("*",pa1,i)
pa2 = string_delete(pa2,i2,1)
pa2 = string_insert("*",pa2,i2)
break
}
ps: download aggiornato
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Programma Trova-anagrammi [esercizio di programmazione]

Messaggio da gameplay_extreme »

Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti