Legacy tiagomadeira.net

Archive for the ‘Lógica’ Category

Escravos de Jó

Monday, February 5th, 2007

Escravos de Jó jogavam caxangá
Tira, bota, deixa ficar
Guerreiros com guerreiros fazem zig-zig-zá
Guerreiros com guerreiros fazem zig-zig-zá

Conclusão aristotélica nonsense do dia: se as meninas da Maçonaria são filhas de Jó e um dos princípios dos meninos é respeitar todas as mulheres, eles são então escravos de Jó.

[BL]caxangá[/BL]

[tags]jó, nonsense, humor, maçonaria[/tags]

Você é real?

Sunday, January 28th, 2007

E eu… sou real? O mundo é real? O tempo é real? Às vezes fico na dúvida… Acho que é muita física quântica.

Anunciada a OBI2006

Sunday, March 19th, 2006

Anunciada a OBI2006! E temos novidades…

A partir desse ano a OBI será realizada em duas fases: a primeira fase nas escolas cadastradas e a segunda, com os melhores classificados da primeira fase, em universidades localizadas nas capitais dos estados e em cidades com grande concentração de competidores.

As provas da primeira fase da OBI2006 serão realizadas no dia 08 de abril (sábado) para a modalidade Programação: a prova do nível 1 ocorrerá no período da manhã, e a prova do nível 2 ocorrerá no período da tarde. Na modalidade Iniciação a prova será aplicada em dia a ser definido pela escola, entre 06 e 13 de abril.

As provas da segunda fase serão realizadas no dia 13 de maio (sábado), tanto para a modalidade Iniciação quanto para a modalidade Programação. Todas as provas seão aplicadas no período da tarde.

Copiado de: Site da OBI

Vamos participar, né? Estou ensinando meu amigo Ivo a programar e estou disposto a ajudar a quem quiser; para mim é um prazer ensinar coisas que eu gosto a quem está disposto a aprender.

E sobre a IOI…

Em 2006 a IOI será realizada no México, de 13 a 20 de agosto. Quatro competidores da Modalidade Programação, Nível 2, representarão o Brasil. Você pode ser um deles! [é a minha meta pro ano!]


Fiquei mais de um mês sem postar (ando sem inspiração). Desculpem-me por deixar a Série Algoritmos parada e não noticiar alguns fatos legais que aconteceram enquanto eu não postei (eu parei de escrever, mas comecei a ler mais). Vou voltar de leve agora…

Tenho estudado bastante matemática e física… pras olimpíadas, pro vestibular do ITA, pra desenvolver minha mente, etc. No fundo, é só porque eu gosto mesmo! :) Além disso, o ano letivo começou. Estou com um monte de coisa pra fazer (ainda não estou acostumado com o ritmo), mas vou voltar a postar ativamente.

De qualquer maneira, a pausa foi boa para uma reflexão pessoal e político-filosófica. Essas mudanças meus leitores provavelmente perceberão nos próximos artigos [ou talvez não].

Saber Programar

Sunday, January 15th, 2006

Este artigo pode ter ficado meio confuso… Acho que acabei me perdendo no meio… :S Deixe um comentário se quiser discutir. ;)


Lógica da Programação

Estava me perguntando hoje:
“O que é a lógica da programação?”
E não consegui obter nenhuma resposta
com exatidão.

Afinal, o que é esse negócio
que “todo programador tem que saber”
e que até cursos existem
para o profissional aprender?

Desculpem… Não pude resistir… Hehehe :D Escrevi algo parecido e coube direitinho, aí dei uma modificada pra ficar em forma de “poesia”. Mas vamos ao artigo…

Talvez minhas idéias sejam diferentes das de quem já fez curso e aprendeu formalmente esse conceito, mas hoje estava pensando e cheguei a conclusão de que a lógica da programação é a lógica da vida, nua e crua. É simplesmente a lógica matemática/filosófica que já conhecemos há tempo e que aprendemos com experiências na vida. Então pra que estudá-la como sendo algo novo?

Um exemplo de lógica da programação, no meu ponto de vista, poderia ser o seguinte:

Eu não gosto de quem mexe nas minhas coisas. E O meu irmão mexeu nas minhas coisas. Disso, deduzimos que eu não gosto do meu irmão. Não importa se é verdadeiro, é lógico. É assim que o computador pensa, não é mesmo? A lógica portanto, para mim, é uma relação entre duas ou mais coisas.

Lógica Matemática

Aí lembrei-me que da lógica matemática, algo que não aprendi formalmente, mas, bom… O Professor Vavá me mencionou no meio desse ano, num dos nossos encontros matemáticos. Ele, decepcionado, mencionou que estava ensinando “lógica” para uma turma de sexta série e passou uma prova com a seguinte questão: As duas afirmações a seguir são corretas: ‘Todo professor de matemática é bonito.’ e ‘O Fabiano é professor de matemática.’ Sabendo disso, o que podemos deduzir? E aí tinham opções como: O Fabiano é feio., O Fabiano é bonito, entre várias outras coisas. Bom… Como é possível alguém errar uma questão dessas?* E, é claro, um monte de gente errou!

