|
|
- ## 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])
- )
- ```
|