' Programma lotto di kiara87
' il programma legge i dati (numeri estratti da un file.dat)
' e permette di vedere le estrazioni a video
' i numeri con distanza 30 sono evidenziati con colore rosso
' questi numeri vengono memorizzati e stampati
' Nota 1: sono d'accordo con Bplus e' molto piu'
' rapido lavorare con dati in RAM che con dati su Disco HDD/SSD/USB/CD/DVD
'nota 2: si e' scoperto che la distanza 30 e' aritmologica ossia
' in un sistema ciclico 1-90 per cui se si va oltre il limite si ritorna nel range 1-90
' invece di pensare i numeri su di una linea retta bisogna pensarli su una
' linea a cerchio per cui sottrarre o aggiungere equivale a spostarsi indietro
' o in avanti di un numero specificato di posizioni
'nota 3: lo scopo della ricerca delle coppie di numeri distanti 30 unita'
' e' quello di individuare la terzina simmetrica con passo 30 che e' interessata
' (ossia che con 2 numeri forma un ambo) per cercare gli AMBI ISOTOPI
' (ossia due coppie di numeri che nella griglia delle estrazioni mostrano
' la stessa posizione formando un quadrilatero)
'nota 4: la coppia di numeri di una terzina simmetrica puo' essere
' in orizzontale ( i numeri sono nella stessa ruota di estrazione)
' in verticale ( i numeri sono nella ' stessa posizione di estrazione tipo 1 estratto,
' 2 estratto...5 estratto)
' in diagonale (i numeri appartengono a ruota estrattiva e colonna estrattiva diverse)
'
' valori COSTANTI generali Vero e Falso
' le 11 ruote del lotto
CONST Bari
= 1, Cagliari
= 2, Firenze
= 3, Genova
= 4, Milano
= 5 CONST Napoli
= 6, Palermo
= 7, Roma
= 8, Torino
= 9, Venezia
= 10, Nazionale
= 11 CONST Cifra
= 2 ' ogni numero estratto e' una cifra di due caratteri (01-90)
DIM a
AS STRING ' una stringa per leggere i dati dal file
' salta al sottoprogramma LeggiFile delimitato
' dalla Label LeggiFIle e dal RETURN
' verifica che tutto il file sia letto
'FOR b = 1 TO LEN(a) - 116 STEP 116
' PRINT MID$(a, b, 116)
' ' PRINT INSTR(b, a, CHR$(13))
' _DELAY .1
'NEXT b
' il ciclo DO...LOOP UNTIL condizione e' un modo piu' moderno
' rispetto a Etichetta: .... IF condizione GOTO Etichetta
b = 1 ' flag che conta la posizione di lettura nel file per il riquadro sinistro
f = 1 ' flag che conta la posizione di lettura nel file per il riquadro destro
z$ = " " ' flag per l'output a schermo del programma
IF z$
<> "" THEN ' se non c'e' input non viene eseguito CLS ' questo risolve un glitch di output sullo schermo ' in alternativa alla riga sopra CLS nel sottoblocco
' MostraEstratti va stampata la stringa estratto e
' non il suo valore corrispondente ottenuto con VAL
GOSUB MostraRuote
' scrive il nome delle ruote del lotto GOSUB MostraEstratti
' scrive le estrazioni GOSUB cerca30
' evidenzia gli ambi isotopi nella estrazione di sinistra ' e se la terzina simmetrica e' incompleta segnala il numero mancante
' prende l'input dell'utente
LOOP UNTIL z$
= "Q" ' esegue questo ciclo fino a che si preme q per quit CLOSE #2 ' chiude il file che memorizza i distanti 30 per ogni estrazione esaminata a video
END ' indica la fine logica del programma
'-----------------------AREA sottoprogrammi /SUBroutines
' questa etichetta /label indica il punto di inizio
' del sottoprogramma (SUBroutine) LeggiFile scritto con vecchio stile GOSUB
' che usa una etichetta/label e un RETURN per riprendere da dove si era interotto
' nota1: un metodo ancora piu' antico e' il salto con GOTO
' che richiede una seconda etichetta per ritornare nel MAIN o programma principale
' nota2: un metodo migliore e' SUB nomeroutine....END SUB
' perche' permette la localizzazione delle variabili
LeggiFile:
'se non trova lotto.dat segnala l'errore a video e termina il programma
'<--------------------
' questo metodo e' piu' lento
' apre il file lotto.dat per leggere in maniera sequenziale i dati
'OPEN "lotto.dat" FOR INPUT AS #1
'LINE INPUT #1, a ' riempe la variabile a con una riga intera di valori
'<--------------------
' apre lotto.dat per leggerlo in maniera binaria
a
= SPACE$(LOF(1)) ' riempe la variabile a di spazi fino alla grandezza in byte del file apertoGET #1, , a
' legge con una unica operazione il file e lo pone nella variabile a CLOSE #1 ' chiude il file appena letto ' indica il termine della SUBroutine LeggiFile
' e RITORNA alla riga di codice successiva al salto GOSUB
'seconda SUBroutine /sottoprogramma
MostraRuote:
PRINT "+ avanti - indietro"
' indica il termine della SUBroutine MostraRuote
' e RITORNA alla riga di codice successiva al salto GOSUB
'terzo sottoprogramma o SUBroutine
MostraEstratti:
' le prime 4 cifre sembrano essere il numero della estrazione
y = 12 ' prima posizione per il carattere da stampare
FOR x
= 1 TO 5 STEP 1 ' questo ciclo FOR e' di 5 perche' ogni ruota ha 5 estrazioni A1 = "" ' resetto a1 per il prossimo giro
FOR V
= Bari
TO Nazionale
' per tutte le ruote 'posiziona il cursore
' scrive il numero estratto
PRINT (MID$(a
, (V
- 1) * 10 + 5 + ((x
- 1) * 2) + (b
- 1), Cifra
));
" ";
A1
= A1
+ (MID$(a
, (V
- 1) * 10 + 5 + ((x
- 1) * 2) + (b
- 1), Cifra
))' indica il termine della SUBroutine MostraEstratti
' e RITORNA alla riga di codice successiva al salto GOSUB
y = 60 ' prima posizione per il carattere da stampare
FOR x
= 1 TO 5 STEP 1 ' questo ciclo FOR e' di 5 perche' ogni ruota ha 5 estrazioni A1 = "" ' resetto a1 per il prossimo giro
FOR V
= Bari
TO Nazionale
' per tutte le ruote 'posiziona il cursore
' scrive il numero estratto
PRINT (MID$(a
, (V
- 1) * 10 + 5 + ((x
- 1) * 2) + (f
- 1), Cifra
));
" ";
A1
= A1
+ (MID$(a
, (V
- 1) * 10 + 5 + ((x
- 1) * 2) + (f
- 1), Cifra
))' indica il termine della SUBroutine MostraEstratti
' e RITORNA alla riga di codice successiva al salto GOSUB
' essendo la distanza30 orizzontale e la distanza30 verticale due condizioni
' particolari della distanza 30 diagonale allora bastera' calcolare questa ultima
' per calcolare anche le altre...questo trasforma la ricerca da 1 vs 1 con una
' specifica condizione (stessa riga o stessa colonna) in 1 vs 1 in cui il secondo
' appartiene al sottoinsieme ruota in esame (v) to nazionale e 1 to 5 estratti (x)
' quindi dopo aver mostrato le estrazioni va chiamata la subroutine per cercare
' un ambo con 2 numeri della terzina simmetrica con passo 30
cerca30:
' estraggo il numero dall'elenco
num
= VAL(MID$(a
, (v1
- 1) * 10 + 5 + ((x1
- 1) * 2) + (b
- 1), Cifra
)) ' calcolo il numero precedente e successivo al numero estratto
IF num
< 30 THEN prev
= num
- 30 + 90 ELSE prev
= num
- 30 IF num
> 60 THEN succ
= num
+ 30 - 90 ELSE succ
= num
+ 30 FOR v2
= v1
TO Nazionale
'per le restanti ruote num2
= VAL(MID$(a
, (v2
- 1) * 10 + 5 + ((x2
- 1) * 2) + (b
- 1), Cifra
))
AmboIsotopi:
'cerca nell'intervallo della coppia trovata
' i 2 numeri sono su 2 colonne diverse
' i 2 numeri sono su due righe diverse
' quindi i 2 numeri sono in diagonale
num3
= VAL(MID$(a
, (v1
- 1) * 10 + 5 + ((x2
- 1) * 2) + (b
- 1), Cifra
)) num4
= VAL(MID$(a
, (v2
- 1) * 10 + 5 + ((x1
- 1) * 2) + (b
- 1), Cifra
)) IF num3
< 30 THEN prev1
= num3
- 30 + 90 ELSE prev1
= num3
- 30 IF num3
> 60 THEN succ1
= num3
+ 30 - 90 ELSE succ1
= num3
+ 30 'se hanno distanza 30 abbiamo trovato un Ambo Isotopo
' v1 = v2 i 2 numeri sono sulla stessa riga
num3
= VAL(MID$(a
, (v3
- 1) * 10 + 5 + ((x1
- 1) * 2) + (b
- 1), Cifra
)) num4
= VAL(MID$(a
, (v3
- 1) * 10 + 5 + ((x2
- 1) * 2) + (b
- 1), Cifra
)) IF num3
< 30 THEN prev1
= num3
- 30 + 90 ELSE prev1
= num3
- 30 IF num3
> 60 THEN succ1
= num3
+ 30 - 90 ELSE succ1
= num3
+ 30 'se hanno distanza 30 abbiamo trovato un Ambo Isotopo
v3 = 0
' x1 = x2 i 2 numeri sono sulla stessa colonna
' i 2 numeri sono su diverse righe
num3
= VAL(MID$(a
, (v1
- 1) * 10 + 5 + ((x3
- 1) * 2) + (b
- 1), Cifra
)) num4
= VAL(MID$(a
, (v2
- 1) * 10 + 5 + ((x3
- 1) * 2) + (b
- 1), Cifra
)) IF num3
< 30 THEN prev1
= num3
- 30 + 90 ELSE prev1
= num3
- 30 IF num3
> 60 THEN succ1
= num3
+ 30 - 90 ELSE succ1
= num3
+ 30 'se hanno distanza 30 abbiamo trovato un Ambo Isotopo
x3 = 0
' i 2 numeri sono sulla stessa riga
' v1 = v2
' e' il caso impossibile perche' i due numeri coincidono con uno solo
AmboOk:
' evidenzia sulla tabella estrattiva di sinistra i numeri trovati e
' scrive al centro i numeri mancanti della terzina simmetrica
k = 11
'posiziona il cursore
LOCATE (v1
* 2) - 1, k
+ (x1
* 3) - 2 ' scrive il numero estratto
PRINT (MID$(a
, (v1
- 1) * 10 + 5 + ((x1
- 1) * 2) + (b
- 1), Cifra
));
'posiziona il cursore
LOCATE (v2
* 2) - 1, k
+ (x2
* 3) - 2 ' scrive il numero estratto
PRINT (MID$(a
, (v2
- 1) * 10 + 5 + ((x2
- 1) * 2) + (b
- 1), Cifra
));
'posiziona il cursore
LOCATE (v1
* 2) - 1, (x2
* 3) + k
- 2 ' scrive il numero estratto
PRINT (MID$(a
, (v1
- 1) * 10 + 5 + ((x2
- 1) * 2) + (b
- 1), Cifra
));
'posiziona il cursore
LOCATE (v2
* 2) - 1, (x1
* 3) - 2 + k
' scrive il numero estratto
PRINT (MID$(a
, (v2
- 1) * 10 + 5 + ((x1
- 1) * 2) + (b
- 1), Cifra
));
'v1 = v2
'posiziona il cursore
LOCATE (v3
* 2) - 1, (x1
* 3) - 2 + k
' scrive il numero estratto
PRINT (MID$(a
, (v3
- 1) * 10 + 5 + ((x1
- 1) * 2) + (b
- 1), Cifra
));
'posiziona il cursore
LOCATE (v3
* 2) - 1, (x2
* 3) - 2 + k
' scrive il numero estratto
PRINT (MID$(a
, (v3
- 1) * 10 + 5 + ((x2
- 1) * 2) + (b
- 1), Cifra
));
' x1 = x2
'posiziona il cursore
LOCATE (v3
* 2) - 1, ((x1
- 1) * 3) - 2 + k
' scrive il numero estratto
PRINT (MID$(a
, (v1
- 1) * 10 + 5 + ((x3
- 1) * 2) + (b
- 1), Cifra
));
'posiziona il cursore
LOCATE (v3
* 2) - 1, ((x2
- 1) * 3) - 2 + k
' scrive il numero estratto
PRINT (MID$(a
, (v2
- 1) * 10 + 5 + ((x3
- 1) * 2) + (b
- 1), Cifra
));
' v1 = v2 e' il caso impossibile