Ruby fundamentals through coding exercises
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
2.8 KiB

4 years ago
  1. ## 3 Salasanageneraattori
  2. **Tehtävä:**
  3. 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.
  4. 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.
  5. Toimiessaan oikein ohjelma tulostaa seuraavaa:
  6. Example output:
  7. ```
  8. Luodaan salasana.
  9. Anna 1. luku väliltä 0-999: 234
  10. Anna 2. luku väliltä 0-999: 22
  11. Anna 3. luku väliltä 0-999: 1
  12. Anna 4. luku väliltä 0-999: 76
  13. Anna 5. luku väliltä 0-999: 45
  14. Anna 6. luku väliltä 0-999: 23
  15. Anna 7. luku väliltä 0-999: 27
  16. Anna 8. luku väliltä 0-999: 87
  17. Anna 9. luku väliltä 0-999: 3
  18. Ohjelma loi salasanan cf5HAsu66
  19. ```
  20. **Vastaus**
  21. ```
  22. #!/usr/bin/env ruby
  23. # coding: utf-8
  24. require 'securerandom'
  25. merkkiTiedosto = "7-3_tiedosto.txt"
  26. def luoTiedosto(tiedosto)
  27. if (!File.exists?(tiedosto))
  28. begin
  29. File.open(tiedosto, File::RDWR|File::CREAT, 0644)
  30. rescue
  31. warn "Tiedostoon #{tiedosto} ei voida kirjoittaa"
  32. Process.exit(1)
  33. end
  34. end
  35. end
  36. def kirjoitaRandom(tiedosto, maara)
  37. File.open(tiedosto, "w+:UTF-8") do |f|
  38. f.flock(File::LOCK_EX)
  39. f.puts SecureRandom.urlsafe_base64(maara)
  40. end
  41. end
  42. luoTiedosto(merkkiTiedosto)
  43. kirjoitaRandom(merkkiTiedosto, 1000)
  44. ##################################################
  45. def salasanaGeneraattori(tiedosto, merkkimaara, lukuvali)
  46. merkit = []
  47. i = 0
  48. salasana = ""
  49. if lukuvali.length != 2
  50. warn "Lukuvälin täytyy koostua alarajasta ja ylärajasta, jotka annetaan kokonaislukuina."
  51. return
  52. end
  53. if (File.readable?(tiedosto))
  54. File.foreach(tiedosto) do |line|
  55. merkit += line.chomp.split("")
  56. end
  57. end
  58. if merkit.length < lukuvali[1]
  59. warn "Annettu yläraja #{lukuvali[1]} on suurempi kuin merkkien määrä tiedostossa (#{merkit.length})."
  60. warn "Sallittu yläraja asetetaan arvoon #{merkit.length}."
  61. end
  62. puts "Luodaan salasana."
  63. while i < 9
  64. begin
  65. print "Anna #{i+1}. luku väliltä #{lukuvali[0]}-#{lukuvali[1]}: "
  66. valinta = Integer(gets.chomp)
  67. salasana += merkit[valinta].to_s
  68. rescue
  69. warn "Et antanut kokonaislukua. Yritä uudelleen."
  70. next
  71. end
  72. i += 1
  73. end
  74. puts "Ohjelma loi salasanan #{salasana}"
  75. end
  76. salasanaGeneraattori(merkkiTiedosto, 9, [0,999])
  77. ```