Tehtävä:
Luvun kolmas tehtävä on jälleen eräänlainen hyötyohjelma. Tällä kertaa tarkoituksena on luoda ohjelma, joka luo uusia sanasalasanoja, jotka muodostuvat yhdeksästä satunnaisesta kirjaimesta.
Ohjelmaa varten on luotu tiedosto 7-3_tiedosto.txt, jossa on 1000 satunnaista kirjain- ja numeromerkkiä. Tee seuraavaksi ohjelma, joka pyytää käyttäjältä 9 lukua väliltä 0-999 muodossa "Anna X. luku väliltä 0-999: ". Tämän jälkeen tee ohjelma, joka hakee tiedostosta lukua vastaavan merkin, eli jos käyttäjä antaa arvon 0, haetaan tiedoston ensimmäinen merkki, jos 876, haetaan merkki joka on tiedoston 876. paikalla.
Toimiessaan oikein ohjelma tulostaa seuraavaa:
Example output:
Luodaan salasana.
Anna 1. luku väliltä 0-999: 234
Anna 2. luku väliltä 0-999: 22
Anna 3. luku väliltä 0-999: 1
Anna 4. luku väliltä 0-999: 76
Anna 5. luku väliltä 0-999: 45
Anna 6. luku väliltä 0-999: 23
Anna 7. luku väliltä 0-999: 27
Anna 8. luku väliltä 0-999: 87
Anna 9. luku väliltä 0-999: 3
Ohjelma loi salasanan cf5HAsu66
Vastaus
#!/usr/bin/env ruby
# coding: utf-8
require 'securerandom'
merkkiTiedosto = "7-3_tiedosto.txt"
def luoTiedosto(tiedosto)
if (!File.exists?(tiedosto))
begin
File.open(tiedosto, File::RDWR|File::CREAT, 0644)
rescue
warn "Tiedostoon #{tiedosto} ei voida kirjoittaa"
Process.exit(1)
end
end
end
def kirjoitaRandom(tiedosto, maara)
File.open(tiedosto, "w+:UTF-8") do |f|
f.flock(File::LOCK_EX)
f.puts SecureRandom.urlsafe_base64(maara)
end
end
luoTiedosto(merkkiTiedosto)
kirjoitaRandom(merkkiTiedosto, 1000)
##################################################
def salasanaGeneraattori(tiedosto, merkkimaara, lukuvali)
merkit = []
i = 0
salasana = ""
if lukuvali.length != 2
warn "Lukuvälin täytyy koostua alarajasta ja ylärajasta, jotka annetaan kokonaislukuina."
return
end
if (File.readable?(tiedosto))
File.foreach(tiedosto) do |line|
merkit += line.chomp.split("")
end
end
if merkit.length < lukuvali[1]
warn "Annettu yläraja #{lukuvali[1]} on suurempi kuin merkkien määrä tiedostossa (#{merkit.length})."
warn "Sallittu yläraja asetetaan arvoon #{merkit.length}."
end
puts "Luodaan salasana."
while i < 9
begin
print "Anna #{i+1}. luku väliltä #{lukuvali[0]}-#{lukuvali[1]}: "
valinta = Integer(gets.chomp)
salasana += merkit[valinta].to_s
rescue
warn "Et antanut kokonaislukua. Yritä uudelleen."
next
end
i += 1
end
puts "Ohjelma loi salasanan #{salasana}"
end
salasanaGeneraattori(merkkiTiedosto, 9, [0,999])