## 5 Luova kone **Tehtävä:** Luvun viimeinen tehtävä on hieman tavallisuudesta poikkeava, sillä tiedostoja apuna käyttäen tarkoituksenamme on rakentaa luovia ideoita ehdottava ohjelma. 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. 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]". Toimiessaan oikein ohjelma voi ehdottaa vaikka seuraavaa: Example output: ``` Uuden jutun nimi voisi olla vaikkapa seuraava: Punaisen hanhen kertomus ``` **Vastaus** ``` #!/usr/bin/env ruby # coding: utf-8 adjektiiviTiedosto = "5-5a_tiedosto.txt" substantiiviTiedosto = "5-5b_tiedosto.txt" tarinatyyppiTiedosto = "5-5c_tiedosto.txt" def luoTiedosto(tiedosto) if (!File.exists?(tiedosto)) begin File.open(tiedosto, File::RDWR|File::CREAT, 0644) rescue puts "Tiedostoon #{tiedosto} ei voida kirjoittaa" Process.exit(1) end end end def kirjoita(tiedostohash) tiedostohash.each { |tiedosto, sanat| luoTiedosto(tiedosto) File.open(tiedosto, "w+:UTF-8") do |f| f.flock(File::LOCK_EX) sanat.each { |word| f.puts word } end } end kirjoita( { #adjektiiviTiedosto => ["iso", "tarpeeton", "kirkas"], #substantiiviTiedosto => ["poliisi", "palomies", "vesipullo"], #tarinatyyppiTiedosto => ["novelli", "kertomus", "tarina", "balladi"] adjektiiviTiedosto => ["ison", "tarpeettoman", "kirkkaan"], substantiiviTiedosto => ["poliisin", "palomiehen", "vesipullon"], tarinatyyppiTiedosto => ["novelli", "kertomus", "tarina", "balladi"] } ) ######################################## def arvoLause(tiedostolista) lauseenSanat = [] for tiedosto in tiedostolista sanaLista = [] if (File.readable?(tiedosto)) File.foreach(tiedosto) do |line| sanaLista.insert(-1, line.to_s.chomp) end arvottuSana = sanaLista[rand(0...(sanaLista.length - 1))] lauseenSanat.insert(-1, arvottuSana) end end return lauseenSanat.join(" ").capitalize end printf("Uuden jutun nimi voisi olla vaikkapa seuraava:\n%s\n", arvoLause([adjektiiviTiedosto, substantiiviTiedosto, tarinatyyppiTiedosto]) ) ```