Newsgroup: it.comp.lang.c
Titolo: Ancora MasterMind ... mi intrippa questa sfida...

Ciao a tutti!
Scusate l'ignoranza...ma...non era oggi il giorno di pubblicazione dei
programmi? Io più che vedere il mio (che tanto rimesso a posto e conforme
alle regole ci mette 3000 tentativi --->troppi) voglio vedere quelli
vincenti, e capire come funzionano. Non vedo l'ora!
Cmq ringrazio gli organizzatori di questo "torneo", credo che iniziative di
questo tipo siano davvero utili a principianti e non per spremersi le
meningi e produrre qualcosina!
Ciao e grazie!
]tdx[
PS: Per NOBODY....6 tentativi a numero!?!?!? Come £$£&%$/( hai fatto?!!?!!?
Sei un mago o cosa? Normalmente c'è una possibilità su 99.999 di imbroccare
il numero...come hai fatto a ridurre cosi drasticamente le possibilita??!?!
Magari qualcuno ha fatto di meglio?!?!!? AIUTOOOOOOOOOOOOOOOO!!

 Come £$£&%$/( hai fatto?!!?!!?<snip>
Ecco il sorgente (tanto ormai i tempi di consegna sono scaduti...):
/*----------------------------------------------------------------------------*/
int NumMismatch(byte *punt, byte *myPunt, int max){
/* ritorna 1 se il mismatch delle cifre supera il max consentito,
   0 altrimenti */
  int count,count2;
  byte test[5];
  for(count=5;count--;)
    test[count]=myPunt[count];
  for(count=5;count--;){
    for(count2=5;count2--;){
      if(test[count2]==punt[count]){
        if(++max>5)
          return 1;
        test[count2]=-1;
        break;
      }
    }
  }
  if(max<5)
    return 1;
  return 0;
}
int ThisBreakOldTried(byte *punt, int tentativiFatti[7][1000], byte
t){
  /* controlla se sto' formando un buon tentativo, ritorno 0 se ok, 1
altrim. */
  int count2;
  byte myPunt[5],myB,myN;
  for(count2=t; count2--;){
    myPunt[0]=(byte)tentativiFatti[0][count2];
    myPunt[1]=(byte)tentativiFatti[1][count2];
    myPunt[2]=(byte)tentativiFatti[2][count2];
    myPunt[3]=(byte)tentativiFatti[3][count2];
    myPunt[4]=(byte)tentativiFatti[4][count2];
    /* Verifica se ho cambiato esattamente n item diversi dalla somma
di quelli
       trovati */
    if(NumMismatch(punt,myPunt,
 
5-tentativiFatti[5][count2]-tentativiFatti[6][count2]))
      return 1;
    /* Verifica se il tentativo e' coerente */
    Verifica (punt, myPunt, &myN, &myB);
    if ((myB != tentativiFatti[6][count2]) || (myN !=
tentativiFatti[5][count2]))
      return 1;
  }
  return 0;
}
void NextDigit(byte *punt, int iCanUse[10][5],int pos){
  byte act,old;
  if(pos==5)
    return;
  act=punt[pos];
  old=act;
  do{
    if(++act==10)
      act=0;
  }while(!iCanUse[act][pos]);
  punt[pos]=act;
  if(act<=old)
    NextDigit(punt,iCanUse,pos+1);
}
void Adjust(byte *punt, int iCanUse[10][5]){
/* Toglie dal tentativo i numeri che non si possono piu' usare */
  int count;
  for(count=5;count--;){
    while(!iCanUse[punt[count]][count]){
      if(++punt[count]==10)
        punt[count]=0;
    }
  }
}
void MakeNext(byte *punt, int iCanUse[10][5], int
tentativiFatti[7][1000],
               byte t){
/* Crea un nuovo tentativo, usando la storia precedente. La
terminazione del
   ciclo e' garantita dall'esistenza di una soluzione, ovvero esiste
almeno una
   combinazione che non va' contro i risultati dei precedenti
tentativi. */
  do
    NextDigit(punt, iCanUse, 0);
  while(ThisBreakOldTried(punt,tentativiFatti,t));
}
void Punta (byte *punt, byte N, byte B, byte t) {
  static int iCanUse[10][5]; /* array dei valori utilizzabili per i
tentativi */
  static int tentativiFatti[7][1000];
  int count,count2,val;
  if (t==1){
    /* al primo tentativo (t==1) inizializzo le mie variabili */
    for(count=10;count--;){
      for(count2=5;count2--;)
        iCanUse[count][count2]=1;
    }
    punt[0]=1;
    punt[1]=2;
    punt[2]=3;
    punt[3]=4;
    punt[4]=5;
    return;
  }
  /*
   * analizzo il risultato
   */
  if(!N){
    /* cancello i valori corrispondenti */
    for(count2=5;count2--;){
      iCanUse[punt[count2]][count2]=0;
    }
  }
  if(!N && !B){
    /* cancello tutti i numeri usati */
    for(count2=5;count2--;){
      iCanUse[punt[count2]][0]=0;
      iCanUse[punt[count2]][1]=0;
      iCanUse[punt[count2]][2]=0;
      iCanUse[punt[count2]][3]=0;
      iCanUse[punt[count2]][4]=0;
    }
  }
  if((N+B) == 5){
    /* cancello tutti i numeri non usati */
    for(count=10;count--;){
      val=0;
      for(count2=5;count2--;){
        if (punt[count2]==count){
          val=1;
          break;
        }
      }
      if(!val){
        iCanUse[count][0]=0;
        iCanUse[count][1]=0;
        iCanUse[count][2]=0;
        iCanUse[count][3]=0;
        iCanUse[count][4]=0;
      }
    }
  }
  /* aggiungo una regola */
  for(count2=5;count2--;)
    tentativiFatti[count2][t-2]=punt[count2];
  tentativiFatti[5][t-2]=N;
  tentativiFatti[6][t-2]=B;
  /* Controllo il tentativo attuale. */
  Adjust(punt, iCanUse);
  /* al secondo tentativo uso le altre cifre, se possono essere utili
*/
  if ((t==2) && ((N+B) != 5) && (N+B)){
    punt[0]=6;
    punt[1]=7;
    punt[2]=8;
    punt[3]=9;
    punt[4]=0;
    return;
  }
  /* preparo il prossimo tentativo */
  MakeNext(punt, iCanUse, tentativiFatti, t-1);
}
bye, Andrea
-- 
-----------------+-------------------------------- .~~~.  ))
 Andrea  Rimicci | arimicci @@           (\__/)  .'     )  ))
-----------------+       aritaly. com   /o o  \/     .~
                                       {o_,    \    {
 C,C++,cgi,miva,Java,php Developer and   / ,  , )    \ .
 OS/2 Warp Server for E-business admin   `~  '-' \    } ))
                                        _(    (   )_.'
---------- OS/2 V5 "Phoenix" --------- '---..{____}