training

Code I wrote during training
git clone git://git.bitsmanent.org/training
Log | Files | Refs | README

cruciverb_BROKEN.c (7701B)


      1 /* Exercise 8.42 */
      2 
      3 #include <stdio.h>
      4 #include <string.h>
      5 #include <stdlib.h>
      6 #include <time.h>
      7 #include <ctype.h>
      8 
      9 #define VER 12
     10 #define HOR (VER + (VER / 2))
     11 
     12 #define BCELL 35
     13 #define WCELL 46
     14 
     15 #define WORDS 98
     16 
     17 void gridgen(char grid[][HOR][5], int ver, int hor);
     18 void insnums(char grid[][HOR][5], int ver, int hor);
     19 void showgrid(char grid[][HOR][5]);
     20 void inswords(char grid[][HOR][5], char const * dict[WORDS * 2 + 1]);
     21 
     22 int main(void)
     23 {
     24    char grid[VER][HOR][5] = { { { 0 } } };
     25 
     26    char const * dict[WORDS * 2 + 1] = {
     27       /* Words */
     28       "CLAUDIO", "PALERMO", "ITA",
     29       "KATY", "NADIA", "DALILA", "CATRINE", "CRISTINA",  
     30       "QUINDICILETTERE", "QUESTESONOSEDICI", "SPACCO",
     31       "TENLETTERS", "CINQUE", "THESIX", "FOUR", "SIX",
     32       "SEX", "BSD", "UNIX", "GATTO", "MIAO",
     33       "SIAMOATREDICI", "SIAMODIECI", "ALTREDIECI",
     34       "QUATTORDICIBIS", "TRENTA", "OTTO", "UNODUETRE",
     35       "PA", "ME", "EN", "CT", "TP", "CL", "SI", "RA", "AG", 
     36       "DODICIPAROLE", "UNGRUPPOUTENTI", "UNIXUSERGROUP",
     37       "ILSETTE", "VENTOTTO", "LUG", "SUX", "OOP", "IP", "ID",
     38       "EIGHTNUM", "NINEWORDS", "NOVENOVES", "QUESTESONODICIOTTO",
     39       "DOMINATORIDELMONDO", "ABCDEFGHIJK", "THREE", "IDUE", "SET",
     40       "POP", "DICATRENTATRE", "SHOCK", "BURNING", "DICIASSETTENUMERI",
     41       "INUMERI", "ALICEADSLHOMETV4MB" "TEST", "FIGA", "QUESTAEVITA",
     42       "META", "LAPROMESSA", "BLACK", "UNALTROTEN", "QUATTROGATTI",
     43       "RET", "VELOCE", "POWER", "TAG", "RESTO", "ILLOOP", "SHUTDOWN",
     44       "TESI", "LEGA", "NASO", "TANA", "SAGGEZZA", "CODA", "VITA",
     45       "TESSERE", "LEANCORE", "GLIALBORI", "QUATTROCENTOVENTI", "CHECK",
     46       "MARKED", "TV", "IPASSORICORSIVI", "GO", "VI", "SONOANCORADICIOTTO",
     47       "TESTO", "CENTOVENTI", "SCACCOALLAREGINA", "QUADRO",
     48 
     49       /* Definitions */
     50       "Lo sviluppatore di questo software",
     51       "La città dello sviluppatore di questo software :-)",
     52       "Uno stato europeo",
     53       "Nome di donna k..", "Nome di donna na..", "Nome di donna d..",
     54       "Nome di donna: ca..", "Nome di donna cr..", "tanto per",
     55       "le ho contate", "ciò che faccio :P", "in inglese", "un numero",
     56       "un altro numero :-)", "un quattro di quattro lettere",
     57       "il numero delle sue lettere è pari alla meta del suo valore",
     58       "sicurezza extrema :P", "Il tipo di Unix migliore al mondo",
     59       "un sistema operativo caso ;)", "fa miao", "lo fa il gatto",
     60       "numero corrente", "quante dicono di essere?", "ce ne sono..",  
     61       "un articolo :p", "La metà delle sue lettere per 10 dà il suo nome",
     62       "Il doppio delle sue lettere diviso 2 da il suo nome", "Da uno a nove"
     63       "Palermo (sigla)", "Messina (sigla)", "Enna (sigla)", "Catania (sigla)",
     64       "Trapani (sigla)", "Caltanissetta (sigla)", "Siracusa (sigla)",
     65       "Ragusa (sigla)", "Agrigento (sigla)", "Tante parole quante lettere su..",
     66       "UUG", "UUG (sigla)", "Un numero", "Aggiungi *20* e dividi per *due*",
     67       "Gruppo utenti linux", "Questo non funziona..",
     68       "Programmazione orientata agli oggetti", "Internet Protocol",
     69       "Identification number", "L'otto ;)", "Nove parole",
     70       "Nove nove al plurale :P", "Lo dice chi le conta", "Io e Claudio ;)",
     71       "Le prime undici", "Tre con cinque", 
     72       "Anche se tanti, solo due.. con 4 (lol)",
     73       "Si usa per impostare qualcosa su qualsiasi shell",
     74       "In assembler si usa per rimuovere..", "Lo dice il dottore",
     75       "effetto provato dall'hiphop di Claudio :-)", "Masterizzando",
     76       "Il numero di lettere in esso scritto corrisponde alle sue lettere (uhm?)",
     77       "Una generalizzazione matematica..", "prova", "ce n'è in abbondanza :-)",
     78       "Lo dice che stà bene", "La insegue il viaggiatore",
     79       "Somiglia a un giuramento :-)", "Nero", "Ancora uno", "Lo sono in pochi",
     80       "Valore di ritorno", "Claudio scrive..", "Accende il PC",
     81       "L'html ne è pieno", "L'operatore col simbolo di percentuale",
     82       "Il *ciclo* storpiato", "Arresto del sistema", "La si sà per la laurea",
     83       "L'insieme dei materiale che costituiscono un oggetto",
     84       "Lo possiede chi ci sa fare", "Vi rimane chi si nasconde",
     85       "La possiede chi apprende dalle esperienze altrui",
     86       "Il gatto ne ha più di una", "L'uomo ne ha una soltanto",
     87       "Si presentano all'ingresso", "Le navi ne hanno almeno due",
     88       "Quando tutto cominciò",
     89       "140 più il numero delle sue lettere * 3 dà il numero in esso scritto :-)"
     90       "Controllo", "Spuntato, visitato", "La vecchia scatola magica",
     91       "Una solo può generarne molti", "Andare", "L'editor per eccellenza ;)",
     92       "Ne ho aggiunte ancora", "Lo scrive il cantante", "60 * 2 :)",
     93       "lo si fa alla moglie del re",
     94       "Lo si trova in gallerie d'arte e in ogni videogame :-)"
     95    };
     96 
     97    srand( time(NULL) );
     98 
     99    gridgen(grid, VER, HOR);
    100    /* inswords(grid, dict); */
    101    showgrid(grid);
    102 
    103    return 0;
    104 } /* E0F main */
    105 
    106 /* ehm.. show the grid :-) */
    107 void showgrid(char grid[][HOR][5])
    108 {
    109    int i, j;
    110    for(i = 0; i < VER; i++) {
    111       for(j = 0; j < HOR; j++)
    112 	 printf("%4s", grid[i][j]);
    113       printf("\n");
    114    }
    115 }
    116 
    117 /* create an empty grid */
    118 void gridgen(char grid[][HOR][5], int ver, int hor)
    119 {
    120    int i, j;
    121 
    122    for(i = 0; i < ver; i++) {
    123       for(j = 0; j < hor; j++) {
    124 	 if( !(rand() % 5) )
    125 	    *grid[i][j] = BCELL;
    126 	 else
    127 	    *grid[i][j] = WCELL;
    128       }
    129    }
    130 
    131    insnums(grid, ver, hor);
    132 
    133 } /* eof gridgen() */
    134 
    135 /* insert the numbers to an empty grid */
    136 void insnums(char grid[][HOR][5], int ver, int hor)
    137 {
    138    int i, j, num = 1;
    139 
    140    for(i = 0; i < ver; i++) {
    141       for(j = 0; j < hor; j++) {
    142 
    143 	 if(*grid[i][j] == BCELL)
    144 	    continue;
    145 
    146 	 if( /* Toggle the closed cells */
    147 	    (*grid[i - 1][j] == BCELL || !i) &&
    148 	    (*grid[i + 1][j] == BCELL || i == ver - 1) &&
    149 	    (*grid[i][j + 1] == BCELL || j == hor - 1) &&
    150 	    (*grid[i][j - 1] == BCELL || !j)
    151 	 ) {
    152 	    
    153 	    if(j < hor - 1) {
    154 	       *grid[i][j + 1] = WCELL;
    155 	       --j;
    156 	    }
    157 	    else if( i < ver - 1 ) {
    158 	       *grid[i + 1][j] = WCELL;
    159 	    }
    160 	    else { /* Latest cell down/right */
    161 	       *grid[i][j] = BCELL;
    162 	    }
    163 	 }
    164 
    165 	 else if( /* Check the cell to put it the number */
    166 	    ((*grid[i][j - 1] == BCELL || !j) &&
    167 	    (*grid[i][j + 1] != BCELL && j < hor - 1)) ||
    168  	    ((*grid[i - 1][j] == BCELL || !i) &&
    169 	    (*grid[i + 1][j] != BCELL && i < ver - 1))
    170 	 ) {
    171 
    172 	       if( num <= 9 ) {
    173 	          *grid[i][j] = num + (int)'0';
    174                }
    175 	       else if(num <= 99) {
    176 	          grid[i][j][0] = num / 10 % 10 + '0';
    177 	          grid[i][j][1] = num % 10 + '0';
    178 	       }
    179 	       else if(num <= 999) {
    180 	          grid[i][j][0] = num / 100 % 10 + '0';
    181 	          grid[i][j][1] = num / 10 % 10 + '0';
    182 		  grid[i][j][2] = num % 10 + '0';
    183  	       }
    184 	    ++num;
    185 
    186          }
    187       }
    188    }
    189 } /* eof insnums() */
    190 
    191 /* Insert the words to the cruciverb */
    192 void inswords(char grid[][HOR][5], char const * dict[WORDS * 2 + 1])
    193 {
    194    int i, j, k, x, len;
    195    int done[WORDS] = { 0 };
    196 
    197    for(i = 0; i < VER; i++) {
    198       for(j = 0, len = 0; j <= HOR; j++) {
    199 
    200 	 /* Found a delimiter (BCELL or right border) */
    201 	 if( (*grid[i][j] == BCELL || j == HOR) && len ) {
    202 
    203             k = -1; /* Count the string */
    204 	    while(++k < WORDS * 2) {
    205 	       if( *dict[k] != 1 &&
    206 		   (int)strlen(dict[k]) == len &&
    207 		   done[k] != '*' )
    208 		     break;
    209 	    }
    210 
    211 	    /* Overwrite the token with the string */
    212 	    if(k < WORDS) {
    213 	       done[k] = '*'; /* Marked as inserted */
    214 
    215 	       x = k;
    216 	       for(k = 0; k < len; k++) {
    217 
    218 		  grid[i][j - len + k][0] = ' '; /* clean */
    219 		  grid[i][j - len + k][1] = dict[x][k];
    220 		  grid[i][j - len + k][2] = '\0'; /* clean */
    221 
    222 
    223 	       }
    224 	    }
    225 
    226 	    len = 0;
    227 	 }
    228 	 else { /* Increment the token size */
    229  	    ++len;
    230 	 }
    231       }
    232    }
    233 } /* eof inswords() */
    234