[#11822] RCR: Input XML support in the base Ruby — Dave Thomas <Dave@...>

15 messages 2001/03/01

[#11960] Not Ruby, for me, for the moment at least — "Michael Kreuzer" <mkreuzer@... (nospam)>

I wrote on this newsgroup last weekend about how I was considering using

11 messages 2001/03/04

[#12023] French RUG ? — "Jerome" <jeromg@...>

Hi fellow rubyers,

16 messages 2001/03/05

[#12103] disassembling and reassembling a hash — raja@... (Raja S.)

Given a hash, h1, will the following always hold?

20 messages 2001/03/06

[#12204] FEATURE REQUEST: 'my' local variables — Leo Razoumov <see_signature@127.0.0.1>

Ruby is, indeed, a very well designed language.

64 messages 2001/03/07
[#12250] Re: FEATURE REQUEST: 'my' local variables — Leo Razoumov <see_signature@127.0.0.1> 2001/03/07

>>>>> "GK" == GOTO Kentaro <gotoken@math.sci.hokudai.ac.jp> writes:

[#12284] Re: FEATURE REQUEST: 'my' local variables — gotoken@... (GOTO Kentaro) 2001/03/08

In message "[ruby-talk:12250] Re: FEATURE REQUEST: 'my' local variables"

[#12289] Re: FEATURE REQUEST: 'my' local variables — matz@... (Yukihiro Matsumoto) 2001/03/08

Hi,

[#12452] Re: FEATURE REQUEST: 'my' local variables — gotoken@... (GOTO Kentaro) 2001/03/12

In message "[ruby-talk:12289] Re: FEATURE REQUEST: 'my' local variables"

[#12553] Re: FEATURE REQUEST: 'my' local variables — Dave Thomas <Dave@...> 2001/03/13

matz@zetabits.com (Yukihiro Matsumoto) writes:

[#12329] Math package — Mathieu Bouchard <matju@...>

18 messages 2001/03/09

[#12330] Haskell goodies, RCR and challenge — Robert Feldt <feldt@...>

Hi,

19 messages 2001/03/09
[#12374] Re: Haskell goodies, RCR and challenge — matz@... (Yukihiro Matsumoto) 2001/03/10

Hi,

[#12349] Can Ruby-GTK display Gif Png or Jpeg files? — Phlip <phlip_cpp@...>

Ruby-san:

20 messages 2001/03/09

[#12444] class variables — Max Ischenko <max@...>

14 messages 2001/03/12

[#12606] Order, chaos, and change requests :) — Dave Thomas <Dave@...>

17 messages 2001/03/14

[#12635] email address regexp — "David Fung" <dfung@...>

i would like to locate probable email addresses in a bunch of text files,

12 messages 2001/03/14

[#12646] police warns you -- Perl is dangerous!! — Leo Razoumov <see_signature@127.0.0.1>

I just read this story on Slashdot

14 messages 2001/03/14
[#12651] Re: police warns you -- Perl is dangerous!! — pete@... (Pete Kernan) 2001/03/14

On 14 Mar 2001 11:46:35 -0800, Leo Razoumov <see_signature@127.0.0.1> wrote:

[#12691] Re: police warns you -- Perl is dangerous!! — "W. Kent Starr" <elderburn@...> 2001/03/15

On Wednesday 14 March 2001 15:40, Pete Kernan wrote:

[#12709] [OFFTOPIC] Re: police warns you -- Perl is dangerous!! — Stephen White <spwhite@...> 2001/03/16

On Fri, 16 Mar 2001, W. Kent Starr wrote:

[#12655] Re: FEATURE REQUEST: 'my' local variables — "Benjamin J. Tilly" <ben_tilly@...>

>===== Original Message From Leo Razoumov <see_signature@127.0.0.1> =====

18 messages 2001/03/14

[#12706] Library packaging — "Nathaniel Talbott" <ntalbott@...>

I have a project that I'm working on that needs to live two different lives,

30 messages 2001/03/16

[#12840] Looking for a decent compression scheme — Dave Thomas <Dave@...>

14 messages 2001/03/19

[#12895] differences between range and array — "Doug Edmunds" <dae_alt3@...>

This code comes from the online code examples for

16 messages 2001/03/20
[#12896] Re: differences between range and array — "Hee-Sob Park" <phasis@...> 2001/03/20

[#12899] Re: differences between range and array — Jim Freeze <jim@...> 2001/03/20

On Tue, 20 Mar 2001, Hee-Sob Park wrote:

[#12960] TextBox ListBox — Ron Jeffries <ronjeffries@...>

Attached is a little Spike that Chet and I are doing. It is a

13 messages 2001/03/20

[#12991] [ANN] Lapidary 0.2.0 — "Nathaniel Talbott" <ntalbott@...>

Well, here's my first major contribution to the Ruby world: Lapidary. It's a

16 messages 2001/03/20

[#13028] mkmf question — Luigi Ballabio <luigi.ballabio@...>

15 messages 2001/03/21

[#13185] Reading a file backwards — "Daniel Berger" <djberg96@...>

Hi all,

21 messages 2001/03/25
[#13197] Re: Reading a file backwards — "Daniel Berger" <djberg96@...> 2001/03/25

> Hi Dan,

[#13203] Re: Reading a file backwards — Mathieu Bouchard <matju@...> 2001/03/25

On Sun, 25 Mar 2001, Daniel Berger wrote:

[#13210] Re: Reading a file backwards — "Daniel Berger" <djberg96@...> 2001/03/25

"Mathieu Bouchard" <matju@sympatico.ca> wrote in message

[#13374] Passing an array to `exec'? — Lloyd Zusman <ljz@...>

I'd like to do the following:

15 messages 2001/03/31

[#13397] Multidimensional arrays and hashes? — Lloyd Zusman <ljz@...>

Is it possible in ruby to make use of constructs that correspond to

14 messages 2001/03/31

[ruby-talk:12876] Re: Looking for a decent compression scheme

From: Michael Neumann <neumann@...>
Date: 2001-03-19 18:02:37 UTC
List: ruby-talk #12876
Robert Feldt wrote:
> On Mon, 19 Mar 2001, Michael Neumann wrote:
> 
> > bzip2 uses BWT (I don't recall what that stands for).
> > You can use BWT in combination with RLE which results in 
> > better compression as RLE alone.
> > 
> BWT is Burrows-Wheeler transform.
> 
> > I've implemented BWT some time ago in Ruby, but the whole program
> > including RLE was about 100 lines of code.
> > 
> > If you're interested I'll send you the sourcecode.
> >  
> I'd be interested; please send it to me.

The source is below.
BWT only is very short, but it makes no sense to use BWT alone, because
it do not compress. 

> > Another way could be to use what I call "bit table" compression,
> > where I generate an array of the most frequently used characters
> > and compress the whole data with a reduced bit-size (e.g. 5 bit). 
> > 
> Sounds like Huffman-coding to me?

Only that I do not create a tree.



#######################################



#!/usr/local/bin/ruby

#
# BWT compression
# 



class String  
  # rotates the string left, returns copy of the string
  def rol(n)
    self[n,size] + self[0,n]
  end
end # class String


##############################


def bwt_compress(str)
  arr = (0...(str.size)).to_a

  arr.sort! { |a,b|
    str.rol(a) <=> str.rol(b)
  }
  start_with = arr.index(0)

  l = arr.collect {|i| str.rol(i)[-1,1]}.join("")
  [start_with, l]
end



def generate_transformation_vector(l,f)
  l = l.split("")
  f = f.split("")

  t = []
  f.each_with_index {|ele,i|
    t[i] = l.index(f[i])
    l[t[i]] = nil
  }
  return t
end


def bwt_decompress(start_with, l)
  str = ""
  i = start_with
  f = l.split("").sort.join("")
  t = generate_transformation_vector(l,f)
  
  while str.size != l.size do
     str += f[i,1]
     i = t[i]
  end
  return str
end

##############################

#
# escape_char had to be an Integer
#
def rle_compress(escape_char, str)
  last_char = nil
  buf_size = 0
  ret_str = ""

  for i in 0...(str.size) do
       
    if buf_size == 255 then
      ret_str += escape_char.chr + buf_size.chr + last_char.chr
      buf_size = 0
      last_char = nil
    end
    
    if str[i] == last_char then
      buf_size += 1
    else
      if buf_size == 0 then
      elsif buf_size > 3 or last_char == escape_char then
        ret_str += escape_char.chr + buf_size.chr + last_char.chr
      else
        buf_size.times { ret_str += last_char.chr }      
      end
      buf_size = 1
      last_char = str[i]
    end 

  end
  
  if buf_size > 0 then
    if buf_size > 3 or last_char == escape_char then
      ret_str += escape_char.chr + buf_size.chr + last_char.chr
    else
      ret_str += last_char.chr
    end
  end 
  ret_str
end


def rle_decompress(escape_char, str)
  ret_str = ""
  i = 0
  while i < str.size do
    if str[i] == escape_char then
      ret_str += str[i+2].chr * str[i+1]
      i += 3
    else
      ret_str += str[i].chr
      i += 1
    end
  end
  ret_str
end


########################




def compress(str,f)
  start_with, l = bwt_compress(str)

  f.puts start_with
  f.print l#rle_compress(255, l)
end


def decompress(f)
  start_with = f.gets.to_i  
  cp = f.read

  bwt_decompress( start_with, cp)#rle_decompress(255, cp)) 
end

mode = ARGV.shift
from_file = ARGV.shift
to_file   = ARGV.shift


case mode
when "compress"
  File.open(to_file, "w+") {|f|
    compress( File::readlines(from_file).to_s, f )
  }
when "decompress"
  File.open(to_file, "w+") {|f|
    f.print decompress(File::open(from_file))
  }
end



--
Michael Neumann

In This Thread