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: ruby, stdin, programação, computação, scanf, algoritmos
Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais

