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.

92 lines
3.0 KiB

4 years ago
  1. ## 5 Luova kone
  2. **Tehtävä:**
  3. Luvun viimeinen tehtävä on hieman tavallisuudesta poikkeava, sillä tiedostoja apuna käyttäen tarkoituksenamme on rakentaa luovia ideoita ehdottava ohjelma.
  4. Ohjelma toteutaan siten, että palvelimella on kolme tiedostoa "5-5a_tiedosto.txt","5-5b_tiedosto.txt" ja "5-5c_tiedosto.txt". Näistä ensimmäinen, "A"-tiedosto sisältää joukon adjektiiveja kuten iso, tarpeeton tai kirkas. "B"-tiedosto sisältää joukon substantiiveja, kuten poliisi, palomies tai vesipullo. "C"-tiedosto sisältää erilaisia tekstityyppejä kuten novelli, kertomus, tarina tai balladi. Jokaisessa tiedostossa on aina yksi sana per rivi, ja se on valmiiksi taivutettu oikeaan sijamuotoon.
  5. Ohjelma tekee siis seuraavaa; luetaan jokainen tiedosto omaan taulukkoonsa siten, että yksi rivi on aina yhdessä alkiossa. Tämän jälkeen arvotaan jokaisesta taulukosta yksi alkio, ja koostetaan niistä tarinan idea muodossa "[adjektiivi] [substantiivi] [tarinatyyppi]". Ohjelma tulostaa ajettaessa ainoastaan tekstin "Uuden jutun nimi voisi olla vaikkapa seuraava:\n [arvottu nimi]".
  6. Toimiessaan oikein ohjelma voi ehdottaa vaikka seuraavaa:
  7. Example output:
  8. ```
  9. Uuden jutun nimi voisi olla vaikkapa seuraava:
  10. Punaisen hanhen kertomus
  11. ```
  12. **Vastaus**
  13. ```
  14. #!/usr/bin/env ruby
  15. # coding: utf-8
  16. adjektiiviTiedosto = "5-5a_tiedosto.txt"
  17. substantiiviTiedosto = "5-5b_tiedosto.txt"
  18. tarinatyyppiTiedosto = "5-5c_tiedosto.txt"
  19. def luoTiedosto(tiedosto)
  20. if (!File.exists?(tiedosto))
  21. begin
  22. File.open(tiedosto, File::RDWR|File::CREAT, 0644)
  23. rescue
  24. puts "Tiedostoon #{tiedosto} ei voida kirjoittaa"
  25. Process.exit(1)
  26. end
  27. end
  28. end
  29. def kirjoita(tiedostohash)
  30. tiedostohash.each { |tiedosto, sanat|
  31. luoTiedosto(tiedosto)
  32. File.open(tiedosto, "w+:UTF-8") do |f|
  33. f.flock(File::LOCK_EX)
  34. sanat.each { |word| f.puts word }
  35. end
  36. }
  37. end
  38. kirjoita(
  39. {
  40. #adjektiiviTiedosto => ["iso", "tarpeeton", "kirkas"],
  41. #substantiiviTiedosto => ["poliisi", "palomies", "vesipullo"],
  42. #tarinatyyppiTiedosto => ["novelli", "kertomus", "tarina", "balladi"]
  43. adjektiiviTiedosto => ["ison", "tarpeettoman", "kirkkaan"],
  44. substantiiviTiedosto => ["poliisin", "palomiehen", "vesipullon"],
  45. tarinatyyppiTiedosto => ["novelli", "kertomus", "tarina", "balladi"]
  46. }
  47. )
  48. ########################################
  49. def arvoLause(tiedostolista)
  50. lauseenSanat = []
  51. for tiedosto in tiedostolista
  52. sanaLista = []
  53. if (File.readable?(tiedosto))
  54. File.foreach(tiedosto) do |line|
  55. sanaLista.insert(-1, line.to_s.chomp)
  56. end
  57. arvottuSana = sanaLista[rand(0...(sanaLista.length - 1))]
  58. lauseenSanat.insert(-1, arvottuSana)
  59. end
  60. end
  61. return lauseenSanat.join(" ").capitalize
  62. end
  63. printf("Uuden jutun nimi voisi olla vaikkapa seuraava:\n%s\n",
  64. arvoLause([adjektiiviTiedosto, substantiiviTiedosto, tarinatyyppiTiedosto])
  65. )
  66. ```