29/11/2005
Firefox 1.5 Final!
Mozilla mais uma vez dentro dos prazos... Acaba de sair o Firefox 1.5 e o site do GetFirefox, agora redirecionando para Mozilla.com, tá com um design bem bonito pra comemorar a data... Só pra dar o recado!
OBS.: Ele ainda não saiu em português brasileiro...
Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais
29/11/2005
Quanto lixo!
Impressionante a quantidade de besteiras que todo programador faz... Às vezes, uma semana depois de fazer um programa ou um site, eu já sinto raiva do script que acabei de fazer e me sinto obrigado a refazê-lo. Brincando um pouco nas férias, estou refazendo vários problemas da OBI e cada vez mais percebo a quantidade de lixo que achamos nos nossos scripts. E o pior é perceber o tempo que eu levava pra fazer aqueles problemas que podiam ser resolvidos de maneira tão simples (e eu pensava que tinha uma solução muito boa)... Estou resolvendo a lista de tarefas da modalidade Programação Nível 2, mas apenas os problemas de grafos (todos eles eu já tinha resolvido, mas estou agora programando-os melhor). Confiram as besteiras que eu fiz nos primeiros deles:
Aeroporto
Um problema de grafos? Não! Mas parece muito. Na verdade, se ele pedisse qualquer coisa mais do que o grau de cada vértice eu precisaria de representar usando grafos, mas a única coisa que ele quer é que eu conte a quantidade de vezes que cada número aparece na entrada.
A primeira solução deste problema, que agora já não está mais entre nós, foi feita no curso de programação básica da OBI 2004, em Campinas, quando começava a aprender grafos. Pra vocês terem uma idéia do drama, eu fiz uma busca em profundidade pra contar o número de arestas que cada vértice tem (pra medir o grau de cada vértice).
Confiram a básica solução que fiz ontem: (e que daqui a algum tempo posso vir a achar ridícula também... hehehe)
#include <stdio.h> #define AMAX 101 int main() { int a, v, x, y, t[AMAX]; // t = tráfego, grau dos vértices int i, maior, teste=1; while (scanf("%d %d", &a, &v)&&a&&v) { maior=0; for (i=1; i<=a; i++) { t[i]=0; } for (i=0; i<v; i++) { scanf("%d %d", &x, &y); t[x]++; t[y]++; if (t[x]>maior) { maior=t[x]; } if (t[y]>maior) { maior=t[y]; } } printf("Teste %d\n", teste++); for (i=1; i<=a; i++) { if (t[i]==maior) { printf("%d ", i); } } printf("\b\n\n"); } return 0; }
Batuíra
O objetivo é achar o caminho mínimo de peso de 1 a N. Uma simples busca em profundidade resolve o problema. Agora vejam a busca em profundidade que eu faria em 2004, que ainda não tirei da minha galeria de códigos: batuira.c e comparem com a que eu fiz ontem (e que ainda poderia ser melhorada):
#include <stdio.h> #include <values.h> #define NMAX 101 int n, marc[NMAX], g[NMAX][NMAX]; int resultado; void buscaemprofundidade(int v, int soma) { int w; if (v==n) { if (soma<resultado) { resultado=soma; } } else { marc[v]=1; for (w=1; w<=n; w++) { if (g[v][w]&&!marc[w]) { buscaemprofundidade(w, soma+g[v][w]); } } } } int main() { int x, y, xy; int i, j, teste=1; while (scanf("%d", &n)&&n) { resultado=MAXINT; for (i=1; i<=n; i++) { marc[i]=0; for (j=1; j<=n; j++) { g[i][j]=0; } } while (scanf("%d %d %d", &x, &y, &xy)&&x&&y&&xy) { g[x][y]=xy; g[y][x]=xy; } buscaemprofundidade(1, 0); printf("Teste %d\n%d\n\n", teste++, resultado); } return 0; }
Dengue
Esse foi com certeza meu maior susto. Foi por causa desse problema que eu resolvi escrever este artigo... Dá até vergonha de mostrar a busca em profundidade que usei para resolver o problema anteriormente. O objetivo do problema é descobrir partindo de que vértice do grafo o vértice que se encontra mais longe tem custo menor. Ou seja, é só fazer uma busca em largura com todos os vértices. Mas antigamente eu não simpatizava muito com a busca em largura, então fiz aquela besteira. E imaginem quanto tempo eu não levei pra fazer aquela joça... Bom... Pelo menos deve ter servido pra eu quebrar a cabeça naquela época! Vejam o código novo (sujeito a mudanças, é claro!):
#include <stdio.h> #include <values.h> #define NMAX 101 int main() { int w, i, j, x, y, teste=1, g[NMAX][NMAX], n, d[NMAX], fim, ini, fila[NMAX], v, a, md[NMAX], c; while (scanf("%d", &n)&&n) { for (i=1; i<=n; i++) { for (j=1; j<=n; j++) { g[i][j]=0; } } for (i=1; i<n; i++) { scanf("%d %d", &x, &y); g[x][y]=1; g[y][x]=1; } c=0; md[0]=MAXINT; for (v=1; v<=n; v++) { for (i=1; i<=n; i++) { d[i]=n; } md[v]=0; d[v]=0; ini=0; fim=0; fila[fim++]=v; while (ini!=fim) { a=fila[ini++]; if (d[a]>md[v]) { md[v]=d[a]; } for (w=1; w<=n; w++) { if (g[a][w]&&d[w]==n) { d[w]=d[a]+1; fila[fim++]=w; } } } if (md[v]<md[c]) { c=v; } } printf("Teste %d\n%d\n\n", teste++, c); } return 0; }
Bom... Simplificando... Se você não é programador, não seja; você vai ficar louco!
Este problema que citei aqui não acontece só com esses problemas de olimpíadas mas também com vários scripts, principalmente os que vamos alterando com o tempo e adicionando novas features. Já recomecei do zero muitos sites para deixá-los decentes e muitos programas também (essa versão do aeroporto.c já é a terceira!) e não só esses de olimpíadas (o meu programa de ouvir música, em Bash, eu já fiz umas 10 vezes).
Quando eu acabar de re-resolver todos os problemas da seção de códigos lógicos eu vou publicar todos juntos. Por enquanto, vou deixar tudo do jeito que tá pra vocês apreciarem meus scripts mal-feitos.
Quem costuma visitar meu blog perceberá que apareceu um ícone lá no canto inferior direito, escrito Bom Demais para o IE. A imagem, posicionada lá embaixo usando um position:fixed; (que o IE não suporta) é de uma campanha muito legal que você pode conhecer clicando no link. Participem e tenham um site "bom demais para o Internet Explorer"!
Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais
27/11/2005
Agora acabou definitivamente!
Acabou a OLIS e agora definitivamente o ano letivo. Comecei a rotina de estudos de leve... Por enquanto só relembrando aonde tinha parado: Brinquei um pouco de C, alocando memória, escovando bits até não aguentar mais; implementei alguns algoritmos em grafos (de problemas já anteriormente resolvidos, do site da OBI) e agora estou exercitando fluxos em rede. O primeiro passo foi me desviciar de usar busca em profundidade resolvendo vários programas anteriormente resolvidos de grafos agora com busca em largura e nessa próxima semana espero ter dominado o algoritmo de coloração, de bipartição e os fluxos em rede.
Pedi na Saraiva (temos que aproveitar o site inteiro em 12x sem juros e frete grátis) o livro Java - Como Programar, dos Deitel. Várias pessoas me recomendaram e acho que vai ser bom pra aprender Java de uma maneira mais "certinha" (não que pesquisando na internet não aprendemos de forma certa, mas com a didática de um livro tudo é bem mais fácil e a gente aprende as coisas numa ordem boa).
Estou acabando de reformular o site do Colégio, porque já que cada vez tem uma coisinha nova o design tava ficando muito cheio e o XHTML pouco acessível. Agora tá ficando mais clean e deve estar lá amanhã de tarde (só falta um pequeno detalhe: fazer funcionar em um troço da Microsoft que não pode ser considerado um navegador)
O que ando vendo por aí...
- Web Content Accessibility Guidelines 2.0
- Fixing the Back Button (em Ajax)
- Simulando latência com Greasemonkey
- Primeiro ano A: campeão-geral da OLIS!
... além dos meus feeds. Agora eu criei um perfil público no Bloglines (idéia do Zé) e vocês podem ver meus feeds aqui.
Compare Preços de: iPod, home theater, plasma, lcd, câmeras digitais, games, ps3
Assine via RSS
Assine gratuitamente o meu blog e receba todas as atualizações na hora, em seu agregador de feeds favorito.
Busca no blog
Escreva palavras-chave para buscar e clique em Pesquisar.
Veja também...
Blogs de minha autoria
- 1001 Gatos de Schrödinger (discordianismo e mindfuck)
- Algoritmos computacionais (estudo para olimpíadas e aprendizagem sobre lógica de programação)
Artigos por mês
- July 2008
- June 2008
- May 2008
- April 2008
- February 2008
- December 2007
- November 2007
- August 2007
- July 2007
- June 2007
- May 2007
- April 2007
- March 2007
- February 2007
- January 2007
- December 2006
- October 2006
- September 2006
- August 2006
- June 2006
- May 2006
- April 2006
- March 2006
- February 2006
- January 2006
- December 2005
- November 2005
- October 2005
- September 2005
- August 2005
- July 2005
- June 2005
- May 2005
- April 2005
- March 2005
- February 2005
- January 2005
tiagomadeira.net © Todo o conteúdo deste blog, exceto quando especificado o contrário, está licenciado sob uma Licença Creative Commons por Tiago Madeira.
Os comentários são de responsabilidade de seus respectivos autores.

