La sorpresina

Il forum di Base5, dove è possibile postare problemi, quiz, indovinelli, rompicapo, enigmi e quant'altro riguardi la matematica ricreativa e oltre.

Moderatori: Gianfranco, Bruno

Rispondi
Pasquale
Livello 12
Livello 12
Messaggi: 2853
Iscritto il: mer mag 25, 2005 2:14 am

La sorpresina

Messaggio da Pasquale »

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.
_________________

$\text { }$ciao Immagine ciao
E' la somma che fa il totale (Totò)

Rispondi