#include <stdio.h>
#define NCIFRE 5
#define TRUE 1
#define FALSE 0
int main() {
int strike,ball,i,j,tentativo;
int codice[NCIFRE] = {1, 3, 7, 3, 2}; // codice da indovinare
int cifra[NCIFRE] = { 0 }; // cifre del tentativo corrente
int usata[NCIFRE] = { 0 }; // serve a ricordare se una cifra del codice è stata già usata (in genere)
int usata_s[NCIFRE] = { 0 }; // serve a ricordare se una cifra del tentativo è stata già usata per uno strike
do {
// re-inizializzazione di strike, ball e usata
strike=0;
ball=0;
for (i=0 ; i<NCIFRE ; i++) {
usata[i] = FALSE;
usata_s[i] = FALSE;
}
// leggo il tentativo
scanf("%d",&tentativo);
// estraggo le cifre dal tentativo a partire dalle unità
for (i=NCIFRE-1 ; i>=0 ; i--) {
cifra[i] = tentativo % 10; // la cifra è resto della divisione per 10
tentativo /= 10; // divisione intera di tentativo per 10
}
// conto gli strike
for (i=0 ; i<NCIFRE ; i++)
if (cifra[i] == codice[i]) {
strike++;
usata[i] = TRUE; // marco la cifra del codice come usata
usata_s[i] = TRUE; // marco la cifra del tentativo come usata per uno strike
}
// conto i balls
for (i=0 ; i<NCIFRE ; i++) // ciclo sulle cifre del tentativo non usate
if (!usata_s[i])
for (j=0 ; j<NCIFRE ; j++) // ciclo sulle cifre del codice non usate
if (cifra[i] == codice[j] && !usata[j]) {
ball++;
usata[j] = TRUE; // marco la cifra del codice come usata
// esco dal ciclo che conta i ball
// e passo alla prossima cifra del tentativo
break;
}
// stampo il risultato
printf("%d %d\n",strike,ball);
} while (strike != NCIFRE);
return 0;
}
-- AndreaSterbini - 17 Oct 2003
Mi segnala DaniloRossi che anche la versione 2 del programma soffre di un leggero bug.
Se una delle cifre del codice appare nel tentativo sia come strike che come ball questa versione la conta due volte.
Dobbiamo:
![]() |
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica |
|