Feedback esercizio per imparare Ruby

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

2012/11/14 Alby B. [email protected]:

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 :slight_smile:

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

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 :slight_smile: