fredericopissarra Posted May 10, 2019 Posted May 10, 2019 Participo de alguns grupos e um sujeito me posta um código para "embaralhar" cartas totalmente esquisito. A rotina de "embaralhamento" cheia de ifs e loops... Ai venho eu, pego o código do sujeito, altero e mostro isso: /* card.c gcc -std=c11 -o card card.c */ #include <stdio.h> #include <stdlib.h> #include <time.h> // Essas enumerações estão aqui por causa do // código original enum Suit { SPADES = 0, HEARTS, CLUBS, DIAMONDS }; enum Card_Value { ACE = 0, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING }; // Essa estrutura também... typedef struct { enum Suit suit; enum Card_Value card; } Card; // Modifiquei esses protótipos (que // eram bem mais esquisitos) e os coloquei // como 'static' só para não exportar os símbolos // pro linker (deu o primeiro nó na cabeça dele)... static void init_deck( Card * ); static void shuffle_deck ( Card * ); static char *get_card( Card * ); int main( void ) { Card deck[52]; // EU coloquei o array aqui. // No código original havia uma // chamada do tipo: // // Card *deck = init_deck(); // ... // Card *init_deck() // Isso não é C! // /* Engraçado que ele não achou ISSO esquisito! */ // { static Card deck[52]; return deck; } // int i; init_deck( deck ); srand( time(NULL) ); shuffle_deck ( deck ); // O sujeito não entendeu o 'deck + i' ai embaixo! :) for ( i = 0; i < 52; i++ ) printf( "%s ", get_card( deck + i ) ); putchar('\n'); } void init_deck( Card *deckp ) { int i, j, k; // Não entendeu, muito menos, o "compound"!! :) k = 0; for (i = SPADES; i <= DIAMONDS; i++) for (j = ACE; j <= KING; j++) deckp[k++] = (Card){ i, j }; } #define swap_cards( a, b ) { Card tmp; tmp = (a); (a) = (b); (b) = tmp; } void shuffle_deck ( Card *deckp ) { int i, j; Card tmp; // Esse simples loop deu OUTRO nó na cabeça dele! for ( i = 0; i < 52; i++ ) { j = rand() % 52; swap_cards( deckp[i], deckp[j] ); } } // Tive que ajustar a string com os códigos UTF-8 // "na unha" porque o forum estava bagunçando o código, // ignorando uma belíssima consulta por tabela... // // Claro... isso EXPLODIU a cabeça do sujeito... char *get_card( Card *deckp ) { static char s[5] = { 0 }; int c = 0x1f0a1; // ÁS de espadas! switch ( deckp->suit ) { case 2: // clubs c += 0x10; case 3: // diamonds c += 0x10; case 1: // hearts c += 0x10; } c += deckp->card; if ( deckp->card > 10 ) c++; s[0] = 0xf0 | ((c >> 18) & 7); s[1] = 0x80 | ((c >> 12) & 0x3f); s[2] = 0x80 | ((c >> 6) & 0x3f); s[3] = 0x80 | (c & 0x3f); return s; } Well... depois de compilado e executado, o resultado: Acreditam que a cabeça do sujeito explodiu, de novo, ao saber que pode usar UNICODE no terminal? BWAHAHAHAHAHAHA...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.