[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: [QUIZ] The Golden Fibonacci Ratio (#69

Adam Shelly

3/7/2006 7:58:00 PM

On 3/3/06, Ruby Quiz <james@grayproductions.net> wrote:
> The idea with the Fibonacci series is to do the same thing in reverse. So the
> quiz:
>
> What you do is start with a square (1 by 1), find the longer side, and add a
> square of that size to the whole thing to form a new rectangle.

I used this quiz as an excuses to get Ncurses-ruby running on my
Windows box. It was fairly painless, once I found PDCurses. I used
panel borders to draw the boxes, and animated the thing as it grows.
I also added a bunch of command line options for windows:
-resize [x y] will change the window size to fit a bigger rectangle.
-newwin [x y] will launch a new window, then resize (if you don't want
to mess up your current command window.
I didn't add the equivalent commands for *nix boxen, it's been too
long since i used one to remember the right commands.
The program works under windows and cygwin. I'd appreciate it if
someone lets me know if it works ok under linux or mac.

-Adam

#----- goldrect.rb
#
# Submission for Ruby Quiz #69
# by Adam Shelly
#
require 'ncurses'


class FibBox
Direction=[:up,:left,:down,:right]
@@boxes = []

def self.moveall y,x
@@boxes.each{|f| f.moverel(y,x,true)}
@@boxes.each{|b| b.unhide}
end
def self.animate isize=1
size = [isize,isize]
f = FibBox.new(Direction[dir=2],size,[0,0])
while true
n = size.max
pos = [0,0]
pos[0]+=size.min if dir==2
pos[1]+=size.min if dir==3
n==size[1] ? size[0]+=n : size[1]+=n
break if (size[0] > Ncurses.LINES) || (size[1] > Ncurses.COLS)
f = FibBox.new(Direction[dir],[n,n],pos)
dir=(dir+1)%4
end
end

def initialize dir,size,pos
@size = size
@pos = pos
func = lambda{FibBox.moveall(0,1)} if dir==:left
func = lambda{FibBox.moveall(1,0)} if dir==:up
case dir
when :left, :right
target = @size[1]
parms=[@size[0],1]+@pos
animate=1
when :down, :up
target = @size[0]
parms=[1,@size[1]]+@pos
animate=0
end
func.call if func
win = Ncurses::WINDOW.new(*parms)
@panel=win.new_panel
show
while parms[animate]!=target
sleep(0.01)
parms[animate]+=1
func.call if func
Ncurses::Panel.update_panels
Ncurses.doupdate()
resize(*parms)
end
@@boxes<<self
end

def hide
@panel.window.border(*([' '[0]]*8))
end
def unhide
@panel.window.border(*([0]*8))
end
def show
unhide
Ncurses::Panel.update_panels
Ncurses.doupdate()
sleep(0.1/@size[0]) #sleep less when box takes longer to draw
end
def resize(sy,sx,ly,lx)
nw=Ncurses::WINDOW.new(sy,sx,ly,lx)
exit(0) if !nw
w = @panel.window
@panel.replace(nw)
w.delete
show
end
def moverel(dy,dx,keephidden=false)
hide
@pos[0]+=dy
@pos[1]+=dx
@panel.move(*@pos)
show unless keephidden
end
end


if __FILE__ == $0
if (ARGV[0].to_i)>0
size = ARGV.shift.to_i
end
if RUBY_PLATFORM =~ /mswin/
case ARGV[0]
when '-h', '-?'
puts "usage: #{$0} [size] [-newwin||-resize] [x y]"
puts " size: initial box size (default 1)"
puts " -resize: resizes your screen to x,y (default 150x90)"
puts " -newwin: launches program in a new resized window"
exit
when '-newwin'
`start /WAIT ruby #{$0} #{size||1} -resize #{ARGV[1]} #{ARGV[2]}`
exit
when '-resize'
`mode con cols=#{ARGV[1]||150} lines=#{ARGV[2]||90}`
end
end
Ncurses.initscr
Ncurses.noecho
FibBox.animate size||1
Ncurses.stdscr.getch
end


1 Answer

G.Durga Prasad

3/8/2006 4:35:00 PM

0

Under linux, I have installed ncurses-ruby-1.0, just now and tried
this program.
The rectangles are drawn fairly satisfactorily , but I loose control
on the xterminal, and the bash prompt ovewrites on the rectangles. I
am forced to close the xterminal. I have to still understand the
program.
Prasad

On 3/8/06, Adam Shelly <adam.shelly@gmail.com> wrote:
> On 3/3/06, Ruby Quiz <james@grayproductions.net> wrote:
> > The idea with the Fibonacci series is to do the same thing in reverse. So the
> > quiz:
> >
> > What you do is start with a square (1 by 1), find the longer side, and add a
> > square of that size to the whole thing to form a new rectangle.
>
> I used this quiz as an excuses to get Ncurses-ruby running on my
> Windows box. It was fairly painless, once I found PDCurses. I used
> panel borders to draw the boxes, and animated the thing as it grows.
> I also added a bunch of command line options for windows:
> -resize [x y] will change the window size to fit a bigger rectangle.
> -newwin [x y] will launch a new window, then resize (if you don't want
> to mess up your current command window.
> I didn't add the equivalent commands for *nix boxen, it's been too
> long since i used one to remember the right commands.
> The program works under windows and cygwin. I'd appreciate it if
> someone lets me know if it works ok under linux or mac.
>
> -Adam
>
> #----- goldrect.rb
> #
> # Submission for Ruby Quiz #69
> # by Adam Shelly
> #
> require 'ncurses'
>
>
> class FibBox
> Direction=[:up,:left,:down,:right]
> @@boxes = []
>
> def self.moveall y,x
> @@boxes.each{|f| f.moverel(y,x,true)}
> @@boxes.each{|b| b.unhide}
> end
> def self.animate isize=1
> size = [isize,isize]
> f = FibBox.new(Direction[dir=2],size,[0,0])
> while true
> n = size.max
> pos = [0,0]
> pos[0]+=size.min if dir==2
> pos[1]+=size.min if dir==3
> n==size[1] ? size[0]+=n : size[1]+=n
> break if (size[0] > Ncurses.LINES) || (size[1] > Ncurses.COLS)
> f = FibBox.new(Direction[dir],[n,n],pos)
> dir=(dir+1)%4
> end
> end
>
> def initialize dir,size,pos
> @size = size
> @pos = pos
> func = lambda{FibBox.moveall(0,1)} if dir==:left
> func = lambda{FibBox.moveall(1,0)} if dir==:up
> case dir
> when :left, :right
> target = @size[1]
> parms=[@size[0],1]+@pos
> animate=1
> when :down, :up
> target = @size[0]
> parms=[1,@size[1]]+@pos
> animate=0
> end
> func.call if func
> win = Ncurses::WINDOW.new(*parms)
> @panel=win.new_panel
> show
> while parms[animate]!=target
> sleep(0.01)
> parms[animate]+=1
> func.call if func
> Ncurses::Panel.update_panels
> Ncurses.doupdate()
> resize(*parms)
> end
> @@boxes<<self
> end
>
> def hide
> @panel.window.border(*([' '[0]]*8))
> end
> def unhide
> @panel.window.border(*([0]*8))
> end
> def show
> unhide
> Ncurses::Panel.update_panels
> Ncurses.doupdate()
> sleep(0.1/@size[0]) #sleep less when box takes longer to draw
> end
> def resize(sy,sx,ly,lx)
> nw=Ncurses::WINDOW.new(sy,sx,ly,lx)
> exit(0) if !nw
> w = @panel.window
> @panel.replace(nw)
> w.delete
> show
> end
> def moverel(dy,dx,keephidden=false)
> hide
> @pos[0]+=dy
> @pos[1]+=dx
> @panel.move(*@pos)
> show unless keephidden
> end
> end
>
>
> if __FILE__ == $0
> if (ARGV[0].to_i)>0
> size = ARGV.shift.to_i
> end
> if RUBY_PLATFORM =~ /mswin/
> case ARGV[0]
> when '-h', '-?'
> puts "usage: #{$0} [size] [-newwin||-resize] [x y]"
> puts " size: initial box size (default 1)"
> puts " -resize: resizes your screen to x,y (default 150x90)"
> puts " -newwin: launches program in a new resized window"
> exit
> when '-newwin'
> `start /WAIT ruby #{$0} #{size||1} -resize #{ARGV[1]} #{ARGV[2]}`
> exit
> when '-resize'
> `mode con cols=#{ARGV[1]||150} lines=#{ARGV[2]||90}`
> end
> end
> Ncurses.initscr
> Ncurses.noecho
> FibBox.animate size||1
> Ncurses.stdscr.getch
> end
>
>