Forum: Italian Ruby user group feedback esercizio per imparare Ruby

Posted by Alberto Bissacco (albyb)
on 2012-11-14 19:49
Attachment: words.txt (12,7 KB)
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
Posted by gabriele renzi (Guest)
on 2012-11-14 20:49
(Received via mailing list)
2012/11/14 Alby Bisy <albybisy@tin.it>:
> 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.

<snip>




> ----------------------------------------------
> 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
work: circleme.com
Posted by Alberto Bissacco (albyb)
on 2012-11-20 18:21
Attachment: heroku_logs.txt (822 Bytes)
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).

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/). 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 :)
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.