# My Boggle Solver: I welcome any tips and tricks!

**URL:** <https://www.ruby-forum.com/t/my-boggle-solver-i-welcome-any-tips-and-tricks/129293>\
**Category:** Ruby\
**Created:** [February 16, 2008, 6:35am UTC](https://www.ruby-forum.com/t/my-boggle-solver-i-welcome-any-tips-and-tricks/129293 "2008-02-16T06:35:46Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![stedwick](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/90ced4/32.png) [@stedwick](https://www.ruby-forum.com/u/stedwick)\
**Post date:** [February 16, 2008, 6:35am UTC](https://www.ruby-forum.com/t/my-boggle-solver-i-welcome-any-tips-and-tricks/129293/1 "2008-02-16T06:35:46Z")

</div>

So, I wrote a Boggle solver so that I could win at Scramble and  
Griddle on Facebook, and it works great! However, I’m pretty new at  
Ruby, so if you know any “rubyisms” or “ruby ways” that would help  
clean up my program, feel free to give some pointers =) Code below:

$words = {}  
$stems = {}  
File.open(“enable.txt”,“r”).each do |line|  
word = line.chomp  
$words[word] = true

0.upto(word.size-2) do |i|  
$stems[word[0…i]] = true  
end  
end

puts “Enter Boggle board as a string of letters:”  
letters = gets.chomp

$H = 4  
$W = 4  
if letters.size != $H\*$W  
puts “Wrong board size.”  
exit  
end

i=0  
$board = Array.new($H) { Array.new($W) }  
0.upto($H-1) do |h|  
0.upto($W-1) do |w|  
$board[h][w] = letters[i…i]  
i+=1  
end  
end

$used = Array.new($H) { Array.new($W) { false } }

$found = {}  
def solve(h, w, word = ‘’)  
$used[h][w] = true  
word += $board[h][w]  
$found[word] = true if word.size \> 2 and $words[word]

if $stems[word]  
-1.upto(1) do |r|  
-1.upto(1) do |c|  
y = h+r  
x = w+c  
next unless (0…$H-1) === y  
next unless (0…$W-1) === x  
next if $used[y][x]  
solve(y, x, word)  
end  
end  
end

$used[h][w] = false  
end

0.upto($H-1) do |h|  
0.upto($W-1) do |w|  
solve(h,w)  
end  
end

found\_words = $found.keys.sort\_by { |x| x.size }  
found\_words.each { |x| puts x }  
puts  
$board.each { |x| puts x.to\_s }

---

<div class="post-metadata">

**Author:** ![stedwick](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/90ced4/32.png) [@stedwick](https://www.ruby-forum.com/u/stedwick)\
**Post date:** [February 16, 2008, 7:20am UTC](https://www.ruby-forum.com/t/my-boggle-solver-i-welcome-any-tips-and-tricks/129293/2 "2008-02-16T07:20:51Z")

</div>

On Feb 15, 11:34 pm, Stedwick [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> $words = {}  
> $stems = {}  
> File.open(“enable.txt”,“r”).each do |line|  
> word = line.chomp  
> $words[word] = true
> 
> 0.upto(word.size-2) do |i|  
> $stems[word[0…i]] = true  
> end  
> end

IO.foreach(“enable.txt”){|word|  
word.strip!  
$words[word] = true  
(0…word.size).each{|i|  
$stems[word[0,i] ] = true  
}  
}

---

<div class="post-metadata">

**Author:** ![stedwick](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/90ced4/32.png) [@stedwick](https://www.ruby-forum.com/u/stedwick)\
**Post date:** [February 16, 2008, 7:32am UTC](https://www.ruby-forum.com/t/my-boggle-solver-i-welcome-any-tips-and-tricks/129293/3 "2008-02-16T07:32:34Z")

</div>

On Feb 16, 12:17 am, William J. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > end  
> > end
> 
> IO.foreach(“enable.txt”){|word|  
> word.strip!  
> $words[word] = true  
> (0…word.size).each{|i|  
> $stems[word[0,i] ] = true  
> }}

Shorter:

IO.foreach(“data”){|word|  
$words[word.strip!] = true  
(0…word.size).each{|i|  
$stems[word[0,i] ] = true  
}  
}

---

<div class="post-metadata">

**Author:** ![stedwick](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/90ced4/32.png) [@stedwick](https://www.ruby-forum.com/u/stedwick)\
**Post date:** [February 16, 2008, 8:45am UTC](https://www.ruby-forum.com/t/my-boggle-solver-i-welcome-any-tips-and-tricks/129293/4 "2008-02-16T08:45:48Z")

</div>

> $words = {}

IMHO you might also want to try to avoid using global variables. A  
better solution usually is to use “normal” variables or to wrap it up  
in a class/module and use class/instance variables. Or collect the  
parameters in a hash and pass that around.
