Il NIM pensatore - parte 1/3
di scossa data: 18/07/2015 23:22:12
Att.ne: ho dovuto suddividere l'articolo in 3 parti, abbiate pazienza.
Parte 1 di 3
Nel post di presentzione abbiamo visto come creare un "analizzatore" della posizione sul tavolo: bisogna tradurla in binario ed eseguire la somma NIM dei valori (1 o 0) delle singole colonne:
Se il risultato sono 3 zeri la posizione è "sicura" e qualsiasi mossa la renderà "insicura"; viceversa, se il risultato presenta anche un solo 1 la posizione è "insicura" e può essere resa "sicura" con, almeno, una precisa mossa.
Ora però vogliamo creare un capolavoro: trasformare il nostro computer in un "essere pensante"
"Il NIM-pensatore"
capace di vincere implacabilmente se noi dovessimo sbagliare la nostra mossa o se, masochisticamente, cedessimo a lui il privilegio di eseguire la prima mossa!
Per semplificare la realizzazione del codice ho apportato una modifica al tavolo da gioco: la posizione dei bastoncini è allineata a sinistra
|||
||||
|||||
L'aspetto più interessante di questa versione "intelligente" è che, al contrario della vesione senza VBA, NON ho utilizzato nessun tipo di conversione in binario dei numeri rappresentanti i bastoncini presenti sul tavolo.
Quindi tutte quelle formule in F11...I13 (=--STRINGA.ESTRAI(DESTRA("000" & DECIMALE.BINARIO(MATR.SOMMA.PRODOTTO(--(stick1="|")));3);1;1)) ed in F14...I14 non servono al nostro "pensatore" per analizzare la posizione.
Infatti al nostro automa basta una semplice function per analizzare la posizione e stabilire se è "sicura" od "insicura"; una function talmente semplice da stare in una sola istruzione che utilizza un solo "magico" operatore.
Ma prima di scoprire qual'è, consentitemi di fare un breve riepilogo sugli "operatori logici di confronto".
Lato celle, Excel ci mette a disposizione due sole funzioni logiche di confronto tra due o più espressioni:
la funzione E (AND): restituisce VERO se tutti gli argomenti (le espressioni) hanno valore VERO;
la funzione O (OR): restituisce VERO se almeno un argomento è VERO.
Questa è la tavola della verità della funzione E():
E(VERO, FALSO) = FALSO
E(FALSO, VERO) = FALSO
E(FALSO, FALSO) = FALSO
E(VERO, VERO) = VERO
Questa è la tavola della verità della funzione O():
O(VERO, FALSO) = VERO
O(FALSO, VERO) = VERO
O(FALSO, FALSO) = FALSO
O(VERO, VERO) = VERO
Ricordo che in Excel, lato celle, solo il valore 0 è considerato FALSO, mentre qualsiasi valore diverso da 0 è considerato VERO:
E(2, 0) = FALSO
E(0, 5) = FALSO
E(0, 0) = FALSO
E(5, 2) = VERO
O(2, 0) = VERO
O(0, 5) = VERO
O(0, 0) = FALSO
O(5, 5) = VERO
In VBA, anziché le funzioni, abbiamo a disposizione degli operatori (come il +, il - etc) logici di confronto:
operatore And: il risultato dell'operazione di confronto è VERO solo se tutti gli operandi sono VERO;
operatore Or: il risultato dell'operazione di confronto è VERO se almeno un operando è VERO.
Questa è la tavola della verità dell'operatore And:
1 And 0 = 0
0 And 1 = 0
0 And 0 = 0
1 And 1 = 1
e questa quella dell'operatore Or
1 Or 0 = 1
0 Or 1 = 1
0 Or 0 = 0
1 Or 1 = 1
Normalmente siamo abituati a veder utilizzati questi operatori in istruzioni tipo:
if anni > 18 And sesso = "F" Then ingresso="gratis" Else ingresso = "100 €"
dove le istruzione del Then vengono eseguite solo se (anni è maggiore di 18) E (sesso è "F").
Oppure
if anni < 10 Or anni > 60 Then ingresso="gratis" Else ingresso = "100 €"
to be continued .......
| scossa's web site |
| Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |