[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Scrabble Stems Ruby Quiz question.

Mark Woodward

12/2/2007 2:49:00 AM

Hi all,

could someone explain the line:
(STEMS[stem] ||= {})[letter] = 1
in the code below?
This is a solution (Carlos) from the Scrabble Stems Ruby quiz.

---------------------------------------------------------------
DICT = "/usr/share/dict/words"
CUTOFF = ARGV[0].to_i

STEMS = {}

File.open(DICT) do |f|
f.each do |word|
word.chomp!
next if word.length != 7
word.downcase!
letters = word.split(//).sort!
uniques = letters.uniq
word = letters.join
uniques.each do |letter|
stem = word.sub(letter, "")
(STEMS[stem] ||= {})[letter] = 1
end
end
end

result = STEMS.delete_if { |k,v| v.size < CUTOFF }.
sort_by { |k,v| v.size }.
reverse!.
collect! { |k,v| [k, v.size] }

result.each do |stem, combining| puts "#{stem} #{combining}" end
---------------------------------------------------------------


cheers,

--
Mark
2 Answers

yermej

12/2/2007 4:06:00 AM

0

On Dec 1, 8:48 pm, Mark Woodward <markonli...@internode.on.net> wrote:
> Hi all,
>
> could someone explain the line:
> (STEMS[stem] ||= {})[letter] = 1
> in the code below?

It's equivalent to:

STEMS[stem] = STEMS[stem] || {}
STEMS[stem][letter] = 1

Where that first line means: if STEMS[stem] isn't defined, assign a
new Hash to it.

It could also be done like this:

STEMS = Hash.new {|h, k| h[k] = {}} # near the top of your example
code

STEMS[stem][letter] = 1 # and this in place of the line you asked
about

Hash.new allows you to use a block to define the behavior of the hash
if the element isn't found. With no block (as in the example code you
posted), nil is returned.

Mark Woodward

12/2/2007 4:40:00 AM

0

Hi Yermej,

On Sat, 1 Dec 2007 20:05:45 -0800 (PST)
yermej <yermej@gmail.com> wrote:

> On Dec 1, 8:48 pm, Mark Woodward <markonli...@internode.on.net> wrote:
> > Hi all,
> >
> > could someone explain the line:
> > (STEMS[stem] ||= {})[letter] = 1
> > in the code below?
>
> It's equivalent to:
>
> STEMS[stem] = STEMS[stem] || {}
> STEMS[stem][letter] = 1

The '[letter] = 1' appended to the end was the bit I didn't understand.

Definitely easier to read as your e.g. above. But I guess once you know
the syntax (STEMS[stem] ||= {})[letter] = 1 makes sense. A bit too
'Perlish' for a newbie though ;-)

>
> Where that first line means: if STEMS[stem] isn't defined, assign a
> new Hash to it.
>
> It could also be done like this:
>
> STEMS = Hash.new {|h, k| h[k] = {}} # near the top of your example
> code
>
> STEMS[stem][letter] = 1 # and this in place of the line you asked
> about
>
> Hash.new allows you to use a block to define the behavior of the hash
> if the element isn't found. With no block (as in the example code you
> posted), nil is returned.


thanks,


--
Mark