1votos

Resultado Eurocopa 2012 en Ruby

por alberto hace 5 años

Hay que instalar nokogiri. He utilizado la página de marca: http://www.marca.com/deporte/futbol/eurocopa/2012/cuadrofinal.html Espero que funcione, el html de esa página no es del todo consistente. Tiene en cuenta que la final se puede decidir a penalties, no lo he visto en otras soluciones.

Desafío dominguero para calcular de antemano si la selección española es campeona de la Eurocopa 2012

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#encoding:utf-8 
 
require 'nokogiri' 
require 'open-uri' 
 
module MarcaParser 
  extend self 
 
  def resultado_partido 
    partido = {} 
 
    html_resultados.each do |html_resultado_equipo| 
      partido[nombre_equipo(html_resultado_equipo)] = goles(html_resultado_equipo) 
    end 
    partido 
  end 
 
  private 
  def html_resultados 
    selector_partido = 'div.final div.equipo' 
    html.css(selector_partido) 
  end 
 
  def html 
    uri = 'http://www.marca.com/deporte/futbol/eurocopa/2012/cuadrofinal.html' 
    Nokogiri::HTML(open(uri)) 
  end 
 
  def nombre_equipo(html) 
    html.css('p').each do |nombre| 
      return nombre.content 
    end 
  end 
 
  def goles(html) 
    html.css('strong').each do |marcador| 
      return nil if marcador.content == '-' 
      return marcador.content.to_i unless marcador.content.include?('(') 
      return goles_en_penalties(marcador) 
    end 
  end 
 
  def goles_en_penalties(marcador) 
    marcador.css('span').each do |r| 
      return r.content.gsub(/\(|\)/, '').to_i 
    end 
  end 
end 
 
class Resultado 
  def initialize(marcador) 
    @marcador = marcador 
  end 
 
  def ganador 
    @marcador.max_by { |k,v| v.to_i }[0] if partido_acabado? 
  end 
 
  private 
  def partido_acabado? 
    !@marcador.all? { |k,v| v == nil } 
  end 
end 
 
module ResultadoDeEspana 
  def self.anunciar(ganador) 
    if ganador == "España" 
      "España campeón de la Eurocopa 2012" 
    elsif ganador 
      "España subcampeón de la Eurocopa 2012" 
    else 
      "La final no se ha disputado (o todavía no ha finalizado)" 
    end 
  end 
end 
 
marcador = MarcaParser.resultado_partido 
resultado = Resultado.new(marcador) 
p ResultadoDeEspana.anunciar(resultado.ganador) 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.