[#33161] Call/CC and Ruby iterators. — olczyk@... (Thaddeus L Olczyk)

Reading about call/cc in Scheme I get the impression that it is very

11 messages 2002/02/05

[#33242] favicon.ico — Dave Thomas <Dave@...>

19 messages 2002/02/06
[#33256] Re: favicon.ico — Leon Torres <leon@...> 2002/02/06

[#33435] Reg: tiny contest: who's faster? (add_a_gram) — grady@... (Steven Grady)

> My current solution works correctly with various inputs.

17 messages 2002/02/08

[#33500] Ruby Embedded Documentation — William Djaja Tjokroaminata <billtj@...>

Hi,

24 messages 2002/02/10
[#33502] Re: Ruby Embedded Documentation — "Lyle Johnson" <ljohnson@...> 2002/02/10

> Now, I am using Ruby on Linux, and I have downloaded Ruby version

[#33615] Name resolution in Ruby — stern@... (Alan Stern)

I've been struggling to understand how name resolution is supposed to

16 messages 2002/02/11

[#33617] choice of HTML templating system — Paul Brannan <paul@...>

I am not a web developer, nor do I pretend to be one.

23 messages 2002/02/11

[#33619] make first letter lowercase — sebi@... (sebi)

hello,

20 messages 2002/02/11
[#33620] Re: [newbie] make first letter lowercase — Tobias Reif <tobiasreif@...> 2002/02/11

sebi wrote:

[#33624] Re: [newbie] make first letter lowercase — "Jeff 'japhy' Pinyan" <jeffp@...> 2002/02/11

On Feb 11, Tobias Reif said:

[#33632] Re: [newbie] make first letter lowercase — Mathieu Bouchard <matju@...> 2002/02/12

[#33731] simple XML parsing (greedy / non-greedy — Ron Jeffries <ronjeffries@...>

Suppose I had this text

14 messages 2002/02/13

[#33743] qualms about respond_to? idiom — David Alan Black <dblack@...>

Hi --

28 messages 2002/02/13
[#33751] Re: qualms about respond_to? idiom — Dave Thomas <Dave@...> 2002/02/13

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

[#33754] Re: qualms about respond_to? idiom — David Alan Black <dblack@...> 2002/02/13

Hi --

[#33848] "Powered by Ruby" banner — Yuri Leikind <YuriLeikind@...>

Hello Ruby folks,

78 messages 2002/02/14
[#33909] Re: "Powered by Ruby" banner — Leon Torres <leon@...> 2002/02/14

On Thu, 14 Feb 2002, Yuri Leikind wrote:

[#33916] RE: "Powered by Ruby" banner — "Jack Dempsey" <dempsejn@...> 2002/02/15

A modest submission:

[#33929] Re: "Powered by Ruby" banner — yet another bill smith <bigbill.smith@...> 2002/02/15

Kent Dahl wrote:

[#33932] OT Netscape 4.x? was Re: "Powered by Ruby" banner — Chris Gehlker <gehlker@...> 2002/02/15

On 2/15/02 5:54 AM, "yet another bill smith" <bigbill.smith@verizon.net>

[#33933] RE: OT Netscape 4.x? was Re: "Powered by Ruby" banner — "Jack Dempsey" <dempsejn@...> 2002/02/15

i just don't understand why it didn't show up! dhtml/javascript, ok, but a

[#33937] Re: OT Netscape 4.x? was Re: "Powered by Ruby" banner — Chris Gehlker <gehlker@...> 2002/02/15

On 2/15/02 7:16 AM, "Jack Dempsey" <dempsejn@georgetown.edu> wrote:

[#33989] Re: OT OmniWeb [was: Netscape 4.x?] — Sean Russell <ser@...> 2002/02/16

Chris Gehlker wrote:

[#33991] Re: OT OmniWeb [was: Netscape 4.x?] — Rob Partington <rjp@...> 2002/02/16

In message <3c6e5e01_1@spamkiller.newsgroups.com>,

[#33993] Re: OT OmniWeb [was: Netscape 4.x?] — Thomas Hurst <tom.hurst@...> 2002/02/16

* Rob Partington (rjp@browser.org) wrote:

[#33925] Re: "Powered by Ruby" banner — Martin Maciaszek <mmaciaszek@...> 2002/02/15

In article <3C6CFCCA.5AD5CA67@scnsoft.com>, Yuri Leikind wrote:

[#33956] Re: "Powered by Ruby" banner — Leon Torres <leon@...> 2002/02/15

On Fri, 15 Feb 2002, Martin Maciaszek wrote:

[#33851] Ruby and .NET — Patrik Sundberg <ps@...>

I have been reading a bit about .NET for the last couple of days and must say

53 messages 2002/02/14

[#34024] Compiled companion language for Ruby? — Erik Terpstra <erik@...>

Hmmm, seems that my previous post was in a different thread, I'll try

12 messages 2002/02/16

[#34036] The GUI Returns — "Horacio Lopez" <vruz@...>

Hello all,

33 messages 2002/02/17

[#34162] Epic4/Ruby — Thomas Hurst <tom.hurst@...>

Rejoice, for you no longer have to put up with that evil excuse for a

34 messages 2002/02/18

[#34185] Operator overloading and multiple arguments — ptkwt@...1.aracnet.com (Phil Tomson)

I'm trying to overload the '<=' operator in a class in order to use it for

10 messages 2002/02/18

[#34217] Ruby for web development — beripome@... (Billy)

Hi all,

21 messages 2002/02/19

[#34350] FAQ for comp.lang.ruby — "Hal E. Fulton" <hal9000@...>

RUBY NEWSGROUP FAQ -- Welcome to comp.lang.ruby! (Revised 2001-2-18)

15 messages 2002/02/20

[#34375] Setting the Ruby continued — <jostein.berntsen@...>

Hi,

24 messages 2002/02/20
[#34384] Re: Setting the Ruby continued — Paulo Schreiner <paulo@...> 2002/02/20

Also VERY important:

[#34467] recursive require — Ron Jeffries <ronjeffries@...>

I'm having a really odd thing happen with two files that mutually

18 messages 2002/02/21

[#34503] special characters — Tobias Reif <tobiasreif@...>

Hi all,

13 messages 2002/02/22

[#34517] Windows Installer Ruby 166-0 available — Andrew Hunt <andy@...>

16 messages 2002/02/22

[#34597] rdoc/xml questions — Dave Thomas <Dave@...>

24 messages 2002/02/23

[#34631] Object/Memory Management — "Sean O'Dell" <sean@...>

I'm new to Ruby and the community here (I've been learning Ruby for a grand

44 messages 2002/02/23

[#34682] duplicate method name — Ron Jeffries <ronjeffries@...>

I just found a case in a test file where i had two tests of the same

16 messages 2002/02/24
[#34687] Re: duplicate method name — s@... (Stefan Schmiedl) 2002/02/24

Hi Ron.

[#34791] Style Question — Ron Jeffries <ronjeffries@...>

So I'm building this set theory library. The "only" object is supposed

13 messages 2002/02/25

[#34912] RCR?: parallel to until: as_soon_as — Tobias Reif <tobiasreif@...>

Hi,

18 messages 2002/02/26

[#34972] OT A Question on work styles — Chris Gehlker <gehlker@...>

As a Mac baby I just had to step through ruby in GDB *from the command line*

20 messages 2002/02/28

[#35015] Time Comparison — "Sean O'Dell" <sean@...>

I am using the time object to compare times between two files and I'm

21 messages 2002/02/28

Re: tiny contest: who's faster? (add_a_gram)

From: pc000@... (PaulC)
Date: 2002-02-09 07:05:51 UTC
List: ruby-talk #33459
Tobias Reif <tobiasreif@pinkjuice.com> wrote in message news:<3C640E0C.8090207@pinkjuice.com>...
> 
> My current solution works correctly with various inputs.
> It might have bugs, but most importantly, it takes forever.
> Short sample input is no problem; but as soon as I feed it
> the 1.5 MB word list from the website, my computer
> is overwhelmed, and starts to smell heated after 2 hours :|
> 

Interestingly I was also looking at this recently & had 
actually put together a solution in ObjC - I did a rough 
Ruby translation and this is able to process the full word 
list in about 8 1/2 minutes on my laptop (see below).

[paulc:tigger] ~/Development/Ruby % wc -l
/Users/paulc/AddAGram/WORD.LST
  173528 /Users/paulc/AddAGram/WORD.LST
[paulc:tigger] ~/Development/Ruby % time ./AddAGram.rb
~/AddAGram/WORD.LST
Building WordList....
Searching....
Done...

(eon,one) + a -> aeon
aeon + s -> aeons
aeons + t -> atones
atones + i -> atonies
atonies + m -> (amniotes,misatone)
(amniotes,misatone) + n -> nominates
nominates + i -> (antimonies,antinomies)
(antimonies,antinomies) + r -> (inseminator,nitrosamine)
(inseminator,nitrosamine) + t -> terminations
terminations + d -> antimodernist
antimodernist + e -> determinations
determinations + i -> intermediations
intermediations + n -> indeterminations

../AddAGram.rb /Users/paulc/AddAGram/WORD.LST  502.59s user 1.45s
system 98% cpu 8:32.56 total

The problem is inherently fairly complex will scale very poorly using
a naive algorithm - the approach used here is to pre-sort the wordlist
into buckets with the same length, within each bucket the words are 
stored in a dictionary with a key formed by sorting the word by 
character - to find candidate AddAGrams we take the start word, add 
'a'..'z', re-sort the result and use this key to index the next
bucket.
Essentially this trades a table scan for 26 indexed probes for each
lookup which is a very big win. In addition we mark nodes as visited
as
we touch them to prune trees which we have already reached.

Thanks to my colleague Jeff Turner for figuring out the concept !

PaulC

========= AddAGram.rb =========
#!/usr/local/bin/ruby

class String
    def sortByChar
        split(//).sort.join
    end
end

class EquivWords
    def initialize(word)
        @sortedWord = word.sortByChar
        @realWords = [word]
        @visited = false
    end
    def addWord(word)
        @realWords << word
    end
    def to_s
        if @realWords.length == 1 then
            @realWords[0]
        else
            "(" + @realWords.join(",") + ")"
        end
    end
    attr_accessor :visited, :realWords, :sortedWord
end

class WordList
    def initialize
        @wordDict = {}
    end
    def addWord(word)
        length = word.length
        sortedword = word.sortByChar
        if (wordsWithLength = @wordDict[length]) == nil then
            wordsWithLength = (@wordDict[length] = {})
        end
        if (res = wordsWithLength[sortedword]) then
            res.addWord(word)
        else
            wordsWithLength[sortedword] = EquivWords.new(word)
        end
        return self
    end
    def hasSortedWord(sortedword)
        begin
            @wordDict[sortedword.length][sortedword]
        rescue NameError
            false
        end
    end
    def hasWord(word)
        return hasSortedWord(word.sortByChar)
    end
    def objsWithLength(length)
        @wordDict[length].values
    end
    def inspect
        values = @wordDict.keys.sort.collect { |k|
"#{k}-#{@wordDict[k].length}" }.join(",")
        return "<#{self.class}:#{sprintf('0x%x',self.id)} [" + values
+ "]>"
    end
end

class Searcher
    def initialize(list)
        @list = list
        @trail = []
        @maxlength = 0
        @longest = nil
    end
    def search(wordObj)
        found = 0
        @trail << wordObj
        ("a".."z").each { |c|
            if (matchObj = @list.hasWord(wordObj.sortedWord+c)) then
                if matchObj.visited == false then
                    search(matchObj)
                end
            end
        }
        wordObj.visited = true
        length = @trail.length
        if length > 0 then
            if length > @maxlength then
                @maxlength = length
                @longest = @trail.clone
            end
            @trail.pop
        end
    end
    def printResult
        @longest.each_with_index { |val,i|
            if (nextobj = @longest[i+1]) then
                nextchrs = nextobj.sortedWord.split(//)
                curchrs = val.sortedWord.split(//)
                curchrs.each { |c|
nextchrs.delete_at(nextchrs.index(c)) }
                print "#{val.to_s} + #{nextchrs[0]} ->
#{nextobj.to_s}\n"
            end
        }
    end
    attr_reader :longest
end

list = WordList.new
print "Building WordList....\n"
ARGF.each { |l| list.addWord(l.chomp.downcase) }
print "Searching....\n"
agSearcher = Searcher.new(list)
list.objsWithLength(3).each { |o| 
    agSearcher.search(o) 
}
print "Done...\n\n"
agSearcher.printResult
print "\n"

In This Thread