Ecco la sorpresa che si trovava negli ovini di Pasqua:
si tratta di un programmino che ho realizzato per farvi divertire (ammesso che possiate), che prova a generare una parola da voi stabilita, pescando le lettere che la compongono da un bussolotto.
La parola o un nome in lingua italiana, può avere una lunghezza anche di 6 lettere (non ne ho provato di più lunghi):
ogni diversa parola ha diversa probabilità di venir fuori, a parità di lunghezza, e naturalmente una parola più lunga ha minori probabilità di sortita.
L'input è la parola da voi stabilita e l'output consiste in una riga di dati, ogni volta che la parola viene composta, comprendenti: quantità di sortite, la parola stessa, il numero di lettere estratte, la probabilità di sortita della parola, espressa in percentuale.
Ogni volta viene estratta una lettera dal bussolotto e messa in coda a quelle precedentemente estratte (ogni lettera estratta viene ributtata nel bussolotto) e quindi la parola scelta si intende sortita non appena viene aggiunta l'ultima lettera che manca alle precedenti, purché tutte consecutive.
Poniamo che si scelga "remare" e che venga sortita: se subito dopo vengono sortite "m,a,r,e" ottengo nuovamente "remare"; quindi questa parola ha maggiori probabilità di un'altra che non ha questa particolarità.
La parola può essere immessa con lettere minuscole, maiuscole, o miste.
Il bussolotto è composto dalle 21 lettere dell'alfabeto italiano, inserite in misura diversa, in base ad un conteggio effettuato su un testo di argomento generico.
Il programma gira in Decimal Basic e potete divertirvi a modificarlo, cambiando ad esempio la grandezza e la composizione del bussolotto, o traducendolo in altro linguaggio più veloce, compilato e non interpretato, o rifacendolo ex novo, secondo criteri diversi, per migliorare i risultati (tempi di elaborazione, lunghezza delle parole ammesse, etc.)
Segue il programma, con gli auguri di buona Pasqua (ci sentiamo più in là):
'Stabilisci le quantità di A,B,C,D……. e metti le lettere nel bussolotto a$
DATA 286,14,90,95,301,33,54,13,309,144,75,193,216,64,8,153,112,205,66,28,66
DIM a(21)
FOR m=1 TO 21
READ a(m)
NEXT M
DATA "A","B","C","D","E","F","G","H","I","L","M","N","O","P","Q","R","S","T","U","V","Z"
DIM d$(21)
FOR m=1 TO 21
READ d$(m)
NEXT M
DIM a$(2525)
FOR m=1 TO 21
FOR n=1 TO a(m)
LET cont=cont+1
LET a$(cont)=d$(m)
NEXT N
NEXT M
'dai una "smucinata" al bussolotto, per evitare che le lettere siano disposte tutte in fila, e componi il bussolotto di lavoro z$
DIM z$(2525)
RANDOMIZE
LET cont=0
DO
LET x=1+INT(RND*2525)
IF a$(x) "*" THEN
LET cont=cont+1
LET z$(cont)=a$(x)
LET a$(x)="*"
END IF
LOOP UNTIL cont=2525
'inizio del gioco (il bussolotto non verrà più agitato per ridurre i tempi di elaborazione)
INPUT PROMPT "inserisci la parola casuale -> ": b$
PRINT
LET b$=UCASE$(b$)
LET lu=LEN(b$)
'c$ è la stringa sequenziale nella quale si spera che si formi la parola scelta: ogni nuova lettera viene messa
'in coda ed in c$ resta una sequenza di lettere lunga quanto la parola scelta e con la quale viene confrontata
LET c$=REPEAT$("*",lu)
LET cont=0
FOR m=1 TO 10^14
LET x=1+INT(RND*2525)
LET x$=z$(x)
LET c$=right$(c$,lu-1)&x$
!PRINT C$
IF c$=b$ THEN
LET cont=cont+1
LET perc=INT(10^10*(cont*100/m))/10^10
PRINT cont;b$;m;perc;"%"
END IF
next M
END
Se nel programma si toglie il punto esclamativo dalla riga "PRINT C$", sarà possibile vedere tutte le stringhe che vengono composte in c$ ad ogni lettera estratta.
Se fai copia e poi incolli nell'editor di Decimal Basic, controlla che in coda ci sia un solo comando END, altrimenti dà errore.
La sorpresina
Moderatori: Gianfranco, Bruno
Questo forum è una sezione del PORTALE DI BASE CINQUE
La sorpresina
_________________
$\text { }$ciao ciao
E' la somma che fa il totale (Totò)
$\text { }$ciao ciao
E' la somma che fa il totale (Totò)