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.
 

3.0 KiB

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