From: Dave Burt Date: 2005-03-28T19:09:51+09:00 Subject: Re: [SOLUTION][QUIZ] English Numerals (#25) - "When the integers 1 to 10_000_000_000 are written in the English language, then sorted as strings, which odd number appears first in the list?" This is a really interesting question. There's a little more creativity in the answer than I feel comfortable delegating to my computer at this point, so my answer is incomplete. I haven't "determined [the answer] programmatically" as required, I've used a computer to help me find the answer. I figure a proper brute force would be at least a couple of days in the solving anyway. My answer is that "a baker's dozen" comes immediately before "a billion, a hundred and eight thousand, a hundred and eighty five". I haven't yet enhanced my program to give me this result :) - Would the answer change for a larger range of values, say 10**30? I don't believe it would, as "billion" < ['trillion', 'quadrillion', 'quintillion', 'sextillion', 'septillion', 'octillion', 'nonillion', 'decillion', 'undecillion', 'duodecillion', 'tredecillion', 'quattuordecillion', 'quindecillion', 'sexdecillion', 'septendecillion', 'octodecillion', 'novemdecillion', 'vigintillion'].min - Do French and German Rubyists get a different answer than the Americans? I think the answer is either yes or no depending on whether your answer is the number or the words. I believe the words for the French/German interpretation are the same, but the meaning of the billion is different (1_000_000_000_000 rather than 1_000_000_000). Here is my helper program, in case anyone considers it relevant :) Cheers, Dave # load my translation of the Perl modules Number::Spell and # Lingua::EN::Numericalize (see CPAN) require 'numeric-english' # add to_english method to integers class Integer; include Numeric::English end a = [] # return the english representation of the given integer if it is less than # the one stored in memo (otherwise return memo). inject_proc = proc do |memo, int| if int[0] == 0 # test low bit memo # ignore even numbers else english = int.to_english if english < memo english else memo end end end # I'm not sure why I chose these partitions of the problem space. I think it's # something to do with independent sections of numbers. We group in threes. # check numbers one to a million a << (0..1_000_000).inject('zzz', &inject_proc) # check numbers from a million to a billion a << (0..1_000).map{|x| x * 1_000_000 + 1 }.inject('zzz', &inject_proc) # check numbers from a billion to ten billion a << (0..10).map{|x| x * 1_000_000_000 + 1 }.inject('zzz', &inject_proc) # this result is a list of words which have to be combined in an interesting # way that I haven't formalized. Sorry. p a __END__ Output: ["eight hundred eight thousand eight hundred eighty five", "eight hundred eight million five", "eight billion five"]