# Feedback esercizio per imparare Ruby

**URL:** <https://www.ruby-forum.com/t/feedback-esercizio-per-imparare-ruby/224517>\
**Category:** IT\
**Created:** [November 14, 2012, 7:49pm UTC](https://www.ruby-forum.com/t/feedback-esercizio-per-imparare-ruby/224517 "2012-11-14T19:49:08Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![aris](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/258eb7/32.png) [@aris](https://www.ruby-forum.com/u/aris)\
**Post date:** [November 14, 2012, 7:49pm UTC](https://www.ruby-forum.com/t/feedback-esercizio-per-imparare-ruby/224517/1 "2012-11-14T19:49:08Z")

</div>

Ciao ragazzi, sto leggendo un po’ di qua, un po’ di la per imparare il  
linguaggio e volevo mettermi alla prova con un vero esercizio.

Volevo creare un programmino che mi aiutasse a trovare la parola da  
indovinare per il gioco “Draw Me Something” (app iphone). Lo scopo del  
gioco e indovinare la parola che ha provato a disegnare l’altro.

Le variabili del gioco sono:

- le lettere che hai a disposizione (10 max) per poter formare la parola  
da indovinare
- il numero di lettere che è composta la parola da indovinare

Questo è il codice che ho scritto:

* * *

puts “scrivi le lettere a tua disposizione:”  
letters= gets.chomp  
puts “ecco le parole trovate:”

a = File.open(‘words.txt’,“r”).each\_line.map {|x| x.strip!}.to\_a  
a.compact!

## a.each.map do |word| next if word.each\_char.map {|letter| letters.include?letter}.include?false puts word.upcase end

come potete vedere sono stato costretto a creare un array (a) con tutte  
le parole contenute nel file per poterle iterare.  
Non ho capito perchè non funziona direttamente:

File.open(‘words.txt’,“r”).each\_line.map do |word|  
…  
…

Cosa ne pensate?  
come si poteva scriverlo meglio?  
Grazie

Alberto

PS: in allegato il file

---

<div class="post-metadata">

**Author:** ![albertobraschi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/87869e/32.png) [@albertobraschi](https://www.ruby-forum.com/u/albertobraschi)\
**Post date:** [November 14, 2012, 8:49pm UTC](https://www.ruby-forum.com/t/feedback-esercizio-per-imparare-ruby/224517/2 "2012-11-14T20:49:09Z")

</div>

2012/11/14 Alby B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Ciao ragazzi, sto leggendo un po’ di qua, un po’ di la per imparare il  
> linguaggio e volevo mettermi alla prova con un vero esercizio.

bravo!

> Volevo creare un programmino che mi aiutasse a trovare la parola da  
> indovinare per il gioco “Draw Me Something” (app iphone). Lo scopo del  
> gioco e indovinare la parola che ha provato a disegnare l’altro.

> * * *
> 
> puts “scrivi le lettere a tua disposizione:”  
> letters= gets.chomp  
> puts “ecco le parole trovate:”
> 
> a = File.open(‘words.txt’,“r”).each\_line.map {|x| x.strip!}.to\_a

occhio che qua hai un leak di un file descriptor, perch non chiudi il  
file. L’idioma che dovresti usare sempre

open(filename) do |fd|  
roba con fd  
end

ma in questo caso hai gi un File#readlines e puoi usare quello 🙂

> next if word.each\_char.map {|letter| letters.include?letter}.include?false

l’idioma “controlla se c’ un elemento con caratteristica X” #any?,  
quello per vedere che _tutti_ abbiano una caratteristica  
#all? quindi puoi fare

next if word.each\_char.all? {|letter| letters.include?letter}

> come potete vedere sono stato costretto a creare un array (a) con tutte  
> le parole contenute nel file per poterle iterare.  
> Non ho capito perch non funziona direttamente:
> 
> File.open(‘words.txt’,“r”).each\_line.map do |word|  
> …  
> …
> 
> Cosa ne pensate?

in teoria dovrebbe funzionare. Io avrei scritto cos infatti (untested)

puts “scrivi le lettere a tua disposizione:”  
letters= gets.chomp #chomp in teoria non serve qui  
puts “ecco le parole trovate:”  
open(‘words.txt’) do |fd|  
fd.each\_line do |line|  
puts line.upcase if line.strip.chars.all? {|c| letters.include?c}  
end  
end

–  
twitter: @riffraff  
blog (en, it): www.riffraff.info [riffraff.blogsome.com](http://riffraff.blogsome.com)  
work: [circleme.com](http://circleme.com)

---

<div class="post-metadata">

**Author:** ![albertobraschi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/87869e/32.png) [@albertobraschi](https://www.ruby-forum.com/u/albertobraschi)\
**Post date:** [November 20, 2012, 6:21pm UTC](https://www.ruby-forum.com/t/feedback-esercizio-per-imparare-ruby/224517/3 "2012-11-20T18:21:11Z")

</div>

Grazie Gabriele.  
una volta che ho visto che funzionava compilandolo in un semplice file  
ruby, ho provato a fare una app con Sinatra dove non ho usato un db ma  
un semplice file (che la puoi vedere qui:  
[https://github.com/albybisy/DrawMeHelp](https://github.com/albybisy/DrawMeHelp)).

Come si può vedere ho creato un metodo “filter” (vedi sotto) per tirarmi  
fuori l’array con le parole trovate nel file e poi stamparle.

* * *

require ‘rubygems’  
require ‘sinatra’

#CONTROLLERS

class String  
def filter  
open(‘words.txt’) do |fd|  
fd.select do |line|  
line.upcase if line.strip.chars.all? {|c| self.include?c}  
end  
end  
end  
end

##ROUTES

get “/” do  
@title= “draw me something solutions”  
erb :index  
end

post ‘/words’ do  
@title=“draw me something solutions”  
letters= params[:letters]  
@words= letters.filter  
erb :words  
end

get ‘/new’ do  
@title=“add a new word:”  
erb :new  
end

## post ‘/new’ do File.open(“words.txt”, ‘a’) {|f| f.puts(params[:word]) } redirect “/” end

> Il mio dubbio è se era necessario indicare la classe String per il metodo o no.  
> Localmente l’app funziona, ma quando provo a deployarla in heroku non funziona  
> ([http://drawmehelp.herokuapp.com/](http://drawmehelp.herokuapp.com/)). So che heroku non permette la scrittura sui  
> file, ma dovrebbe lo stesso leggerli. Sbaglio qualcosa? in allegato il log  
> Altri feedback e suggerimenti sono ben accetti

Grazie in anticipo  
Ciao

Alberto 🙂
