| Code trick | #1



Ruzzle ) 

 Benvenuti amici!

Oggi ringraziamo Glak per lo spunto , direttamente dalla community un problema di ottimizzazione ed efficienza quindi cercheremo di spingerci oltre il limite 😂 

Questa volta però avrò bisogno del vostro aiuto! 💪

Partiamo subito con una breve spiegazione , sicuramente tutti conoscerete il gioco Ruzzle, anche se adesso è andato un po' nel dimenticatoio, nel quale due concorrenti (oppure da soli) si sfidano nella ricerca di più parole possibili all'interno di una scacchiera di lettere casuali. Concatenando le lettere una dopo l'altra ,potendole utilizzare una sola volta,  le parole realizzate assegnano un punteggio in base alla lunghezza , al valore della lettera e ad alcuni bonus. 

Adesso vi chiedo , quante parole si possono realizzare con ogni composizione ? Sicuramente tante anche se molte di meno del prossimo caso visto che nel gioco originale non si possono fare salti ma la sequenza deve essere realizzata senza alzare il dito e quindi potendo utilizzare solo le lettere adiacenti.

Il nostro amico Glak invece ha voluto dare la possibilità di cliccare le lettere e quindi espandere le possibili combinazioni, quante combinazioni sono possibili? Ho smesso di contarle 😂 ma se qualcuno volesse fare il calcolo delle possibili combinazioni partendo da parole di 2 lettere fino a 16 può scrivere il risultato nei commenti. Naturalmente senza togliere le combinazioni che forniscono parole di senso non compiuto per facilitare il compito. 😅

Colgo anche l'occasione per ricordarvi che potete seguirmi e interagire anche sulla pagina Facebook e su Instagram ,se vi fa piacere, cercando Raffaele Gold. Grazie.

Adesso passiamo al bello.

Immaginiamo questo giochino simile a Ruzzle e la scacchiera con lettere casuali, immaginiamo anche di avere un database con tante parole , diciamo 300mila, che usiamo per verificare se le parole create sono valide. A fine gioco , molto interessante, sarebbe avere una lista con tutte le parole possibili così da controllare quelle più lunghe, le più difficili o più strane 😂 

Finalmente arriviamo al codice. 


 

Global dizionario è la mega lista con tutte le parole , global lista estratti sono le lettere che formano la scacchiera che poi finiranno nella lista global estratti per poterla manipolare meglio senza modificare l' originale. Dopo la verifica le parole che effettivamente si possono comporre con le lettere estratte verranno salvate nella lista parole trovate ( che originalità 😂). La prima idea prevedeva un ciclo per prelevare ogni singola parola ( item ) dal database e, dopo aver copiato la lista estratti, passare la parola ad un altro ciclo che controlla se ogni lettera di questa parola è presente tra quelle estratte. Se è presente viene eliminata dalla lista per evitare di utilizzarla nuovamente mentre alla fine del ciclo se la lunghezza della lista estratti è proprio pari al valere della lista originale meno la lunghezza della parola cercata allora è stata trovate la parola esatta che sarà salvata in parole trovate. Bene e allora cosa vuoi? Mi starete chiedendo ! Questo codice per effettuare questa verifica ha impiegato la bellezza di 12 minuti 😱 Improponibile!

Visti i tempi ho dovuto ragionare sulla situazione e rimodulare il codice, dovevo togliere parti inutili, quindi azioni inutili, e mi è venuto in mente di controllare le parole solo fino a quando le lettere che la compongono sono tra quelle estratte. 

Quindi al primo errore fuori 👉 Non ci sono seconde possibilità in questo mondo 😂 


A questo punto la palla passa in mano al while che mi permette di saltare il codice nel momento in cui la condizione non è più verificata. Come sempre andiamo a prelevare le parole dal dizionario e le passiamo al while che verifica la presenza delle varie lettere della parola tra quelle estratte. Se le lettere sono presenti le elimino dalla lista e aumento di 1 index che così mi permette di scorrere tutte le lettere ma proprio tutte anche quelle che non ci sono , quindi ho dovuto impostare un limite massimo per index in modo da introdurre un valore estraneo ( #@#@) per poter uscire dal while nel momento opportuno. In questo caso se il valore di global index è proprio uguale alla lunghezza della parola +1 allora aggiungo alla lista parole trovate il mio item. Ho trovato una parola ammissibile.

Questo nuovo codice impiega circa 2 minuti con un guadagno notevole in termini di tempo, naturalmente in base alla scacchiera e le possibili parole il tempo può variare e anche notevolmente. 

Adesso tocca a voi 👉👥  Si può ancora ottimizzare per diminuire i tempi? Naturalmente l'opzione creare dei quadri preimpostati e quindi segnare con calma tutte le possibilità è un'opzione non accettabile 😁 

Ricapitolando non stiamo cercando un metodo alternativo ma solo un algoritmo più efficiente e veloce. Esiste? 
Aspetto il vostro aiuto 

    Raffaele

Commenti

Ciao, spero ti piaccia il blog. Se ti fa piacere qui puoi offrirmi un caffè!

Post popolari in questo blog

GOOGLE SCRIPT & KODULAR READ, WRITE, UPDATE, DELETE

Tu lo conosci THUNKABLE?