Curiosidade – Que fazem as 19 linhas de código?

56 Comentários

Hoje vamos mudar a direcção nos artigos Linux e trazer até vós algo diferente, um desafio ! Para isso, antes de lerem todo o artigo, tentem responder à seguinte questão:

Qual será o resultado das seguintes 19 linha de código seguintes, escritas na linguagem de programação C?

teris_code

Alguém conseguiu chegar à solução? Pois bem, as 19 linha de código em C fazem parte do jogo Micro Tetris. Estas “simples” 19 linhas de código, pertencem ao vencedor do concurso de código C que foi contemplado com o melhor desenvolvido jogo, em termos de programação. Vamos testar?

Para começar vamos colocar o seguinte código por exemplo num ficheiro com o nome tetris.c
long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1,
12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12,
1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12,
12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i]
){Q[i]=k;if(i-++I||i%12<1)printf(“\033[%d;%dH”,(I=i)/12,i%12*2+28);printf(
“\033[%dm “+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i–;)if(q[i?b+
n[i]:b])return 0;return 1;}g(b){for(i=4;i–;q[i?x+n[i]:x]=b);}main(C,V,a)char*
*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:”jkl pq”;i;i–)*n++=i<
25||i%12<2?7:0;srand(getpid());system(“stty cbreak -echo stop u”);sigvec(14,v,
0);t();puts(“\033[H\033[J”);for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+
12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){
for(;j%12;q[j–]=0);u();for(;–j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c
=a[5]);}}if(c==*a)G(–x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G
(++x)||–x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock(
8192);printf(“\033[H\033[J\033[0m%d\n”,w);if(c==a[5])break;for(j=264;j–;Q[j]=
0);while(getchar()-a[4]);puts(“\033[H\033[J\033[7m”);sigsetmask(s);}}d=popen(
“stty -cbreak echo stop \023;sort -mnr -o HI – HI;cat HI”,”w”);fprintf(d,
“%4d from level %1d by %s\n”,w,l,getlogin());pclose(d);}

Em seguida, abrimos a linha de comandos, e no mesmo local onde temos guardado o ficheiro tetris.c, mandamos complicar o código fonte com o seguinte comando.

gcc tetris.c -o tetris

Para executar o jogo, basta inserir o seguinte comando

./tetris

tetris00

O jogo coloca a disposição do utilizador 6 teclas que permitem manipular as peças e realizar algumas acções. 19 linhas de código? Fantástico !

Partilhar:
Tags:

Comentários

56

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de PorquinhoBranco
    PorquinhoBranco

    epa, eu nao percebo nada de programçao, mas ao menos podiam ter mudado o nome da imagem com as linhas de codigo! É que ao passar com o rato por cima da imagem, aparece-me logo o “balao” com o nome da imagem, neste caso “teris code”, e a primeira palavra que me veio a cabeça parecida com esta foi “teris” foi “tetris”, e voilá, quando abri o artigo, era mesmo um jogo de tetris!!!

    1. Avatar de PorquinhoBranco
      PorquinhoBranco

      ops, correcao:

      …”e a primeira palavra que me veio a cabeça parecida com “teris” foi “tetris”,…”

      1. Avatar de Pedro Pinto

        Title da imagem alterada.. Assim já não ha batotice 🙂

        1. Avatar de Rodrigo Antunes
          Rodrigo Antunes

          Só falta alterar o URL da imagem, aparece logo o nome tetris_code.jpg 🙂

  2. Avatar de Computed Life

    “O jogo coloca a disposição do utilizador 6 teclas que permitem manipular as peças e realizar algumas acções. 16 linhas de código? Fantástico !”

    Correcção de 16 linhas para 19 linhas de código.

    Bom trabalho,
    Cumps

    1. Avatar de Pedro Pinto

      upps…ja estava a escrever sobre a minha versão que tem 16 linhas…só não dá para jogar 🙂

  3. Avatar de Olly

    Atenção ao português!
    Sei que é tempo de férias e todos os minutos são preciosos para descansar mas um texto bem redigido é meio caminho andado para um sítio de qualidade e não nos custa nada reler o texto antes de publicar.

    “comtemplado com o melhor desenvolvido jogo”
    contemplado com o prémio de melhor jogo desenvolvido

    “manda-mos complicar o código fonte”
    mandamos compilar o código fonte

    Aparte disto, muito bom (o código), os meus parabéns ao autor do Micro Tetris. Um exemplo das mentes brilhantes que temos por cá!

    1. Avatar de Silva
      Silva

      Ia mesmo agora alertar para essas pequenas gaffes no texto.

      é muito frequente encontrar gaffes neste género de sites, são poucos ou nenhums os que não as têm.

      pra mim, um bom site, não só fornece notícias interessantes e recentes, como as apresenta ao leitor de forma profissional e correctamente escrita.

      cumpz!

      1. Avatar de Pedro Pinto

        Tchiii…que vergonha!!! Obrigado pela correcção

        1. Avatar de Olly

          Não leves a mal, ok?
          Apenas quis fazer uma pequena chamada de atenção.

  4. Avatar de Marisa Pinto

    Isso parece ponto de cruz! eheh

    1. Avatar de Vítor Antunes
      Vítor Antunes

      hahahahaha

  5. Avatar de Computed Life

    Olhando com mais atenção, reparei que tem 19 linhas de código realmente, mas não tem 19 instruções nem coisa parecida correcto?

    Cumps,

    1. Avatar de b33
      b33

      são mais de 90 linhas de código se for formatado decentemente ( e até está bastante compacto )

      1. Avatar de Computed Life

        Sim está mas era mais correcto dizer que ganho o concurso com 90 linhas de código do que dizer que ganhou com 19 linhas uma vez que ele até podia ter feito aquilo numa linha de código.

        Cumps,

        1. Avatar de lmx
          lmx

          a mim parece-me mais a volta das 70 e tal linhas, será que faltam funções?

          cmps

  6. Avatar de Jorge Franco
    Jorge Franco

    Muito bom mas isso não são 19 linhas , vamos la quebrar isso e programar indentado =)

  7. Avatar de Dust Bunny
    Dust Bunny

    Estranho. Na minha máquina de 64bits não compila…
    Por outro lado, no pc de 32bits funcionou perfeitamente 🙂
    Estou fascinado. O único tetris que escrevi tinha muito mais código.

    1. Avatar de lmx
      lmx

      nem pode,
      visto que faltam os includes.
      stdlib,stdio,possivelmente time, signal,
      a função getlogin() não existe a não ser que esteja dessimulada,entre outras existem variaveis que também não?! não era esse o objectivo?!Vocês colocaram o codigo todo??epa ha uns tempos que não mexo nisto, mas…

      cmps

      1. Avatar de Pedro Pinto

        Experimenta la, a ver são não funciona 🙂

        1. Avatar de lmx
          lmx

          boas,
          para ja não esta a bombar mas deve ter a ver com os parametros que tenho MINGW no codeblocks ainda por cima fiz uma instalação da nova versão e ja não me lembrava, quando puder vejo e posto resultado. 😛

          cmps

          1. Avatar de lmx
            lmx

            boas, la consegui apos alguns malabarismos por isto a bombar, mas este código não deve estar de acordo com o standard que eu uso o ansi89.
            quase de certeza tenho uma serie de warnings e para correr isto, bem…mas ja corre.

            cmps

  8. Avatar de João
    João

    Que identação terrível. Se não tivessem dado a resposta, ficaria surpreso se alguém tentasse ver tal coisa… É inaceitável para se apresentar :S

    1. Avatar de Pedro Pinto

      Já vi que não “pescas” nada de programação 🙂

    1. Avatar de ZiLOG
      ZiLOG

      Lembra-me os Demos/Intros 16K do Amiga.

  9. Avatar de David
    David

    Ish era fácil…!!! Mas estava sem paciência xD Estou de férias lol

  10. Avatar de Jose
    Jose

    Se o código tivesse organizado passava as 19 linhas na boa.

    Um dos pontos é clareza, uma coisa que isso não tem :b

    1. Avatar de Sarev0k

      Foi de propósito!
      Leiam a página do gajo, foi utilizada uma forma de ofuscação de código neste snipet

  11. Avatar de Luis Leite

    Post engraçado Pedro.
    Olhando para o codigo assim nunca diria que era o jogo de tetris, tive mesmo que continuar a ler

    Bom post 🙂

  12. Avatar de kwimerA
    kwimerA

    Entender as instruções é fácil, difícil é entender a maneira de pensar de quem programou isto. Custa tanto pensar quando se tá de férias… uma identação bonita ajudava muito.. mas lá se iam as 19 linhas de código!
    Ainda eu me queixo de quando vejo algoritmos que fiz há algum tempo e apesar de ter tudo comentado tou meia hora a entende-los.

    1. Avatar de Olly

      LOL

      E eu que já não mexo em programação (a sério) há mais de um ano… chega quase a ser chinês eheh

  13. Avatar de transik

    comeq testo isto no mac? 😀

    1. Avatar de lmx
      lmx

      testas igual se não tens o gcc instalado tens que instalar e salvo erro glibc6(não sei exactamente a versão mas 6 deve ser de certeza)

      cmps

  14. Avatar de kurayama
    kurayama

    gcc tetris.c -o tetris -arch i368
    Isto no leopard/snow

  15. Avatar de avlis rotiv
    avlis rotiv

    Fascinante! o.O

  16. Avatar de Nuno - Emprego Brasil

    Fantástico. O que 19 linhas fazem…

  17. Avatar de wolfytuga

    Olá Pplware!

    Tenho uma curiosidade quanto à compilação, não será da seguinte forma:

    gcc -o tetris tetris.c

    Ou é possíveis fazer isto da forma que vocês indicam e da forma que indico?

    Cumps,
    wolfytuga

    1. Avatar de rms

      Vai dar ao mesmo, amigo.

  18. Avatar de rms

    Bem, eu compilei o supracitado código como costumo compilar os meus bichos em C99:

    gcc -Wall -Wextra -pedantic -Winit-self -Wfloat-equal -Wdisabled-optimization -Winvalid-pch -Wmissing-noreturn -Wlogical-op -Wmissing-prototypes -Waggregate-return -Wconversion -std=c99 -Os -Q -g0 tetris.c -o tetris

  19. Avatar de Hawk
    Hawk

    Apareceram mensagens de erro aqui na hora da compilação:

    tetris.c:1: warning: data definition has no type or storage class
    tetris.c: In function ‘u’:
    tetris.c:6: warning: incompatible implicit declaration of built-in function ‘printf’
    tetris.c: In function ‘main’:
    tetris.c:16: warning: incompatible implicit declaration of built-in function ‘printf’
    tetris.c:18: warning: incompatible implicit declaration of built-in function ‘fprintf’
    tetris.c:19: warning: passing argument 1 of ‘fprintf’ makes pointer from integer without a cast
    tetris.c:19: note: expected ‘void *’ but argument is of type ‘int’
    tetris.c:19: warning: format ‘%s’ expects type ‘char *’, but argument 5 has type ‘int’

    O que devo fazer?

    1. Avatar de Pedro Pinto

      São apenas warnings…Podes continuar 🙂

  20. Avatar de Nuno
    Nuno

    Brutal! Funciona !

  21. Avatar de Pedro Correia
    Pedro Correia

    Isto não são 19 linhas… É apenas 1 linha… Mas com muitas instruções, qualquer programa pode ter só 1 linha mesmo.

    De qualquer forma, está bastante interessante!

  22. Avatar de MrMello
    MrMello

    Serei o único que não consegue compilar por ter 2erros? =S
    Ainda tentaria ver onde estava o problema,mas com esta compressão de linhas. x)

    tetris.c:1: warning: data definition has no type or storage class
    tetris.c:1: warning: cast from pointer to integer of different size
    tetris.c:1: error: initializer element is not constant
    tetris.c:1: error: (near initialization for ‘v[0]’)
    tetris.c: In function ‘u’:
    tetris.c:6: warning: incompatible implicit declaration of built-in function ‘printf’
    tetris.c: In function ‘main’:
    tetris.c:16: warning: incompatible implicit declaration of built-in function ‘printf’
    tetris.c:18: warning: incompatible implicit declaration of built-in function ‘fprintf’
    tetris.c:19: warning: passing argument 1 of ‘fprintf’ makes pointer from integer without a cast
    tetris.c:19: note: expected ‘void *’ but argument is of type ‘int’
    tetris.c:19: warning: format ‘%s’ expects type ‘char *’, but argument 5 has type ‘int’

    1. Avatar de Pedro Pinto

      Ele está a compilar.. como podes ver pelo output, são apenas warning (alertas). experimenta correr a aplicação

      PPinto

      1. Avatar de Henrique Rocha

        nop não está, dá erro, o ubuntu dele é x64, a mim tb me aconteceu, instala o multilib no centro de software e adiciona a flag “-m32”

  23. Avatar de camurso_
    camurso_

    alguém me pode dizer onde, no código, é que está a ser “desenhado” o help?

  24. Avatar de José Fonseca
    José Fonseca

    Extraordinário!!!!

  25. Avatar de Henrique Rocha

    para distros de 64 bits deve-se instalar o multilib e adicionar a flag “-m32”

    eu tb consigo fazer o “age of empires” numa linha.

    experimentem fazer “indent tetris.c” é curioso…

  26. Avatar de Patrick Veiga
    Patrick Veiga

    Oh meus caros… Ponde isso num exame de programação e vede quem é que corrige isso. São 19 linhas mas acho que para ser mais complicado podiam ter metido tudo numa…
    Claro que se a cada ‘;’ e { dermos um enter aí já conseguimos olhar de primeira para o ficheiro e ver a estrutura …. O que está aí é o mesmo que tentar contar espaguete num prato depois de servido

  27. Avatar de Jose Simoes
    Jose Simoes

    Faço o mesmo em muito menos linhas

    Basta-me usar um editor com mais colunas.

  28. Avatar de Eleck
    Eleck

    fds, 19 linhas? isso assim quem vê até parece dificil, mas só o é dificil de ler.

    Identar o código e depois parece ginja