[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

[QUIZ][SOLUTION] Mexican Blanket (#127

Jesse Edelstein

6/10/2007 4:59:00 PM

Here's a basic toolkit for drawing Mexican blankets in xterm.
Unfortunately, it *only* works in xterm and the like, and only in
those compiled with 256 color support, because the control codes are
so arcane. In fact, the code is quite simple - this quiz is really
more a matter of presentation, and I hope to find a nicer way to draw
this.

Some stuff to be improved on:
- Ugly (better if you turn the font size way down and make ARGV[0] large)
- Xterm-only
- The pattern is entirely hardcoded - I have to input all colors, the
order of dividers, etc. A more elgant solution would know something
about color fading and might be able to make some aesthetic choices on
its own. I really didn't want to have to implement that in xterm,
though!

def gradient(color_list)
old = [color_list[0]]
pattern = old*5
(1...color.length).each do |i|
new = [color_list[i]]
1.upto(5) { |j| pattern += new*j + old*(5-j) }
old = new
end
return pattern
end

def divider(color)
[color.to_s]*5
end

def mexico
["28"]*4 + ["15"]*4 + ["88"]*4
end

# generate pattern
pattern = gradient(%w[16 22 28 34 40 46])
pattern += divider(0) #divider
pattern += gradient(%w[21 20 19 18 17 16])
pattern += mexico
pattern += gradient(%w[196 197 198 199 200 201])
pattern += divider(0)
pattern += gradient(%w[226 220 214 208 202 196])

# width of the flag from CLI
flagwidth = ARGV[0] ? ARGV[0].to_i : 80

# translate to xterm (256-color) control codes, and then print
pattern.collect! {|i| "\033[48;5;#{i}m "}
while (pattern.length >= flagwidth) do
puts pattern[0...flagwidth].join + "\033[0m"
pattern.slice!(0)
end

1 Answer

Jesse Edelstein

6/10/2007 6:02:00 PM

0

On 6/10/07, Jesse Edelstein <jmedelstein@gmail.com> wrote:
> Here's a basic toolkit for drawing Mexican blankets in xterm.
> Unfortunately, it *only* works in xterm and the like, and only in
> those compiled with 256 color support, because the control codes are
> so arcane. In fact, the code is quite simple - this quiz is really
> more a matter of presentation, and I hope to find a nicer way to draw
> this.
>
> Some stuff to be improved on:
> - Ugly (better if you turn the font size way down and make ARGV[0] large)
> - Xterm-only
> - The pattern is entirely hardcoded - I have to input all colors, the
> order of dividers, etc. A more elgant solution would know something
> about color fading and might be able to make some aesthetic choices on
> its own. I really didn't want to have to implement that in xterm,
> though!

Oops. Here's a corrected version that will actually run.

def gradient(color_list)
old = [color_list[0]]
pattern = old*5
(1...color_list.length).each do |i|
new = [color_list[i]]
1.upto(5) { |j| pattern += new*j + old*(5-j) }
old = new
end
return pattern
end

def divider(color)
[color.to_s]*5
end

def mexico
["28"]*4 + ["15"]*4 + ["88"]*4
end

# generate pattern
pattern = gradient(%w[16 22 28 34 40 46])
pattern += divider(0) #divider
pattern += gradient(%w[21 20 19 18 17 16])
pattern += mexico
pattern += gradient(%w[196 197 198 199 200 201])
pattern += divider(0)
pattern += gradient(%w[226 220 214 208 202 196])

# width of the flag from CLI
flagwidth = ARGV[0] ? ARGV[0].to_i : 80

# translate to xterm (256-color) control codes, and then print
pattern.collect! {|i| "\033[48;5;#{i}m "}
while (pattern.length >= flagwidth) do
puts pattern[0...flagwidth].join + "\033[0m"
pattern.slice!(0)
end