Condições Compostas

Cheguei a conclusão de que isto é a lógica da programação. Que é a mesma coisa que a lógica matemática. Aí… Putz… Lembrei-me da semana passada, quando o Leandro Matos (nada contra ele, até tá certo postar artigos assim porque tem gente que consegue ter dificuldade numa coisa dessas!) postou em seu blog um artigo sobre condições compostas – conjunções. Eu, olhando um título como esses, pensei: “Puxa, que esplêndido! Do que será este artigo se trata?” e, antes até de tentar interpretar o título, inocentemente abri uma página para “aprender” sobre o uso do e em condicionais na programação. Realmente decepcionante…

Quer dizer… Poxa! Como é que é possível alguém não entender uma frase como:

n>4 e n<6

... só vai ser verdadeira se 4>n E n<6? Pô, não consigo entender. Já não tá tudo escrito? Não tem nem o que interpretar: basta ler! Então, cheguei a conclusão de que o errado é o que muitas pessoas aprendem como programação. Muitas pessoas não sabem programar. Desculpa se você é um dos caras que tem dificuldade com uma coisa como "condições compostas" (nome bonito, hein?), mas sinceramente, você não vai conseguir programar nada dessa maneira. Você não consegue transpôr um conceito básico da sua vida e das suas experiências pessoais para a programação. Cheguei a conclusão de que as pessoas não entendem o que significa o "verdadeiro" e o "falso" de um condicional, não entendem um ! ("não" no C e linguagens "derivadas"), não entendem que basta você "ler"/"interpretar" a programação. Pô... Olha só a tabela que o Leandro postou no site dele! Hehehe...

É por isso que a gente chama C, PHP e outras siglas de "linguagens", porque elas não passam de uma maneira diferente de comunicar uma coisa, geralmente muito parecida com o nosso inglês... Aliás, muito parecida com tudo que a gente vê. Quem não entende é porque não tá acostumado com o que a gente vê todos os dias ou faz tanto parte da rotina que nem nota e nem aprende.

Nerds

Então, afinal, quem é um nerd? O programador? Ora... O programador é um ser pensante, ele conhece A Lógica, porque ele tem experiências de vida. Quem não programa direito (não conhece "A Lógica") é que é nerd, que não tem muitas experiências na vida e não consegue absorver uma mensagem e utilizá-la em outro local. E aí eu fui pensar bem e tentei lembrar-me do que eu considero "nerd". Sempre me vem imagens de um cara que passa a noite num quarto escuro estourando sua placa aceleradora num jogo viciante e com um fone de ouvido. Nunca me vem a mente um laboratório arrumado, claro, com um programador escrevendo linhas de código.

O exemplo do "Tio Marcos"

E aí, pra completar esse laço gigantesco, lembrei-me do meu tio Marcos. É um cara bem power, o presidente do Conselho Nacional de Psicologia. A gente sempre comenta que o cara sabe "de tudo". Tipo assim, eu comento sobre software livre, ele responde citando o Linux e com Mozilla. Se um marinheiro vai falar com ele sobre nós de marinheiro, ele sabe um monte sobre isso também! Meu irmão fala com ele sobre música erudita e ele sabe identificar os momentos históricos e qualidades de vários compositores. E a gente sempre chega a conclusão de que ele sabe tudo isso porque ele cria relações entre as coisas, relações adquiridas através de experiências pessoais. Ele já morou na Europa duas vezes (na França e na Espanha), fala essas duas línguas (francês e espanhol), além do português do inglês e vive viajando pelo mundo. Fala com gente de todos os estilos, freqüenta uns locais bem alternativos e dessa maneira é um cara que realmente sabe de "lógica". Ele tem uma facilidade imensa para relacionar dois conteúdos e tenho certeza que ele não teria dificuldade nenhuma para programar.

Conclusão

E cheguei a conclusão portanto de que lógica é a capacidade que a pessoa tem de relacionar dois eventos. E a lógica é um dos valores mais importantes do homem. Não serve só para a programação, mas para a matemática, para a filosofia e para qualquer coisa que você vá fazer. A lógica não passa do seu raciocínio e do seu pensamento. Aliás, acho que a "inteligência" é uma função que recebe a "lógica" como argumento... ;) Para adquirir lógica, não adianta você ler um monte de coisa; saia do computador e vá conhecer pessoas e adquirir experiências! :D

Concorda? Não concorda? Comente!

* Importante observar que o Professor Vavá nunca elogiaria o seu "Professor Rival"... Na verdade, ele colocou um aviso bem grande na questão: "Deduções lógicas podem às vezes estar erradas, como acontece, por exemplo, nesse caso." :)

[tags]Lógica, matemática, algoritmos, experiências, vida, inteligência, programação[/tags]

Quanto lixo!

Tuesday, November 29th, 2005

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

[enunciado]

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
#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 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

[enunciado]

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
#include
#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=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

[enunciado]

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
#include
#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 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] 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! :lol: 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"! :)