[#154598] implementing the "each" method for own classes — Philipp Huber <huber.philipp@...>

hello!

12 messages 2005/09/01

[#154620] Word Chains (#44) — Ruby Quiz <james@...>

Gavin Kistner asked that I try timing the quiz solutions this week. I did

13 messages 2005/09/01

[#154733] Ruby-specific performance heuristics? — Hugh Sasse <hgs@...>

I've been doing some stuff with CSV recently, having data in one

15 messages 2005/09/02

[#154775] Idiomatic conversion of yielding block to array — David Brady <ruby_talk@...>

So I have a function that generates like 300 lines of text and I want to

23 messages 2005/09/02
[#154776] Re: Idiomatic conversion of yielding block to array — Levin Alexander <levin.alexander@...> 2005/09/02

David Brady <ruby_talk@shinybit.com> wrote:

[#154779] Re: Idiomatic conversion of yielding block to array — Simon Krer <SimonKroeger@...> 2005/09/02

Levin Alexander wrote:

[#154785] Re: Idiomatic conversion of yielding block to array — Simon Krer <SimonKroeger@...> 2005/09/02

Simon Krer wrote:

[#154789] Re: Idiomatic conversion of yielding block to array — Jacob Fugal <lukfugl@...> 2005/09/02

Good heavens, no! Neither of those are thread safe. Criminy!

[#154872] windows shell — Gaston Garcia <gaston.garcia@...>

Is there anyone here that uses Windows XP and uses a windows shell

28 messages 2005/09/04
[#154876] Re: windows shell — "Robert Klemme" <bob.news@...> 2005/09/04

Gaston Garcia <gaston.garcia@gmail.com> wrote:

[#154917] Re: windows shell — Austin Ziegler <halostatue@...> 2005/09/05

On 9/4/05, Robert Klemme <bob.news@gmx.net> wrote:

[#154874] params v.s. @params in rails? — "Barry" <rubyrails@...>

Both work in my controller class, so I am wondering what's the

11 messages 2005/09/04

[#154920] Help me clean up this method — "Vincent Foley" <vfoley@...>

Hello guys,

32 messages 2005/09/05

[#155018] Rake 0.6.0 Released — Jim Weirich <jim@...>

= Rake 0.6.0 Released

20 messages 2005/09/06

[#155064] Sorted arrays — <ruby@...64.com>

I'm a relative newcomer to Ruby. Most of my experience is in Delphi. And in Delphi one of the most commonly-used classes is TStringList, which is sort of analogous to ruby's Array (Delphi also has dynamic arrays and static arrays). TStringList has a property called Sorted, which if set to True makes it possible to insert strings into the list and have it maintain them as a sorted list (without having to re-sort it each time). Then you can use the IndexOf method (or the Find method) to do a binary search on the list, so you can quickly find the element you're looking for. My question is whether Ruby has anything like this. It seems like one could create a descendant of Array that does this.

18 messages 2005/09/06
[#155067] Re: Sorted arrays — "Robert Klemme" <bob.news@...> 2005/09/06

ruby@danb64.com wrote:

[#155120] Units for Ruby — "Lucas Carlson" <lucas@...>

I have also created a new library to add units to numbers in Ruby:

14 messages 2005/09/06

[#155127] Rio 0.3.4 — "rio4ruby" <rio4ruby@...>

New and Improved -- Rio 0.3.4

24 messages 2005/09/07

[#155181] Need help finding decent IDE/development environment for Windows — "Paul Dix" <paulcdix@...>

I've just started playing around with ruby on rails and by association,

41 messages 2005/09/07
[#155218] Re: Need help finding decent IDE/development environment for Windows — graham <fghfghfh@...> 2005/09/07

Paul Dix wrote:

[#155220] Re: Need help finding decent IDE/development environment for Windows — Joe Van Dyk <joevandyk@...> 2005/09/07

On 9/7/05, graham <fghfghfh@homr.vom> wrote:

[#155221] Re: Need help finding decent IDE/development environment for Windows — graham <fghfghfh@...> 2005/09/07

> You could ask them why they need all that IDE stuff for developing in Ruby.

[#155225] Re: Need help finding decent IDE/development environment for Windows — Edward Faulkner <ef@...> 2005/09/07

On Thu, Sep 08, 2005 at 02:36:29AM +0900, graham wrote:

[#155264] Re: Need help finding decent IDE/development environment for Windows — graham <fghfghfh@...> 2005/09/07

Edward Faulkner wrote:

[#155280] Re: Need help finding decent IDE/development environment for Windows — James Edward Gray II <james@...> 2005/09/08

On Sep 7, 2005, at 6:56 PM, graham wrote:

[#155327] general performance question — Brian Le Roy <brian@...>

I'm running top and when I run my app - I see the user CPU utilitization

15 messages 2005/09/08

[#155364] KirbyBase — rubyhacker@...

I'm posting from work, but will try to follow up in more

57 messages 2005/09/08
[#155795] Re: KirbyBase — rubyhacker@... 2005/09/12

Jamey Cribbs wrote:

[#155801] Re: KirbyBase — Jamey Cribbs <cribbsj@...> 2005/09/12

rubyhacker@gmail.com wrote:

[#155818] Re: KirbyBase — Randy Kramer <rhkramer@...> 2005/09/12

On Monday 12 September 2005 04:11 pm, Jamey Cribbs wrote:

[#155833] Re: KirbyBase — rubyhacker@... 2005/09/12

Randy Kramer wrote:

[#155836] Re: KirbyBase — Kevin Brown <blargity@...> 2005/09/12

On Monday 12 September 2005 17:06, rubyhacker@gmail.com wrote:

[#155861] Re: KirbyBase — Hal Fulton <hal9000@...> 2005/09/13

Kevin Brown wrote:

[#155873] Re: KirbyBase — Ezra Zygmuntowicz <ezra@...> 2005/09/13

[#155976] Re: KirbyBase — rubyhacker@... 2005/09/13

[#155986] Re: KirbyBase — Jamey Cribbs <cribbsj@...> 2005/09/13

rubyhacker@gmail.com wrote:

[#156005] Re: KirbyBase — Logan Capaldo <logancapaldo@...> 2005/09/13

[#156029] Re: KirbyBase [ANN (sort-of)] proof-of-concept KirbyBase ORM — Logan Capaldo <logancapaldo@...> 2005/09/14

[#155369] compiling ruby on red hat linux — "Philip J. Mikal" <philip_mikal@...>

Hi,

15 messages 2005/09/08

[#155411] Optimizing a single slow method — "Glenn M. Lewis" <noSpam@...>

Hi!

34 messages 2005/09/09
[#155474] Re: Optimizing a single slow method — Eric Hodel <drbrain@...7.net> 2005/09/09

On 08 Sep 2005, at 20:46, Glenn M. Lewis wrote:

[#155464] quick print type debugging — Eric Mahurin <eric_mahurin@...>

Anybody think something like this would be useful?

12 messages 2005/09/09

[#155507] Using Ruby as a preprocessor for another language — debbie@...

I have the misfortune of being stuck programming in a very bad

11 messages 2005/09/10

[#155530] Win32 gem for RMagick 1.9.1 — Timothy Hunter <cyclists@...>

Hot on the heels of the latest RMagick update, Kaspar Schiess has

15 messages 2005/09/10

[#155537] RCR to modify #puts and #print inside ERB — Gavin Kistner <gavin@...>

Proposed RCR:

26 messages 2005/09/10

[#155601] r4 - the simplest ruby pre-processor — "Ara.T.Howard" <Ara.T.Howard@...>

18 messages 2005/09/11

[#155638] The Early Demise of Myriad (Thanks To Ruby Threads) — "Zed A. Shaw" <zedshaw@...>

Hi Everyone,

17 messages 2005/09/11

[#155708] how to well-qualify the 2-inherited methods at their collision point — "SHIGETOMI, Takuhiko" <tshiget1@...>

dear guys,

10 messages 2005/09/12

[#155828] Adventures in html decoding. — Morgan <taria@...>

From the "If you want it done right, do it yourself... maybe"

16 messages 2005/09/12

[#155847] Choosing an open source license — "debbie@..." <debbie@...>

I'm working on a server program and I'm trying to decide which open

22 messages 2005/09/13

[#155941] yet another simple command-line option parser — Eric Mahurin <eric_mahurin@...>

I just put in a good example for:

11 messages 2005/09/13
[#155946] Re: yet another simple command-line option parser — Jim Freeze <jim@...> 2005/09/13

That's pretty interesting Eric, to grab the type off the default.

[#155949] Sets, uniqueness not unique. — Hugh Sasse <hgs@...>

I have been splitting a comma separated values file, and putting

29 messages 2005/09/13

[#155970] Surprising Regexp Behavior — James Edward Gray II <james@...>

I keep running into some surprising points with Ruby's Regexp engine

13 messages 2005/09/13

[#155992] Launch directory in Rake — Jim Freeze <jim@...>

Hi

15 messages 2005/09/13

[#156053] ruby and aop — Alexandru Popescu <the.mindstorm.mailinglist@...>

Hi!

12 messages 2005/09/14

[#156189] Get to the Point: Ruby and Rails Presentation Slides — "John W. Long" <ng@...>

Hi,

20 messages 2005/09/15

[#156230] you can't get in trouble with your boss for picking C# — "Phlip" <phlipcpp@...>

Rubies:

69 messages 2005/09/15
[#156549] Re: you can't get in trouble with your boss for picking C# — "ToRA" <tristan.allwood@...> 2005/09/17

Hey all,

[#156582] Re: you can't get in trouble with your boss for picking C# — Florian Gro<florgro@...> 2005/09/18

ToRA wrote:

[#156297] Re: you can't get in trouble with your boss for picking C# — "Phlip" <phlipcpp@...> 2005/09/15

klancaster1957 wrote:

[#156308] Re: you can't get in trouble with your boss for picking C# — Josh Charles <josh.charles@...> 2005/09/15

On 9/15/05, Phlip <phlipcpp@yahoo.com> wrote:

[#156248] Math: sum and faculty — Daniel Schierbeck <daniel.schierbeck@...>

I hereby propose two additions to Ruby. Please come with some comments

13 messages 2005/09/15

[#156299] MS Access — "Steve" <sdouglas949@...>

I'm considering learning Ruby. I have no programming experience yet. I was

23 messages 2005/09/15
[#156303] Re: MS Access — "Phlip" <phlipcpp@...> 2005/09/15

Steve wrote:

[#156335] Re: MS Access — Sean Armstrong <phinsxiii@...> 2005/09/15

On 9/15/05, Phlip <phlipcpp@yahoo.com> wrote:

[#156336] Re: MS Access — Sascha Ebach <se@...> 2005/09/15

Sean Armstrong wrote:

[#156347] Re: MS Access — Sean Armstrong <phinsxiii@...> 2005/09/15

Does anyone know how to install the Ruby MySQL module on a Windows platform.

[#156352] Re: MS Access — Jacob Quinn Shenker <jqshenker@...> 2005/09/15

Sean,I needed to compile/install mysql (running ./configure--without-server) from source to get the required developmentlibraries under Cygwin. (then I moved the newly-created clientbinaries out of the way so I could use the Win32-native mysqlbinaries.) After that, it worked like a charm. *Do not compile theCygwin-ized mysql client with "--with-openssl"* I don't know why, butthe gem refused to install if I did. Good luck, and let me know if yourun into any issues. Overall, developing on Cygwin for Ruby/Rails isquite nice.

[#156353] Re: MS Access — Sean Armstrong <phinsxiii@...> 2005/09/15

Let me make sure I got this right:

[#156461] Re: MS Access — Sean Armstrong <phinsxiii@...> 2005/09/16

It still refuses to find the lib and include directories even if I use the

[#156506] Re: MS Access — Jacob Quinn Shenker <jqshenker@...> 2005/09/16

Sean,I'm going to try to explain *exactly* what I did, and hopefully you'llsee something you forgot to do.1. Download mysql-essential-4.1.14-win32.msi from mysql.org and install it.2. Download mysql-4.1.13.tar.gz from mysql.org3. Extract the above, and run "./configure -C --without-server" (the-C enables config caching, I use it because the ./configure scriptruns very slowly under Cygwin. Optional, of course)4. Run "make && make install"5. Run "gem install mysql"6. Go make cool rails apps!

[#156444] Hash table questions — EdUarDo <eduardo.yanezNOSPAM@...>

Hi all,

14 messages 2005/09/16

[#156480] Some interesting criticisms of rails — David Balick <davidbalick@...>

may be found in the podcast

24 messages 2005/09/16
[#156530] Re: Some interesting criticisms of rails — "Robert Klemme" <bob.news@...> 2005/09/17

Zed A. Shaw <zedshaw@zedshaw.com> wrote:

[#156624] Language recommendations from ruby persons.... — "Greg Lorriman" <bogus@...>

Dear sirs and madames,

36 messages 2005/09/18

[#156662] Capcha in ruby — Federico <pix@...>

Hello,

23 messages 2005/09/19

[#156708] help with tricky proc/binding issue — "Ara.T.Howard" <Ara.T.Howard@...>

14 messages 2005/09/19

[#156743] The Ruby troll [was: Looking for...] — Gunnar Hjalmarsson <noreply@...>

David H. Adler wrote:

22 messages 2005/09/19

[#156749] ruby idiom for python's for/else while/else — Gergely Kontra <kgergely@...>

Hi!

18 messages 2005/09/19

[#156796] Dissident 0.1, a Ruby dependency injection container — Christian Neukirchen <chneukirchen@...>

Hello,

13 messages 2005/09/20
[#156797] Re: [ANN] Dissident 0.1, a Ruby dependency injection container — "Jason Voegele" <jason@...> 2005/09/20

On Tue, September 20, 2005 8:22 am, Christian Neukirchen said:

[#156801] Re: [ANN] Dissident 0.1, a Ruby dependency injection container — Christian Neukirchen <chneukirchen@...> 2005/09/20

"Jason Voegele" <jason@jvoegele.com> writes:

[#156966] Re: [ANN] Dissident 0.1, a Ruby dependency injection container — Logan Capaldo <logancapaldo@...> 2005/09/21

This is a little OT, but every-time dependency injection comes up I

[#156866] Places for a programmer to live? — Devin Mullins <twifkak@...>

While we seem to be rife with OT threads, I thought I'd throw in an OT

37 messages 2005/09/20

[#156933] Hello, I am a newbie to ruby. — could ildg <could.net@...>

I want learn a script language.

11 messages 2005/09/21

[#157005] Large Ruby Apps ? — "Warren Seltzer" <warrens@...>

I am coming to Ruby having used the usual list of scripting and C* languages. Since Ruby

30 messages 2005/09/21
[#158399] Re: Large Ruby Apps ? — <slonik.az@...> 2005/09/30

Very useful discussion that highlights quite few misconceptions.

[#157007] Re: Large Ruby Apps ? — "Berger, Daniel" <Daniel.Berger@...>

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

27 messages 2005/09/21

[#157051] hi, i'm new. plus one question — travis laduke <wrong@...>

I've been forced to work on some php lately and found myself

13 messages 2005/09/22

[#157063] Visual IDEs?? — "Erland" <Erland.Erikson@...>

HI,

24 messages 2005/09/22

[#157080] A question about Intelligent Systems and using Ruby — Daniel Lewis <danieljohnlewis@...>

Yesterday (21/09/2005) I sent an email to Dave Thomas (author of

16 messages 2005/09/22

[#157101] Instantiating a subclass of NilClass. — "Trans" <transfire@...>

I've subclasses NilClass, but don't know how to instantiate it. Any

16 messages 2005/09/22

[#157189] "The class that it is mixed in to..." — John Carter <john.carter@...>

Ok, so I'm documenting a Mixin.

20 messages 2005/09/23
[#157193] Re: "The class that it is mixed in to..." — William Morgan <wmorgan-ruby-talk@...> 2005/09/23

Excerpts from John Carter's mail of 22 Sep 2005 (CDT):

[#157271] Re: "The class that it is mixed in to..." — "David A. Black" <dblack@...> 2005/09/23

Hi --

[#157222] RDE 1.0.0 released — sakazuki <qzs01353@...>

Hi.

16 messages 2005/09/23

[#157299] On accidental unsubscribe messages — "Berger, Daniel" <Daniel.Berger@...>

Hi all,

15 messages 2005/09/23

[#157520] Relative speed of Ruby vs Java for a large compiled app like Freenet — seekingleverage@...

I'm wondering if anyone could shed some light on whether or not it

45 messages 2005/09/25
[#157716] Re: Relative speed of Ruby vs Java for a large compiled app like Freenet — "Isaac Gouy" <igouy@...> 2005/09/26

Martin, perhaps you could collect this stuff and put it into your wiki

[#157540] String#ggsub — Gavin Kistner <gavin@...>

I occasionally find myself with gsub regexp that either eat too much,

21 messages 2005/09/25

[#157565] Rinda frustration — Mark Volkmann <r.mark.volkmann@...>

I'm trying to determine what the methods "move" and "notify" do in the

12 messages 2005/09/26

[#157623] A big thank you to Robby Russell... — Tom Copeland <tom@...>

...for providing another RubyForge mirror via his company, PlanetArgon.

18 messages 2005/09/26
[#157770] Re: A big thank you to Robby Russell... — Gavin Kistner <gavin@...> 2005/09/27

On Sep 26, 2005, at 7:25 AM, Tom Copeland wrote:

[#157826] Re: A big thank you to Robby Russell... — Tom Copeland <tom@...> 2005/09/27

On Tue, 2005-09-27 at 12:43 +0900, Gavin Kistner wrote:

[#157864] Re: A big thank you to Robby Russell... — Sam Mayes <codeslave@...> 2005/09/27

whats the process for becomming a mirror?

[#157871] Re: A big thank you to Robby Russell... — Kirk Haines <khaines@...> 2005/09/27

On Tuesday 27 September 2005 10:24 am, Sam Mayes wrote:

[#157875] Re: A big thank you to Robby Russell... — Tom Copeland <tom@...> 2005/09/27

On Wed, 2005-09-28 at 01:38 +0900, Kirk Haines wrote:

[#157648] Rapid GUI Development with QtRuby — Dave Thomas <dave@...>

I hope y'all don't mind a short announcement, but it seemed relevant.

22 messages 2005/09/26

[#157654] Ruby Threads 101 — Ben <benbelly@...>

I am leading a peer-learning group that is using "Programming Ruby" to

13 messages 2005/09/26

[#157658] Time interval — Daniel Berger <Daniel.Berger@...>

Hi all,

20 messages 2005/09/26

[#157697] Embedded Ruby and Tag Libs — Adam Van Den Hoven <mail@...>

Hey guys,

16 messages 2005/09/26

[#157732] ShortURL 0.7.0 — "Vincent Foley" <vfoley@...>

After a lot of procrastination, I have released ShortURL 0.7.0. I

14 messages 2005/09/26

[#157746] Fwd: Lisp macros — Joe Van Dyk <joevandyk@...>

Whoops, this belongs on ruby-talk... Sorry.

47 messages 2005/09/27
[#157751] Re: Fwd: Lisp macros — James Britt <james_b@...> 2005/09/27

Joe Van Dyk wrote:

[#157779] Re: Fwd: Lisp macros — Jim Freeze <jim@...> 2005/09/27

On 9/26/05, James Britt <james_b@neurogami.com> wrote:

[#157813] Re: Fwd: Lisp macros — Ben <benbelly@...> 2005/09/27

On 9/27/05, Jim Freeze <jim@freeze.org> wrote:

[#157807] How do I (really) encrypt a string in ruby? — Michal Suchanek <hramrach@...>

Hello

10 messages 2005/09/27

[#157854] Class and Iterator Design Question — Jim Freeze <jim@...>

This may be a silly design question, but I always balk at

26 messages 2005/09/27
[#157866] Re: Class and Iterator Design Question — Bob Hutchison <hutch@...> 2005/09/27

[#157889] Re: Class and Iterator Design Question — Jim Freeze <jim@...> 2005/09/27

Wow, thanks for all the responses.

[#157893] Re: Class and Iterator Design Question — "David A. Black" <dblack@...> 2005/09/27

Hi --

[#157896] Re: Class and Iterator Design Question — Jim Freeze <jim@...> 2005/09/27

On 9/27/05, David A. Black <dblack@wobblini.net> wrote:

[#157947] Dynamically generating classes? — Jonas Galvez <jonasgalvez@...>

Hi,

15 messages 2005/09/27

[#158051] Re: creating independent lambdas in loops — "Kroeger Simon (ext)" <simon.kroeger.ext@...>

24 messages 2005/09/28
[#158057] Re: creating independent lambdas in loops — Eric Mahurin <eric_mahurin@...> 2005/09/28

--- "Kroeger Simon (ext)" <simon.kroeger.ext@siemens.com>

[#158074] Re: creating independent lambdas in loops — Gavin Kistner <gavin@...> 2005/09/28

On Sep 28, 2005, at 7:47 AM, Eric Mahurin wrote:

[#158081] Re: creating independent lambdas in loops — Eric Mahurin <eric_mahurin@...> 2005/09/28

--- Gavin Kistner <gavin@refinery.com> wrote:

[#158093] Re: creating independent lambdas in loops — Eric Mahurin <eric_mahurin@...> 2005/09/28

--- Eric Mahurin <eric_mahurin@yahoo.com> wrote:

[#158094] Re: creating independent lambdas in loops — "David A. Black" <dblack@...> 2005/09/28

Hi --

[#158096] Re: creating independent lambdas in loops — Eric Mahurin <eric_mahurin@...> 2005/09/28

--- "David A. Black" <dblack@wobblini.net> wrote:

[#158121] Python to Ruby: Two puzzlements... — "Elf M. Sternberg" <elf@...>

I'm afraid that I'm coming from Python, a B&D language where I'm used to

22 messages 2005/09/28

[#158157] IBM vs. Microsoft vs. ... Ruby? — "itsme213" <itsme213@...>

More "Enterprise Scale" talk over here, with a strong leaning towards

29 messages 2005/09/28
[#158330] Re: IBM vs. Microsoft vs. ... Ruby? — "bonefry" <bellarchitects@...> 2005/09/29

Hi,

[#158258] In your opinion.... — Daniel Lewis <danieljohnlewis@...>

In your opinion(s)....

51 messages 2005/09/29
[#158263] Re: In your opinion.... — Gennady Bystritksy <gfb@...> 2005/09/29

Daniel Lewis wrote:

[#158265] Re: In your opinion.... — Daniel Lewis <danieljohnlewis@...> 2005/09/29

> Too lazy to do your own research? It happens ;-). For a starter, check

[#158311] rush 0.1.bandicoot: object-oriented shell goodness (rationed for your health)! — The rush folks <rush-ruby-ml@...>

= rush-0.1.bandicoot

10 messages 2005/09/29

[#158327] Operator Overloading << — "matt.hulse@..." <matt.hulse@...>

Is there a way to overload '<<' in the Array class?

19 messages 2005/09/29

[#158460] Ruby licence... — netspam@...

I understand that the distribution of Ruby is under the GPL.

25 messages 2005/09/30
[#158600] Re: Ruby licence... — "Gregory Brown" <gregory.t.brown@...> 2005/10/02

The Ruby License and the License of Ruby are two different things.

[#158620] Re: Ruby licence... — Kevin Brown <blargity@...> 2005/10/02

On Saturday 01 October 2005 20:51, Gregory Brown wrote:

[#158659] Re: Ruby licence... — Christian Neukirchen <chneukirchen@...> 2005/10/02

Kevin Brown <blargity@gmail.com> writes:

[#158663] Re: Ruby licence... — Kevin Brown <blargity@...> 2005/10/02

On Sunday 02 October 2005 10:56, Christian Neukirchen wrote:

[#158690] Re: Ruby licence... — Christian Neukirchen <chneukirchen@...> 2005/10/02

Kevin Brown <blargity@gmail.com> writes:

[#158692] Re: Ruby licence... — Kevin Brown <blargity@...> 2005/10/02

On Sunday 02 October 2005 12:45, Christian Neukirchen wrote:

[#158497] Interest in Boost::Ruby — Alan Gutierrez <alan-ruby-talk@...>

I'd like to build a CSS renderer in modern C++ as an enthusist's

24 messages 2005/09/30

[SUMMARY] Word Chains (#44)

From: Ruby Quiz <james@...>
Date: 2005-09-01 12:55:58 UTC
List: ruby-talk #154620
Gavin Kistner asked that I try timing the quiz solutions this week.  I did
indeed "try" that very thing and the results shocked me.  Let's take a look,
shall we:

	=== Timing ./Adam Shelly/wordchain ===
	Wordchain Finder
	Connecting duck -> ruby
	nil
	=== ./Adam Shelly/wordchain:  0.950922 seconds ===
	
	=== Timing ./Brian Schroeder/wordchain.rb ===
	Loading database
	Searching connection between duck and ruby
	duck
	dusk
	rusk
	ruse
	rube
	ruby
	
	=== ./Brian Schroeder/wordchain.rb:  3.722559 seconds ===
	
	=== Timing ./Daniel Sheppard/word_chain.rb ===
	./Daniel Sheppard/word_chain.rb:42:in `find_distances': undefined local
	variable or method `distances' for #<Word:0x1c70ac> (NameError)
	        from ./Daniel Sheppard/word_chain.rb:46:in `shortest_path'
	        from ./Daniel Sheppard/word_chain.rb:135
	=== ./Daniel Sheppard/word_chain.rb:  0.019652 seconds ===
	
	=== Timing ./David Tran/word_chain.rb ===
	Loading dictionary...
	Building chain...
	No solution.
	=== ./David Tran/word_chain.rb:  314.369476 seconds ===
	
	=== Timing ./David Tran/word_chain2.rb ===
	Loading dictionary...
	Building chain...
	No solution.
	=== ./David Tran/word_chain2.rb:  1.184791 seconds ===
	
	=== Timing ./Dominik Bathon/word_chain.rb ===
	duck
	luck
	luce
	lube
	rube
	ruby
	=== ./Dominik Bathon/word_chain.rb:  1.472335 seconds ===
	
	=== Timing ./Gavin Kistner/word_chain.rb ===
	./Gavin Kistner/word_chain.rb:65:in `Integer': invalid value for Integer:
	"duck" (ArgumentError)
	        from ./Gavin Kistner/word_chain.rb:65
	=== ./Gavin Kistner/word_chain.rb:  0.020758 seconds ===
	
	=== Timing ./horndude77/wordchain.rb ===
	Two words required
	=== ./horndude77/wordchain.rb:  0.014078 seconds ===
	
	=== Timing ./James Edward Gray II/word_chain.rb ===
	duck
	ruck
	rusk
	ruse
	rube
	ruby
	=== ./James Edward Gray II/word_chain.rb:  27.577392 seconds ===
	
	=== Timing ./Levin Alexander/word_chains.rb ===
	duck
	ruck
	rusk
	ruse
	rube
	ruby
	=== ./Levin Alexander/word_chains.rb:  2.795315 seconds ===
	
	=== Timing ./Paolo Capriotti/chain.rb ===
	no chain could be found
	=== ./Paolo Capriotti/chain.rb:  65.236484 seconds ===
	
	=== Timing ./Simon Kroeger/word_chain.rb ===
	now way!
	=== ./Simon Kroeger/word_chain.rb:  2.981419 seconds ===
	
	=== Timing ./Simon Kroeger/word_chain2.rb ===
	./Simon Kroeger/word_chain2.rb:2:in `foreach': No such file or directory -
	duck (Errno::ENOENT)
	        from ./Simon Kroeger/word_chain2.rb:2
	=== ./Simon Kroeger/word_chain2.rb:  0.017581 seconds ===
	
	=== Timing ./Will Thimbleby/word_chain.rb ===
	duck
	dunk
	dune
	rune
	rube
	ruby
	=== ./Will Thimbleby/word_chain.rb:  63.026336 seconds ===
	
	=== Timing ./William James/word_chain.rb ===
	./William James/word_chain.rb:1:in `read': No such file or directory - dict
	(Errno::ENOENT)
	        from ./William James/word_chain.rb:1
	=== ./William James/word_chain.rb:  0.024691 seconds ===
	
	=== Timing ./William James/word_chain2.rb ===
	./William James/word_chain2.rb:2:in `foreach': No such file or directory -
	duck (Errno::ENOENT)
	        from ./William James/word_chain2.rb:2
	=== ./William James/word_chain2.rb:  0.01695 seconds ===

I just ran sixteen programs there all with exactly the same command, outlined in
the quiz.  Five of the sixteen programs died with an exception.  Six more
printed only an error message or couldn't find a chain.  That leaves us with
five chains out of sixteen attempts, about a 31% accuracy ratio.  Yikes!

Obviously, the biggest problem are the exceptions and the error messages.  These
programs refused to try and build a chain.  (Yes, I looked into all of them to
see why and no, I didn't try to fix any of them.)  The main issue here was that
people changed my proposed command-line arguments.  Some of them moved the
dictionary to an optional third argument and others added new options.

I think new options are great, but was it really that hard to support the quiz
format?  Will Thimberly parsed the quiz described arguments in seven lines, so I
think it was reasonable.

Of course, you are always welcome to submit whatever you like as a Ruby Quiz
solution.  Along the same lines, I consider myself free to ignore anything that
creates more work for me.

The one exception is that I do try to resolve external dependancies, especially
if you make it easy on me.  Paulo Capriotti gave me a link right to the library
needed and Brian included a README that showed how to build a required (and
included!) C extension.  Thank you both.

Anyway, if someone would like to resolve all of the above issues and rerun time
trials, please be my guest.  If you download the solutions from the Ruby Quiz
site, my time_trial.rb script is in the root directory and hopefully that will
get you started.

The minor issue this time around is that some solutions obviously had trouble
finding chains, at least with my dictionary.  Not much to say here except that
unit tests probably could have helped.  Several test cases were posted to Ruby
Talk.  Hope everyone was trying those as they came in.

Okay, let's clean up those time trials and have another look at them:

	=== Timing ./Brian Schroeder/wordchain.rb ===
	Loading database
	Searching connection between duck and ruby
	duck
	dusk
	rusk
	ruse
	rube
	ruby
	
	=== ./Brian Schroeder/wordchain.rb:  3.722559 seconds ===
	
	=== Timing ./Dominik Bathon/word_chain.rb ===
	duck
	luck
	luce
	lube
	rube
	ruby
	=== ./Dominik Bathon/word_chain.rb:  1.472335 seconds ===
	
	=== Timing ./James Edward Gray II/word_chain.rb ===
	duck
	ruck
	rusk
	ruse
	rube
	ruby
	=== ./James Edward Gray II/word_chain.rb:  27.577392 seconds ===
	
	=== Timing ./Levin Alexander/word_chains.rb ===
	duck
	ruck
	rusk
	ruse
	rube
	ruby
	=== ./Levin Alexander/word_chains.rb:  2.795315 seconds ===
	
	=== Timing ./Will Thimbleby/word_chain.rb ===
	duck
	dunk
	dune
	rune
	rube
	ruby
	=== ./Will Thimbleby/word_chain.rb:  63.026336 seconds ===

I actually expected Brian's to be the fastest, just from what I had read about
them as they came in.  Under the hood, Brian is using a priority queue written
in C.  As the saying goes though, the speed is in the algorithm, and Dominik and
Levin prove the truth of it.

For an interesting comparison, Levin is using a plain Ruby priority queue. 
Let's take a look at that class:

	# inefficient implementation of a priority queue
	#
	class SimpleQueue
	  def initialize
	    @storage = Hash.new { [] }
	  end
	  def insert(priority, data)
	    @storage[priority] = @storage[priority] << data
	  end
	  def extract_min
	    return nil if @storage.empty?
	    key, val = *@storage.min
	    result = val.shift
	    @storage.delete(key) if val.empty?
	    return result
	  end
	end

If you look at that insert() method, you might find the calls a bit odd.  The
code does work, but only because of the awkward assignment that shouldn't be
needed.  This is a gotcha that bit me early in learning Ruby so I'll explain it
here in the hope of helping others.

Array.new() can take a number and a block.  It will invoke the block the
indicated number of times to generate an Array, using the return value of the
block as each member.

Because Hash.new() also takes a block and will call it when a key is first
accessed without an assignment, the natural assumption is that it uses the
return value, and in truth it does, but it does not set the key to that value! 
That's why the extra assignment is needed above.

The fix is to use the passed in Hash and key String objects to set it yourself. 
Using that, we can write the above a little more naturally:

	# inefficient implementation of a priority queue
	#
	class SimpleQueue
	  def initialize
	    @storage = Hash.new { |hash, key| hash[key] = [] }
	  end
	  def insert(priority, data)
	    @storage[priority] << data
	  end
	  def extract_min
	    return nil if @storage.empty?
	    key, val = *@storage.min
	    result = val.shift
	    @storage.delete(key) if val.empty?
	    return result
	  end
	end

I just think that's more natural and easy to follow.  They work the same.

Looking at the code itself, there's nothing too fancy here.  It stores items by
priority in a Hash.  The real work is done in extract_min() which just locates
the minimum value, shifts some data off of that Array, and returns it.  The
comment warns that it's inefficient, but it sure is easy to setup and use.  Hard
to beat that for just fifteen lines of code.  Nice work Levin.

Now I want to examine Dominik's lightning fast solution.  Here's how it starts:

	DEFAULT_DICTIONARY = "/usr/share/dict/words"

	# Data structure that efficiently stores words from a dictionary in a way,
	# that it is easy to find all words that differ from a given word only at
	# one letter (words that could be the next step in a word chain).
	# Example: when adding the word "dog", add_word will register "dog" as
	# step for "\0og", "d\0g" and "do\0", later each_possible_step("cat")
	# will yield all words registered for "\0at", "c\0t" or "ca\0".
	class WordSteps
	    def initialize
	        @steps = Hash.new { |h, k| h[k] = [] }
	        @words = {}
	    end

	    # yields all words (as strings) that were added with add_word
	    def each_word(&block)
	        @words.each_key(&block)
	    end

	    # add all steps for word (a string) to the steps
	    def add_word(word)
	        sym = word.to_sym
	        wdup = word.dup
	        for i in 0...word.length
	            wdup[i] = 0
	            @steps[wdup] << sym
	            wdup[i] = word[i]
	        end
	        @words[word] = sym # for allow_shorter and each_word
	    end
	
	    # yields each possible next step for word (a string) as symbol, some
	    # possible steps might be yielded multiple times
	    # if allow_shorter is true, word[0..-2].to_sym will also be yielded
	    # if available
	    # if allow_longer is true, all words that match /#{word}./ will be
	    # yielded
	    def each_possible_step(word, allow_shorter = false,
	                                 allow_longer = false)
	        wdup = word.dup
	        for i in 0...word.length
	            wdup[i] = 0
	            if @steps.has_key?(wdup)
	                @steps[wdup].each { |step| yield step }
	            end
	            wdup[i] = word[i]
	        end
	        if allow_shorter && @words.has_key?(tmp = word[0..-2])
	            yield @words[tmp]
	        end
	        if allow_longer && @steps.has_key?(tmp = word + "\0")
	            @steps[tmp].each { |step| yield step }
	        end
	    end
	    
	    # ...

The comments are just great in this code.  If you read them, you'll understand
how the code moves so darn fast.  Here's the mini-summary:  When called
add_word() maps a word to all possible variations with exactly one letter
changed to a null character.  Later, each_possible_step() can use the same
mapping to quickly look up all possibilities for the current word in question.

This can also handle searches where words aren't the same size, though that
wasn't part of the quiz.

	    # ...
	
	    # tries to find a word chain between word1 and word2 (strings) using
	    # all available steps
	    # returns the chain as array of symbols or nil, if no chain is found
	    # shorter/longer determines if shorter or longer words are allowed in
	    # the chain
	    def build_word_chain(word1, word2, shorter = false, longer = false)
	        # build chain with simple breadth first search
	        current = [word1.to_sym]
	        pre = { current[0] => nil } # will contain the predecessors
	        target = word2.to_sym
	        catch(:done) do
	            until current.empty?
	                next_step = []
	                current.each do |csym|
	                    each_possible_step(csym.to_s, shorter, longer) do |ssym|
	                        # have we seen this word before?
	                        unless pre.has_key? ssym
	                            pre[ssym] = csym
	                            throw(:done) if ssym == target
	                            next_step << ssym
	                        end
	                    end
	                end
	                current = next_step
	            end
	            return nil # no chain found
	        end
	        # build the chain (in reverse order)
	        chain = [target]
	        chain << target while target = pre[target]
	        chain.reverse
	    end
	
	    # ...

This is the search for a chain.  Believe it or not, it's a rather boring
unidirectional breadth-first search.  Most people implemented much fancier
searches, but thanks to Domink's dictionary storage this code doesn't need to be
clever.

This code just uses each_possible_step() to walk level-by-level of like words,
until it finds the end word.  The pre Hash is used to keep the code from
retracing its steps and to walk the previous word chain to build the final
answer at the bottom of the method.

This method has a nice use of catch() and throw() to create the equivalent of a
labeled goto call in many other languages.

There's one more piece to this class:

	    # ...

	    # builds and returns a WordSteps instance "containing" all words with
	    # length in length_range from the file file_name
	    def self.load_from_file(file_name, length_range)
	        word_steps = new
	        IO.foreach(file_name) do |line|
	            # only load words with correct length
	            if length_range === (word = line.strip).length
	                word_steps.add_word(word.downcase)
	            end
	        end
	        word_steps
	    end
	end
	
	# ...

Here's the simple dictionary reading method.  Note the clever use of a Range
argument here, to support word chains of differing sizes.  The === check ensures
that the current dictionary word is in the Range we care about, before it's
added to the memory mappings.

Finally, here's the interface code:

	# ...
	
	if $0 == __FILE__
	    dictionary = DEFAULT_DICTIONARY

	    # parse arguments
	    if ARGV[0] == "-d"
	        ARGV.shift
	        dictionary = ARGV.shift
	    end
	    unless ARGV.size == 2
	        puts "usage: #$0 [-d path/to/dictionary] word1 word2"
	        exit 1
	    end
	    word1, word2 = ARGV[0].strip.downcase, ARGV[1].strip.downcase

	    shorter = word1.length > word2.length
	    longer = word1.length < word2.length
	    length_range = if longer
	        word1.length..word2.length
	    else
	        word2.length..word1.length
	    end

	    # read dictionary
	    warn "Loading dictionary..." if $DEBUG
	    word_steps = WordSteps.load_from_file(dictionary, length_range)
	    word_steps.add_word(word2) # if it is not in dictionary

	    # build chain
	    warn "Building chain..." if $DEBUG
	    chain = word_steps.build_word_chain(word1, word2, shorter, longer)

	    # print result
	    puts chain || "No chain found!"
	end

Most of that is just the code to support the arguments from the quiz.  Note the
clever building of the length Range that allows the program to switch behavior
when different sized words are given.  All around great code Domink.  Thanks for
the lesson!

My thanks to all who were able to understand my command-line argument
instructions this week.  ;)  Seriously, thanks to all submitters.  Many great
solutions this week.

If you don't know what tomorrow's quiz is yet, you're not reading Redhanded
closely enough...

In This Thread

Prev Next