|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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 |
|
![]() |
| Outils de la discussion | |
|
|