Ruby-Lotto-Checker

mikka 07.05.04 22:42

Tarkista lottonumerosi pragmaattisesti Ruby-skriptillä

 Tekstiversio  Arvo: 0 (0 ääntä)  Äänestä: +  -
#! /usr/local/bin/ruby -w

# Ruby-Lotto-Checker
#
# Noutaa kierroksen lottonumerot Veikkauksen sivuilta ja
# vertaa riviä tekstitiedostossa oleviin riveihin.
# Tiedostossa rivit on eroteltu rivinvaihdoilla ja rivien
# numerot välilyönneillä tai tabulaattorilla.
# Tiedoston nimen voi antaa argumenttina ohjelmalle esim.
# $ ./lotto.rb nums.txt
# Jos nimeä ei anneta, käytetään oletustiedostoa numerot.txt.
#
# Ohjelma tietysti lopettaa toimintansa jos Veikkaus joskus
# ottaa vanhan tulossivun pois käytöstä tai sen muoto muuttuu
# radikaalisti. Silloin täytyy vaihtaa fetchURL ja/tai muuttaa
# fetchNumbers-metodin regexpit.
#
# Testattu Ruby 1.8.1


require('net/http')
require('uri')

# Tiedoston nimi jossa pelatut numerot, jos
# tiedoston nimeä ei ole annettu argumenttina
filename = "numerot.txt"
filename = (ARGV[0] || filename)

# Urli josta oikeat numerot haetaan
fetchURL = "http://www.veikkaus.fi/script/" + 
    "peli/tuoreimmat_INFO0060.jsp?p_pelikdi=21"

class Lotto
    
    # Konstruktori joka myös ajaa ohjelman
    def initialize(p_filename, p_url)
        # Jäsenmuuttujat
        @filename = p_filename
        @fetchurl = p_url
        @message = ""

        # Numerotaulukot
        @aPlayedNums = Array.new
        @aWinningNums = Array.new
        @aExtraNums = Array.new
        @aHits = Array.new

        # Metodikutsut
        readFile
        fetchNumbers
        checkMatches
        printMatches
    end # initialize
    
    # Hakee oikeat numerot urlista @fetchurl
    # sekä parsii ne taulukoihin @aWinningNums ja @aExtraNums 
    def fetchNumbers
        fetchdata = Net::HTTP.get URI.parse(@fetchurl) # http-kutsu
        # Poista kaikki html-tagit
        fetchdata.gsub!(/<[^>]*>/, "")
        # Lue kierroksen numero
        parsemessage = /Kierroksen\s+\d+.+\n/.match(fetchdata).to_s
        # Lue oikeat numerot
        parsenums = /^\s*(\d{1,2}\s+){7}/.match(fetchdata)
        # Lue lisänumerot
        parseextranums = /^\s*(\d{1,2}\s+){3}[^\d]/.match(fetchdata).to_s
        # Poista roinat lisänumeroista
        parseextranums.gsub!(/[^0-9\s]/, "")

        # Jos jokin yllä olevista menee pieleen...
        unless parsemessage && parsenums && parseextranums
            puts "Sivua ei voitu hakea tai sen muoto on väärä"
            exit
        end

        # Muunna numerot integereiksi jotta &-operaattori toimisi oikein
        @message = parsemessage.chomp
        @aWinningNums = parsenums.to_s.split.collect! {|i| i.to_i}
        @aExtraNums = parseextranums.split.collect! {|i| i.to_i}
    end # fetchNumbers

    # Lukee tiedostosta pelatut numerot
    # sekä parsii ne taulukkoon @aPlayedNums
    def readFile
        # Lopetetaan jos tiedostoa ei voida avata
        unless FileTest.file?(@filename) && FileTest.readable?(@filename)
            puts "Tiedostoa '#{@filename}' ei voitu avata"
            exit
        end
        # Luetaan numerot tiedostosta rivi kerrallaan
        File.open(@filename, "r") do |fFile|
            fFile.each do |row|
                # Numerot taas integereiksi
                @aPlayedNums.push( row.split.collect! {|i| i.to_i} )
            end
        end
    end # readFile

    # Tarkistaa numerot
    def checkMatches
        @aPlayedNums.each do |aRow|
            aNums = (aRow & @aWinningNums).length
            aExtranums = (aRow & @aExtraNums).length
            @aHits.push( [aNums, aExtranums] )
        end
    end # checkMatches

    # Tulostaa tulokset ruudulle
    def printMatches
        print "#{@message} #{@aWinningNums.join(',')}"
        print " + #{@aExtraNums.join(',')}\n"
        rowcounter = 0
        @aHits.each do |i|
            print "Rivi #{rowcounter+=1}, osumia: #{i[0].to_s} + #{i[1].to_s}"
            print " Voittoisa rivi!" if i[0] > 3
            print "\n"
        end
    end # printMatches

    private :fetchNumbers, :readFile, :checkMatches, :printMatches
end

# Aja ohjelma
lotto = Lotto.new(filename, fetchURL)