Curiosidade – Que fazem as 19 linhas de código?
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?
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
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 !
Este artigo tem mais de um ano
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!!!
ops, correcao:
…”e a primeira palavra que me veio a cabeça parecida com “teris” foi “tetris”,…”
Title da imagem alterada.. Assim já não ha batotice 🙂
Só falta alterar o URL da imagem, aparece logo o nome tetris_code.jpg 🙂
“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
upps…ja estava a escrever sobre a minha versão que tem 16 linhas…só não dá para jogar 🙂
🙂
Cumps
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á!
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!
Tchiii…que vergonha!!! Obrigado pela correcção
Não leves a mal, ok?
Apenas quis fazer uma pequena chamada de atenção.
Isso parece ponto de cruz! eheh
hahahahaha
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,
são mais de 90 linhas de código se for formatado decentemente ( e até está bastante compacto )
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,
a mim parece-me mais a volta das 70 e tal linhas, será que faltam funções?
cmps
Muito bom mas isso não são 19 linhas , vamos la quebrar isso e programar indentado =)
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.
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
Experimenta la, a ver são não funciona 🙂
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
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
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
Já vi que não “pescas” nada de programação 🙂
é propositado…
O que se consegue fazer com 256 bytes:
http://rrrola.wz.cz/files/puls.zip
http://rrrola.wz.cz/files/symetrie.zip
Um jogo de tetris:
http://rrrola.wz.cz/files/4is256.zip
e com 32 bytes?
http://rrrola.wz.cz/files/dirojed.zip
Há mais aqui:
http://rrrola.wz.cz/downloads.html
Lembra-me os Demos/Intros 16K do Amiga.
Ish era fácil…!!! Mas estava sem paciência xD Estou de férias lol
Se o código tivesse organizado passava as 19 linhas na boa.
Um dos pontos é clareza, uma coisa que isso não tem :b
Foi de propósito!
Leiam a página do gajo, foi utilizada uma forma de ofuscação de código neste snipet
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 🙂
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.
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
comeq testo isto no mac? 😀
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
gcc tetris.c -o tetris -arch i368
Isto no leopard/snow
http://www.ioccc.org/
Fascinante! o.O
Fantástico. O que 19 linhas fazem…
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
Vai dar ao mesmo, amigo.
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
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?
São apenas warnings…Podes continuar 🙂
Brutal! Funciona !
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!
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’
Ele está a compilar.. como podes ver pelo output, são apenas warning (alertas). experimenta correr a aplicação
PPinto
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”
alguém me pode dizer onde, no código, é que está a ser “desenhado” o help?
Extraordinário!!!!
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…
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
Faço o mesmo em muito menos linhas
Basta-me usar um editor com mais colunas.
fds, 19 linhas? isso assim quem vê até parece dificil, mas só o é dificil de ler.
Identar o código e depois parece ginja