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
on 2012-11-14 19:49
on 2012-11-14 20:49
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
on 2012-11-20 18:21
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
Log in with Google account | Log in with Yahoo account
No account? Register here.