Newsgroup: it.comp.lang.visual-basic
Titolo: un valore per n casi

Ho una tabella di 7 colonne per 3 righe, su ogni cella si devono inserire a 
scelta dell'utente le lettere A, B, C, D, E
Dopo l'inserimento di questi valori nelle 21 caselle dovrei creare un valore 
numerico che mi rappresenta la tabella immessa. Ovviamente il valore deve 
essere univoco, ovvero a quel numero corrisponde una sola sistemazione delle 
lettere sulle 21 caselle.
Avete una soluzione geniale ?
...altrimenti devo usare una sfilza di Case 


hash della tabella

 ha scritto nel messaggio 
news:4b61ffcc$0$694$5fc...@news.tiscali.it...

Altro che sfilza! Le possibili permutazioni di 21 elementi sono 21! 
(fattoriale) ï¿½5*10^19 (se poi le lettere si possono anche ripetere, si 
arriva a 21^21ï¿½6*10^27)
Chiaramente questi numeri non sono rappresentabili nemmeno con un intero a 
64 bit, figurati se si riesce a fare un programma con oltre 50 miliardi di 
miliardi di case.
Quindi devi cambiare strada.
In particolare, come mai ti serve associare un numero?
Butto lï¿½ una mia ipotesi: devi estrarre a sorte una delle possibili tabelle 
e volevi un metodo rapido per ricavarla al volo da un numero "secco", 
giusto?
Bye
Raf 


Non devo estrarre a sorte nessun numero o altro.
Anzich� salvare i singoli valori delle 21 caselle volevo un solo valore 
numerico che mi rappresentasse l'insieme dei 21 valori inseriti.
Il perch� voglio avere un solo valore anzich� 21 separati � meglio 
tralasciarlo altrimenti andiamo fuori "tema".

 ha scritto nel messaggio 
news:c5e94fe4-6582-49f6...@m16g2000yqc.googlegroups.com...

http://www.di.unipi.it/didadoc/labII/Dispense/parte3/node7.html
ma vuoi farmi andare via di testa ?????
per caso, ma proprio per caso, non � che ci sia la funzione in VB6?
a perte gli scherzi cerchero' di capire la procedura di "raccolta valori" 
con questo modo hash


Ok.
Ti ï¿½ stato suggerito il metodo hash, ma chiedevi che il numero fosse univoco 
e quel metodo (in teoria) non garantisce unicitï¿½ dei valori.
Piï¿½ che altro non ï¿½ possibile ricostruire i 21 valori della tabella a 
ritroso partendo dall'hash.
Perchï¿½ non puoi usare una stringa alfanumerica (ad es. quella corrispondente 
alle 21 celle della tabella) invece di un numero?
 


infatti era l'ipotesi piu' facile da farsi ma meno "bella" come risultato, 
vuoi mettere un numero unico !!!
Comunque a questo punto o riduco (se riesco) le celle oppure usero' la 
stringa come risultato totale.
un grazie a tutti. 


infatti era l'ipotesi piu' facile da farsi ma meno "bella" come risultato, 


 ha scritto nel messaggio 
news:4b61ffcc$0$694$5fc...@news.tiscali.it...

Hai 21 celle che accoglieranno A, B, C, D, E, spazio.
A, B, C, D, E possono ripetersi solo 1 volta, spazio al massimo 16 volte.
Le permutazioni con ripetizione di questi 21 elementi sono 21!/16!, cio� 
2.441.880.
Il numero complessivo � trattabilissimo, ma meno facile � inventare un 
algoritmo di trasformazione dalla stringa al numero e viceversa che non 
lasci buchi intermedi e, quindi, rimanga in quel limite numerico.
La via di crearti una array con 2.441.880 records contenenti tutte le 
stringhe � del tutto improponibile, visti i tempi richiesti dallo 
scorrimento dell'intero array per le ricerche da effettuare.
Via alternativa potrebbe essere quella di usare due numeri per la codifica.
Un primo numero, esadecimale di 6 cifre, che indichi il numero di spazi tra 
le 5 lettere, del tipo:
234160 significherebbe
2 spazi prima della 1^ lettera
3 spazi poi la 2^ lettera
4 spazi poi la 3^ lettera
1 spazio poi la 4^ lettera
6 spazi poi la 5^ lettera
0 dopo la 5^ e ultima lettera
Questo numero potrebbe al massimo essere pari a F00000
Un secondo numero che, associando le 5 lettere alle cifre 0, 1, 2, 3, 4, ne 
indichi la sequenza. Raggiungerebbe il massimo di 43210.
Codifica e decodifica sarebbero agevoli e non richiederebbero array da 
scorrere, ma solo due subroutines che si occupino di farlo.
Potrebbe essere una ipotesi non malvagia...
Ciao,
E.


Grazie per la soluzione che mi hai segnalato.
Sono riuscito a ridurre le caselle a solo 5 con obbligo di inserire una 
lettera  a scelta tra A, B, C, D, E
quindi potrei usare un numero a 5 cifre che mi indichi il riferimento alla 
lettera:
11111 = AAAAA
12453 = ABDEC
e non potr� essere superiore a 55555 ne inferiore a 11111.

 e non potrï¿½ essere superiore a 55555 ne inferiore a 11111.
Ahhhhhhh... non avevo mica capito un ca**o!
Pensavo fossero possibili tutte e 21 le lettere dell'alfabeto, non solo 
ABCDE, allora il nr. di combinazioni ï¿½ MOOOOLTO piï¿½ basso del numero che 
avevo calcolato.
Riducendo poi le caselle a 5 i casi possibili sono solo 5^5=3125.
Per associarle un numero univocamente basta interpretare ogni configurazione 
come un numero in base 5, associando ad ogni lettera una cifra tra 0 e 4.
Es: BACCE = "10224" = 1*5^4 + 0*5^3 + 2*5^2 + 2*5^1 + 4 = 625+50+10+4 = 689.
Cosï¿½ avresti sempre tutti i numeri compresi tra 0 e 3124.
HTH
Ciao
Raf
 


Era proprio questa la soluzione che volevo, OTTIMO !!!!
Grazie anche per avermi spiegato anche la procedura, e visto che i possibili 
casi sono rappresentati da un numero piccolo (circa 3000) allora vado meglio 
cos� aggiungo ancora 1 o 2 caselle.
E qui la domanda con 7 caselle e sempre le sole opzioni A, B, C, D, E le 
combinazioni sono 7^5 oppure 5^7 ?
(..era cos� bella la matematica a scuola, le mega espressioni, i sistemi, i 
diagrami, funzioni,  e passati vent'anni mi sono gi� dimenticato tutto, E' 
UN VERO PECCATO...)

 E' UN VERO PECCATO...)
Sono 5*5*5*5*5*5*5 = 5^7.
In generale la formula ï¿½
    <numero simboli (base)> ^ <numero di "caselle" (cifre)>.
Tanto per citare una sua applicazione che conosci senz'altro: con 8 bit (8 
cifre in base 2) puoi rappresentare 2^8=256 numeri...
Ciao
Raf