From: Carl Porth Date: 2007-08-06T02:32:52+09:00 Subject: Re: Numbers Can Be Words (#133) Just a simple regex, the rest is just option parsing. #!/usr/bin/env ruby -wKU require "optparse" options = { :base => 16, :min_length => 1, :word_file => "/usr/share/dict/words", :case_insensitive => false } ARGV.options do |opts| opts.banner = "Usage: #{File.basename($PROGRAM_NAME)} [OPTIONS]" opts.separator "" opts.separator "Specific Options:" opts.on( "-b", "--base BASE", Integer, "Specify base (default #{options[:base]})" ) do |base| options[:base] = base end opts.on( "-l", "--min-word-length LENGTH", Integer, "Specify minimum length" ) do |length| options[:min_length] = length end opts.on( "-w", "--word-file FILE", "Specify word file", "(default #{options[:word_file]})" ) do |word_file| options[:word_file] = word_file end opts.on( "-i", "--ignore-case", "Ignore case distinctions in word file." ) do |i| options[:ignore_case] = true end opts.separator "Common Options:" opts.on( "-h", "--help", "Show this message." ) do puts opts exit end begin opts.parse! rescue puts opts exit end end last_letter = (options[:base] - 1).to_s(options[:base]) letters = ("a"..last_letter).to_a.join exit if letters.size.zero? criteria = Regexp.new("^[#{letters}]{#{options[:min_length]},}$", options[:ignore_case]) open(options[:word_file]).each do |word| puts word if word =~ criteria end On Aug 3, 6:01 am, Ruby Quiz wrote: > The three rules of Ruby Quiz: > > 1. Please do not post any solutions or spoiler discussion for this quiz until > 48 hours have passed from the time on this message. > > 2. Support Ruby Quiz by submitting ideas as often as you can: > > http://www.rubyquiz.com/ > > 3. Enjoy! > > Suggestion: A [QUIZ] in the subject of emails about the problem helps everyone > on Ruby Talk follow the discussion. Please reply to the original quiz message, > if you can. > > -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- =-=-= > > by Morton Goldberg > > When working with hexadecimal numbers it is likely that you've noticed some hex > numbers are also words. For example, 'bad' and 'face' are both English words and > valid hex numbers (2989 and 64206, respectively, in decimal). I got to thinking > that it would be interesting to find out how many and which hex numbers were > also valid English words. Of course, almost immediately I started to think of > generalizations. What about other bases? What about languages other than > English? > > Your mission is to pick a word list in some language (it will have be one that > uses roman letters) and write Ruby code to filter the list to extract all the > words which are valid numbers in a given base. For many bases this isn't an > interesting task--for bases 2-10, the filter comes up empty; for bases 11-13, > the filter output is uninteresting (IMO); for bases approaching 36, the filter > passes almost everything (also uninteresting IMO). However, for bases in the > range from 14 to about 22, the results can be interesting and even surprising, > especially if one constrains the filter to accept only words of some length. > > I used `/usr/share/dict/words` for my word list. Participants who don't have > that list on their system or want a different one can go to Kevin's Word List > Page (http://wordlist.sourceforge.net/) as a source of other word lists. > > Some points you might want to consider: Do you want to omit short words like 'a' > and 'ad'? (I made word length a parameter). Do you want to allow capitalized > words (I prohibited them)? Do you want to restrict the bases allowed (I didn't)?