Ruby-Lotto-CheckerTarkista lottonumerosi pragmaattisesti Ruby-skriptillä #! /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)
|
  Haku

|