From: Adam Shelly Date: 2006-03-08T04:58:24+09:00 Subject: Re: [QUIZ] The Golden Fibonacci Ratio (#69) On 3/3/06, Ruby Quiz 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<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