Tiago Madeira Inferências aleatórias de um cérebro em versão alpha

"Só se dedicará a um assunto com toda a seriedade alguém que esteja envolvido de modo imediato e que se ocupe dele com amor. É sempre de tais pessoas, e não dos assalariados, que vêm as grandes descobertas."
(Arthur Schopenhauer)

Recebendo entradas (STDIN) de forma eficiente no Ruby

Para praticar Ruby e conferir sua velocidade, resolvi resolver alguns problemas lógicos olímpicos usando suas funções maravilhosas. Deparei-me com gambiarra logo na entrada ao iniciar meu primeiro script: Batuíra, um problema simples de grafos.

A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de teste contém um número inteiro N que indica a quantidade de pontos de repouso . Os pontos de repouso são numerados de 1 a N, sendo 1 o ponto de partida e N o ponto de chegada do vôo migratório. As linhas seguintes contêm, cada uma, três inteiros não negativos X e Y que indicam que a distância do ponto de repouso X ao ponto de repouso Y é Z. O final do conjunto de teste é indicado por X = 0,Y = 0 e Z = 0. O final da entrada é indicado por N = 0.

Em C, eu faria:

while (scanf("%d", &n)&&n!=0) {
	while (scanf("%d %d %d", &x, &y, &z)&&x!=0&&y!=0&&z!=0) {
	}
}

Em Ruby, comecei fazendo algo assim:

while n=gets.chomp.to_i && n!=0
        while x,y,z=gets.chomp && x!="0" && y!="0" && z!="0"
                x=x.to_i; y=y.to_i; z=z.to_i
        end
end

Para uma linguagem como Ruby, um código desse tamanho é considerado muito extenso e muito cheio de lixo. Há dois problemas que considero sérios aí:

  • A falta de um scanf (poxa, eles tem printf, o que custa ter scanf?)
  • Why the hell não existe to_i! (com ponto de exclamação no final)?

Só aprendi duas maneiras de pegar dados da entrada do usuário no tutorial do TaQ: readlines e gets. As duas são pouquíssimo práticas pra esse caso e não encontrei mais nada interessante no STDIN.methods. Por isso suponho que exista alguma coisa que desconheço, mesmo numa gem estranha, ou alguma maneira de criar um bloco de código pra arrumar a array, mas não encontrei nada. Alguém já passou por isso?

Technorati Tags: , , , , ,

Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais

Escrito por Tiago Madeira no dia 29/11/2007 às 20h 58min. Acompanhe os comentários via RSS 2.0. Você pode deixar um comentário ou fazer um trackback do seu site.

Deixe um comentário

Dados Pessoais
  • Obrigatório.
  • Obrigatório, não publicado.
Comentário

Artigos relacionados:

Assine via RSS

Assine gratuitamente o meu blog e receba todas as atualizações na hora, em seu agregador de feeds favorito.

Seja o 231º assinante

Busca no blog

Escreva palavras-chave para buscar e clique em Pesquisar.

Busca Google

Blogs de minha autoria

Publicidade

Dreamhost

Creative Commons - Some rights reserved 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.