Skip to content

Instantly share code, notes, and snippets.

@brenopoggiali
Last active January 30, 2019 17:36
Show Gist options
  • Save brenopoggiali/6ee0e28394cb7df70692733869241d17 to your computer and use it in GitHub Desktop.
Save brenopoggiali/6ee0e28394cb7df70692733869241d17 to your computer and use it in GitHub Desktop.
Program that prints the number of lines spoken by each character in "The Tragedy of Macbeth" by Shakespeare to train my Ruby skills
source 'https://rubygems.org'
ruby '2.5.1'
gem "nokogiri", "~> 1.10.1"
require 'nokogiri'
require 'open-uri'
print "Copy your play.xml URL here: "
play = gets.chomp
doc = Nokogiri::XML(open(play))
speeches = doc.xpath('//SPEECH')
people = Hash.new
speeches.each do |speech|
person = speech.at('./SPEAKER').content
people[person] ||= 0
speech.xpath('LINE').each do |line|
people[person] += 1
end
end
people.reject! { |key, value| key == "ALL" }
people = people.sort { |key, value| value[1]<=>key[1] }
people.each do |person, lines|
puts "#{lines} #{person}"
end
@philipefarias
Copy link

Ficou bacana!
Utilizou bastante os métodos de Enumerable, especificamente os de Hash. Isso é bem importante para programar bem em Ruby.
Também utilizou uma lib de terceiros (Nokogiri) e manteve a formatação consistente e alinhada com os padrões da linguagem.

Tenho alguns desafios extras agora (pode adicionar mais arquivos no gist):

  1. Utilizar apenas a Standard Library do Ruby (por exemplo, não utilizar o Nokogiri)
  2. Evitar o uso de variáveis intermediárias
  3. Utilizar o Nokogiri mas de forma mais organizada, com o Bundler
  4. Abstrair para permitir passar outras peças que possuem a mesma estrutura em XML

@brenopoggiali
Copy link
Author

@philipefarias

Ficou bacana!
Utilizou bastante os métodos de Enumerable, especificamente os de Hash. Isso é bem importante para programar bem em Ruby.
Também utilizou uma lib de terceiros (Nokogiri) e manteve a formatação consistente e alinhada com os padrões da linguagem.

Tenho alguns desafios extras agora (pode adicionar mais arquivos no gist):

  1. Utilizar apenas a Standard Library do Ruby (por exemplo, não utilizar o Nokogiri)
  2. Evitar o uso de variáveis intermediárias
  3. Utilizar o Nokogiri mas de forma mais organizada, com o Bundler
  4. Abstrair para permitir passar outras peças que possuem a mesma estrutura em XML

Dei uns improvements nele, mas continuei usando o Nukogiri mesmo. Tentei começar sem, mas vi que ia acabar demorando muito hehe vou tentar acabar o curso de Rails hoje e já começar SQL. Abraços!

@brenopoggiali
Copy link
Author

Engraçado que não consegui usar o sort!. Imagino que talvez ele não funcione para Hash. Ai acabei fazendo people = mesmo

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment