This week’s quiz was fairly easy. The hardest part was finding and
choosing a way to turn the numbers into their English equivalents.
Initially I used an array that extended to TWENTY, but that was
insufficient. I had solved Ruby Q. #25 and some of the other old ones
myself a while ago, but lost it due to a harddrive crash and couldn’t
find a copy. I then just picked someone else’s solution to Ruby Q. #25
that added a to_en method to Integer.
Here’s my solution, minus the Integer#to_en method. I commented out the
code to print out the elements of the cycle, as it turns out the cycle
is about 430 elements long!
def count_and_say(str)
(‘A’…‘Z’).map{|l| (str.count(l) > 0) ?
[str.count(l).to_en.upcase, l] : “”}.join(’ ‘).squeeze(’ ')
end
order = ARGV[0].chomp.to_i
prev_results = {}
element = “LOOK AND SAY”
for n in (0…order)
if prev_results[element]
puts “Cycle of length #{n-prev_results[element]} starting” +
" at element #{prev_results[element]}"
#puts “Cycle’s elements are:”
#puts (prev_results[element]…n).to_a.map{|n|
prev_results.invert[n]}
break
else
prev_results[element] = n
end
element = count_and_say(element)
end
----- Original Message ----
From: Ruby Q. [email protected]
To: ruby-talk ML [email protected]
Sent: Thursday, September 6, 2007 7:00:20 AM
Subject: [QUIZ] Count and Say (#138)
The three rules of Ruby Q.:
-
Please do not post any solutions or spoiler discussion for this quiz
until
48 hours have passed from the time on this message. -
Support Ruby Q. by submitting ideas as often as you can:
- Enjoy!
Suggestion: A [QUIZ] in the subject of emails about the problem helps
everyone
on Ruby T. follow the discussion. Please reply to the original quiz
message,
if you can.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
by Martin DeMello
Conway’s “Look and Say” sequence
(Look-and-say sequence - Wikipedia) is a sequence of
numbers in
which each term “reads aloud” the digits of the previous term. For
instance, the
canonical L&S sequence starts off 1, 11, 21, 1211, 111221, …, because:
* 1 is read off as "one 1" or 11.
* 11 is read off as "two 1's" or 21.
* 21 is read off as "one 2, then one 1" or 1211.
* 1211 is read off as "one 1, then one 2, then two 1's" or 111221.
* 111221 is read off as "three 1, then two 2, then one 1" or 312211.
Over on rec.puzzles, Eric A. proposed a variant in which the letters of
a
sentence are grouped, then “counted aloud”, omitting the "s"s for the
plural
form. Thus, seeding the sequence with “LOOK AND SAY”, we get:
0. LOOK AND SAY
1. TWO A ONE D ONE K ONE L ONE N TWO O ONE S ONE Y
2. ONE A ONE D SIX E ONE K ONE L SEVEN N NINE O ONE S TWO T TWO W
ONE Y
3. ONE A ONE D TEN E TWO I ONE K ONE L TEN N NINE O THREE S THREE T
ONE V
THREE W ONE X ONE Y
and so on. (Note the difference between this and the L&S sequence–the
letters
are counted rather than read in order). Eric wants to know when the
sequence
enters a cycle, and how long that cycle is. Well?