29/11/2007
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: iPod, home theater, plasma, lcd, câmeras digitais, games, ps3
28/11/2007
Baixando e convertendo vídeos do YouTube para AVI e MP3 no Linux usando Ruby, wget, ffmpeg e lame
#!/usr/bin/ruby require "net/http" def inputerror puts "Uso: rytc --<avi|mp3> ID_VIDEO_1 [ID_VIDEO_2 ...]" exit 1 end arg=ARGV if arg.length<2 puts "Você não passou o mínimo que são dois argumentos." inputerror end tipo=arg.shift.gsub(/--/, '').downcase if tipo!='avi' && tipo!='mp3' puts "Você escolheu um formato válido (MP3 ou AVI)." inputerror end ARGV.each do |v| host=Net::HTTP.new("www.youtube.com",80) resposta=host.get("/watch?v="+v) vars=resposta.body.scan(/video_id=.*&t=[^\"&]*/).uniq.to_s url="http://www.youtube.com/get_video?#{vars}" nome=resposta.body.scan(/<title>.*<\/title>/).uniq.to_s.gsub(/<\/?title>/, '').gsub(/YouTube - /, '').gsub(/'/, '\\\'') `wget -c -O '#{nome}.flv' '#{url}'` if tipo=="mp3" `ffmpeg -i '#{nome}.flv' -ar 44100 '#{nome}.wav'` `lame '#{nome}.wav' '#{nome}.mp3'` else `ffmpeg -i '#{nome}.flv' '#{nome}.avi'` end # Descomente a linha abaixo se você não gostar de lixo. # `rm '#{nome}.flv' '#{nome}.wav'` end
Salve como "rytc" em /usr/bin ou alguma outra pasta do $PATH do seu sistema.
O código e o nome extenso do post dispensam explicações. Não se esqueça de baixar Ruby, ffmpeg e lame para o programa funcionar (no Ubuntu, sudo apt-get install ruby lame ffmpeg)
PS: Sou iniciante em Ruby, aceito qualquer contribuição de limpeza de código. Mas a não-orientação-a-objetos foi intencional, porque parecia que ficava muito código inútil sobrando.
PS2: Sim, eu sei que dá pra fazer a mesma coisa em Shell (aliás, não tem muita utilidade usar Ruby aí, porque no fim fico fazendo um monte de chamadas pra programas externos), mas o divertido de aprender uma linguagem nova é fazer essas coisas nela...
Technorati Tags: ruby, programação, shell, utilitários, youtube, vídeo, download, conversão
Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais
28/11/2007
Organizando sua biblioteca de músicas no formato MP3 utilizando Ruby e taglib
Vamos fingir que você é um cara mau que ao invés de comprar CDs legalmente (como eu sempre faço e você também) baixa discografias completas na internet, como por exemplo a do Beatles. Ao terminar de baixar 3 GB com mais de 20 CDs você nota que os arquivos não estão corretamente taggeados e com isso você bagunçaria a organização perfeita do seu computador, do seu iPod ou de qualquer outro aparelho que você use pra ouvir música. O que fazer? Apelar para o Ruby com a Taglib, é claro! (Ubuntu: apt-get install libtagc0-ruby)
Vejam como é simples e adaptem para as suas necessidades:
require "taglib" `ls BEATLES`.split("\n").each do |album| `ls "BEATLES/#{album}"`.split("\n").each do |filename| path="BEATLES/#{album}/#{filename}" if filename.match(/mp3$/) then file=TagLib::File.new(path) a=filename.split(" - ") track=a[a.length-2].to_i title=a[a.length-1].gsub(/\.mp3/, '') file.track=track file.genre="Pop/Rock" file.artist="The Beatles" file.album=album file.title=title file.save file.close else puts "Tem um lixo por aí... Delete '#{path}'!" end end end
Technorati Tags: ruby, programação, shell, utilitários, mp3, música, download, conversão
Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais
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
- 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.
