[#6954] Why isn't Perl highly orthogonal? — Terrence Brannon <brannon@...>

27 messages 2000/12/09

[#7022] Re: Ruby in the US — Kevin Smith <kevinbsmith@...>

> Is it possible for the US to develop corporate

36 messages 2000/12/11
[#7633] Re: Ruby in the US — Dave Thomas <Dave@...> 2000/12/19

tonys@myspleenklug.on.ca (tony summerfelt) writes:

[#7636] Re: Ruby in the US — "Joseph McDonald" <joe@...> 2000/12/19

[#7704] Re: Ruby in the US — Jilani Khaldi <jilanik@...> 2000/12/19

> > first candidates would be mysql and postgressql because source is

[#7705] Code sample for improvement — Stephen White <steve@...> 2000/12/19

During an idle chat with someone on IRC, they presented some fairly

[#7750] Re: Code sample for improvement — "Guy N. Hurst" <gnhurst@...> 2000/12/20

Stephen White wrote:

[#7751] Re: Code sample for improvement — David Alan Black <dblack@...> 2000/12/20

Hello --

[#7755] Re: Code sample for improvement — "Guy N. Hurst" <gnhurst@...> 2000/12/20

David Alan Black wrote:

[#7758] Re: Code sample for improvement — Stephen White <steve@...> 2000/12/20

On Wed, 20 Dec 2000, Guy N. Hurst wrote:

[#7759] Next amusing problem: talking integers (was Re: Code sample for improvement) — David Alan Black <dblack@...> 2000/12/20

On Wed, 20 Dec 2000, Stephen White wrote:

[#7212] New User Survey: we need your opinions — Dave Thomas <Dave@...>

16 messages 2000/12/14

[#7330] A Java Developer's Wish List for Ruby — "Richard A.Schulman" <RichardASchulman@...>

I see Ruby as having a very bright future as a language to

22 messages 2000/12/15

[#7354] Ruby performance question — Eric Crampton <EricCrampton@...>

I'm parsing simple text lines which look like this:

21 messages 2000/12/15
[#7361] Re: Ruby performance question — Dave Thomas <Dave@...> 2000/12/15

Eric Crampton <EricCrampton@worldnet.att.net> writes:

[#7367] Re: Ruby performance question — David Alan Black <dblack@...> 2000/12/16

On Sat, 16 Dec 2000, Dave Thomas wrote:

[#7371] Re: Ruby performance question — "Joseph McDonald" <joe@...> 2000/12/16

[#7366] GUIs for Rubies — "Conrad Schneiker" <schneik@...>

Thought I'd switch the subject line to the subject at hand.

22 messages 2000/12/16

[#7416] Re: Ruby IDE (again) — Kevin Smith <kevins14@...>

>> >> I would contribute to this project, if it

17 messages 2000/12/16
[#7422] Re: Ruby IDE (again) — Holden Glova <dsafari@...> 2000/12/16

-----BEGIN PGP SIGNED MESSAGE-----

[#7582] New to Ruby — takaoueda@...

I have just started learning Ruby with the book of Thomas and Hunt. The

24 messages 2000/12/18

[#7604] Any corrections for Programming Ruby — Dave Thomas <Dave@...>

12 messages 2000/12/18

[#7737] strange border-case Numeric errors — "Brian F. Feldman" <green@...>

I haven't had a good enough chance to familiarize myself with the code in

19 messages 2000/12/20

[#7801] Is Ruby part of any standard GNU Linux distributions? — "Pete McBreen, McBreen.Consulting" <mcbreenp@...>

Anybody know what it would take to get Ruby into the standard GNU Linux

15 messages 2000/12/20

[#7938] Re: defined? problem? — Kevin Smith <sent@...>

matz@zetabits.com (Yukihiro Matsumoto) wrote:

26 messages 2000/12/22
[#7943] Re: defined? problem? — Dave Thomas <Dave@...> 2000/12/22

Kevin Smith <sent@qualitycode.com> writes:

[#7950] Re: defined? problem? — Stephen White <steve@...> 2000/12/22

On Fri, 22 Dec 2000, Dave Thomas wrote:

[#7951] Re: defined? problem? — David Alan Black <dblack@...> 2000/12/22

On Fri, 22 Dec 2000, Stephen White wrote:

[#7954] Re: defined? problem? — Dave Thomas <Dave@...> 2000/12/22

David Alan Black <dblack@candle.superlink.net> writes:

[#7975] Re: defined? problem? — David Alan Black <dblack@...> 2000/12/22

Hello --

[#7971] Hash access method — Ted Meng <ted_meng@...>

Hi,

20 messages 2000/12/22

[#8030] Re: Basic hash question — ts <decoux@...>

>>>>> "B" == Ben Tilly <ben_tilly@hotmail.com> writes:

15 messages 2000/12/24
[#8033] Re: Basic hash question — "David A. Black" <dblack@...> 2000/12/24

On Sun, 24 Dec 2000, ts wrote:

[#8178] Inexplicable core dump — "Nathaniel Talbott" <ntalbott@...>

I have some code that looks like this:

12 messages 2000/12/28

[#8196] My first impression of Ruby. Lack of overloading? (long) — jmichel@... (Jean Michel)

Hello,

23 messages 2000/12/28

[#8198] Re: Ruby cron scheduler for NT available — "Conrad Schneiker" <schneik@...>

John Small wrote:

14 messages 2000/12/28

[#8287] Re: speedup of anagram finder — "SHULTZ,BARRY (HP-Israel,ex1)" <barry_shultz@...>

> -----Original Message-----

12 messages 2000/12/29

[ruby-talk:8029] Re: Next amusing problem: talking integers

From: "Guy N. Hurst" <gnhurst@...>
Date: 2000-12-24 09:52:58 UTC
List: ruby-talk #8029
David Alan Black wrote:
...
> 
> > I had a need for something similar (though upto a million would have
> > sufficed) a short while ago and wrote an equivalent in Python.  A mechanical
> > transilteration to Ruby is also available:
> >
> > http://www.cs.indiana.edu/~raja/code/Cardinal.py
> > http://www.cs.indiana.edu/~raja/code/Cardinal.rb
> 
> Haven't looked, but will.  Meanwhile, I've put my Perl version (minus
> the hyphens) at <http://icarus.shu.edu/dblack/inttoeng.pl>.  (The Perl
> version also does ordinal numbers -- "twenty-second" etc.)
> 
> David
> 

I couldn't get to your perl script, but I found the others, as well as
seeing the ones posted to this list.

I have been impressed with the solutions.

I decided to spend some time honing another solution that would have the
side effect of having reusable parts while remaining concise and
easy to follow. 

I will take some great ideas from the previous algorithms, and
also add some concepts of my own ;-)

Here is what I came up with:


class Integer
  @@Ones=%w(one two three four five six seven eight nine).unshift('')
  @@Teens=%w(ten eleven twelve thirteen fourteen fifteen 
	sixteen seventeen eighteen nineteen)
  @@Tens=%w(twenty thirty forty fifty sixty seventy eighty ninety).unshift('','')
  @@Illions=%w(thousand million billion trillion quadrillion quintillion 
	sextillion septillion octillion nonillion decillion undecillion 
	duodecillion tredecillion quattuordecillion quindecillion sexdecillion 
	septendecillion octodecillion novemdecillion vigintillion).unshift('')

  def say_sign
    ["zero","","negative"][self<=>0]
  end
  def digit(n=-1)
    self.to_s[n..n].to_i
  end
  def say_ones
    return @@Teens[digit] if digit(-2)==1
    @@Ones[digit]
  end
  def say_tens
    @@Tens[digit(-2)]
  end
  def say_hundreds
    return "" if digit(-3)<1
    @@Ones[digit(-3)] + " hundred"
  end
  def say_triplet(triplet=0)
    words = say_hundreds + " " + say_tens
    words += "-" unless say_tens.empty? || say_ones.empty?
    words += say_ones 
    words += " " + @@Illions[triplet] unless self.zero?
    words.squeeze(" ").strip
  end
  def each_triplet
    s=self.to_s; triplets=[]
    triplets.unshift(s.slice!(/(.?.?.)$/)) until s.empty?
    triplets.each_with_index{|t,i| yield t,triplets.length-i-1 }
  end
  def say
    phrases=[say_sign]
    self.each_triplet{|t,i| phrases << t.to_i.say_triplet(i)}
    puts phrases.join(" ").squeeze(" ").strip
  end
  def commafy
    triplets=[]; sign=self.to_s.slice!(/^[-]/).to_s
    self.abs.each_triplet{|t,i| triplets << t }
    sign + triplets.join(",")
  end
end


0.say
-1234.say
1000004000001.say
-110000010000001.commafy
(54321-12345).say
(10**63+10**54+10**34).say

zero
negative one thousand two hundred thirty-four
one trillion four million one
"-110,000,010,000,001"
forty-one thousand nine hundred seventy-six
one vigintillion one septendecillion ten decillion


I ended up making an iterator, each_triplet, which returns
the triplets in the proper order along with an index signifying
its level:

1234567890 -> [["1",3],["234",2],["567",1],["890",0]]

I could have simplified the iterator at the expense of it
yielding triplets in reverse order:

  def reverse_each_triplet
    s=self.to_s; len=(s.length/3.0).ceil-1
    0.upto(len) {|i| yield s.slice!(/(.?.?.)$/), i }
  end

The other methods can also be used directly (hey, maybe someone
can use them for something?):

1234567890.say_triplet -> eight hundred ninety
1234567890.say_hundreds -> eight hundred
2352353514.digit(4) -> 3

The commafy method was easy using the each_triplet method,
although saving the possible minus sign makes it look messy.

possible errata...
One thing I noticed about the iterator I made, is that it was sending 
both parameters even if the block provided for only one. This happened
in the commafy block, which is why I use "|t,i|" even though I
only needed t for that. Yet the top of page 43 in the PR Book says that
any extra parameters passed by yield to a block are ignored (Dave?)


Guy N. Hurst


-- 
HurstLinks Web Development    http://www.hurstlinks.com/
Norfolk, VA - (757)623-9688
PHP/MySQL - Ruby/Perl - HTML/Javascript

In This Thread