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.

125 lines
5.1 KiB

4 years ago
  1. ## 3 Sensuroija
  2. **Tehtävä:**
  3. Luvun kolemannessa tehtävässä tehdään jälleen yleishyödyllisiä toimintoja, ja luodaan vähästä harmistuvia varten työkalu, jolla on helppo poistaa vaarallisia ajatuksia ja sanoja tekstistä. Toisin sanoen, teemme sensurointityökalun, jolla tuhma teksti voidaan muuttaa näppärästi ketään loukkaamattomaan muotoon.
  4. Rakenteellisesti ohjelma on varsin yksinkertainen. Tiedostoon "6-3a_tiedosto.txt" on tallennettu sanoja tai merkkiyhdistelmiä yksi per rivi. Tiedostossa "6-3c_tiedosto.txt" on teksti, joka saattaa sisältää näitä sensuroitaviksi haluttavia sanoja tai kirjainyhdistelmiä. A-tiedoston sanat ja merkkiyhdistelmät siis luetaan taulukkoon, ja C-tiedoston tekstistä poistetaan kaikki A-taulukossa olevat sanat ja kirjainyhdistelmät, korvaten ne viidellä tähti (*****)-merkillä.
  5. Kun vaihto on tehty, tulostetaan ruudulle teksti "Tallennetaan siistitty versio...", ja kirjoitetaan siistitty teksti tiedostoon "6-3b_tiedosto.txt". Lopuksi vielä tulostetaan ruudulle teksti "Valmis! Lopetetaan."
  6. Toimiessaan oikein ohjelma tulostaa seuraavaa:
  7. Example output:
  8. ```
  9. Tallennetaan siistitty versio...
  10. Valmis! Lopetetaan.
  11. ```
  12. **Vastaus**
  13. ```
  14. #!/usr/bin/env ruby
  15. # coding: utf-8
  16. sensuurisanatTiedosto = "6-3a_tiedosto.txt"
  17. tekstiTiedosto = "6-3c_tiedosto.txt"
  18. kohdeTiedosto = "6-3b_tiedosto.txt"
  19. $_sensuurimerkki = "*"
  20. $_sensuurimerkkiMaara = 5
  21. def luoTiedosto(tiedosto)
  22. if (!File.exists?(tiedosto))
  23. begin
  24. File.open(tiedosto, File::RDWR|File::CREAT, 0644)
  25. rescue
  26. puts "Tiedostoon #{tiedosto} ei voida kirjoittaa"
  27. Process.exit(1)
  28. end
  29. end
  30. end
  31. def kirjoita(tiedostohash)
  32. tiedostohash.each { |tiedosto, sanat|
  33. luoTiedosto(tiedosto)
  34. File.open(tiedosto, "w+:UTF-8") do |f|
  35. f.flock(File::LOCK_EX)
  36. sanat.each { |word| f.puts word }
  37. end
  38. }
  39. end
  40. kirjoita(
  41. {
  42. tekstiTiedosto => ["Monesti kuitenkin käy niin, että lataan jonkin moduulin tai koitan selvitellä mistä vitusta oikein on keksinyt vaatia kaiken mahdollisen tupleina, tai vaihtoehtoisesti haluaisin käyttää jotain umpimielistä paskaa tekemään monimutkaisia asioita. Älä keksi pyörää uudestaan” on mielestäni ihan hyvä periaate; ikävä kyllä alkuperäisen keksijä jättää monesti kertomatta mihin tätä uutta hienoa pyörää voisi käyttää. Helpot tapaukset on niitä, joissa API on kuvattu skriptillä pureskeltuna generoituna tekstinä, joka ei aukea oikeastaan sen enempää kuin itse lähdesontakaan. Kehittäjille ehkä hyödyllinen, käyttäjille vihamielinen. Pahimmillaan olen nähnyt tilanteita, missä kaksi, jopa kolme, idioottia ovat keskenään ristiriitaisia ja neuvovat tekemään asiat eri tavoin, tai painottavat täysin eri asioita. Lopulta usein tuleekin paskaa, että on kokoamassa pelkkiin faktoihin perustuvaa kuvausta urheilukilpailusta haastattelemalla ulos heitettyjä humaltuneita katsojia, tai olevansa loukussa ”yksi valehtelee aina, yksi joskus ja loput puhuu totta”-tyyppisessä logiikkatestissä.","", "Mutta joo. Jo ohjelmistotekniikan peruskurssilla opetetaan, että ainoa asia joka on huonompi kuin puutteellinen ohjelmointi on virheellinen ohjelmointi, ja että kaikista viisain eläin on majava joka sukeltaa sateelta suojaan. Dokumentaatio ja käyttöohjeet voivat monesti vaikuttaa turhalta perseeltä, mutta ne eivät olekkaan tarkoitettu devaajille itselleen, vaan niille jotka käyttävät heidän tekemiään työkaluja. Ja vaikka ajatus vahingon kiertämään laittamisesta voikin houkuttaa, olisi siinä tapauksessa harkitsemisen arvoista ennemmin ryhtyä vaikka autokauppiaaksi.",""],
  43. sensuurisanatTiedosto => ["moduuli", "vitu", "paskaa", "sonta", "idiootti", "ohjelm", "perse"]
  44. }
  45. )
  46. ########################################
  47. def muodostaLista(tiedosto)
  48. sanalista = []
  49. if (File.readable?(tiedosto))
  50. File.foreach(tiedosto) do |line|
  51. sanalista.insert(0, line.chomp)
  52. end
  53. end
  54. return sanalista
  55. end
  56. def sensuroiSanat(tekstiTiedosto, sanaTiedosto)
  57. korvaavaSana = ""
  58. i = 0
  59. while i < $_sensuurimerkkiMaara
  60. korvaavaSana += $_sensuurimerkki
  61. i += 1
  62. end
  63. sensuuriLista = muodostaLista(sanaTiedosto)
  64. korvaavatRivit = []
  65. if (File.readable?(tekstiTiedosto))
  66. File.foreach(tekstiTiedosto) do |line|
  67. #rivinUudetSanat = []
  68. uusiRivi = []
  69. #for sana in line.split(" ")
  70. # TODO Add upper/lowercase support
  71. for sensuuriSana in sensuuriLista
  72. line = line.gsub(sensuuriSana, korvaavaSana)
  73. end
  74. uusiRivi.insert(-1, line)
  75. korvaavatRivit.insert(-1, uusiRivi)
  76. end
  77. end
  78. return korvaavatRivit
  79. end
  80. def kirjoitaTiedostoon(tiedosto, lista)
  81. File.open(tiedosto, "w+:UTF-8") do |f|
  82. puts "Tallennetaan siistitty versio..."
  83. f.flock(File::LOCK_EX)
  84. #lista.each { |rivi| f.print rivi }
  85. f.puts lista
  86. end
  87. puts "Valmis! Lopetetaan."
  88. end
  89. kirjoitaTiedostoon(kohdeTiedosto, sensuroiSanat(tekstiTiedosto, sensuurisanatTiedosto))
  90. ```