------ art_17925_9518028.1173619425212 Content-Type: multipart/alternative; boundary --- art_17926_15519589.1173619425212" ------ art_17926_15519589.1173619425212 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: quoted-printable Content-Disposition: inline right, code got mangled, here's the file On 3/11/07, Christoffer Lern<lerno / dragonascendant.com> wrote: > > Fun Quiz! > > Here's my solution (ASCII only I'm afraid). I use a wrapper object to > handle a neighbourhood. Since I only allow access one at a time, I > simply recycled a single object. This is unsafe in the general case, > but works nicely here I think. > > My code for rotations are explicit than calculated, but I find it > easier to read and understand what is going on. > > > #!/usr/bin/env ruby -w > > module SimFrost > > class FrostGrid > > attr_reader :data > > def initialize(width, height, percent) > @width, @height = width, height > @data = Array.new(height) { Array.new(width) { rand * 100 < > percent ? '.' : ' ' }.join } > self[width / 2, height / 2] = ?* > @neighbourhood = Neighbourhood.new(self) > @tick = 0 > end > > def [](x, y) > @data[y % @height][x % @width] > end > > def []=(x, y, value) > @data[y % @height][x % @width] = value > end > > def tick > @tick += 1 > vapour = 0 > each_neighbourhood do |neighbourhood| > neighbourhood.mutate > vapour += 1 if neighbourhood.contains_vapour? > end > vapour > end > > def draw_freeze > draw # Before we start freezing > draw while tick > 0 > draw # After everything is frozen > end > > def draw > puts "Tick: #{@tick}" > puts "+" + "-" * @width + "+" > @data.each { |row| puts "|#{row}|" } > puts "+" + "-" * @width + "+" > end > > def each_neighbourhood > @tick.step(@tick + @height, 2) do |y| > @tick.step(@tick + @width, 2) do |x| > yield @neighbourhood[x, y] > end > end > end > > end > > class Neighbourhood > > 2.times do |y| > 2.times do |x| > class_eval "def xy#{x}#{y}; @grid[@x + #{x}, @y + #{y}]; end" > class_eval "def xy#{x}#{y}=(v); @grid[@x + #{x}, @y + #{y}] > = v; end" > end > end > > def initialize(grid) > @grid = grid > end > > def [](x, y) > @x, @y = x, y > self > end > > def ccw90 > self.xy00, self.xy10, self.xy01, self.xy11 = xy10, xy11, xy00, > xy01 > end > > def cw90 > self.xy00, self.xy10, self.xy01, self.xy11 = xy01, xy00, xy11, > xy10 > end > > def each_cell > @y.upto(@y + 1) { |y| @x.upto(@x + 1) { |x| yield x, y } } > end > > def contains?(c) > each_cell { |x, y| return true if @grid[x, y] == c } > false > end > > def contains_ice? > contains? ?* > end > > def contains_vapour? > contains? ?. > end > > def freeze > each_cell { |x, y| @grid[x, y] = ?* if @grid[x, y] == ?. } > end > > def rotate_random > rand < 0.5 ? ccw90 : cw90 > end > > def mutate > contains_ice? ? freeze : rotate_random > end > > def to_s > "+--+\n+" << xy00 << xy10 << "+\n+" << xy01 << xy11 << "+\n+--+" > end > end > > > def SimFrost.simfrost(width, height, percent = 50) > FrostGrid.new(width, height, percent).draw_freeze > end > > end > > if __FILE__ == $PROGRAM_NAME > SimFrost::simfrost(40, 20, 35) > end > > > > ------ art_17926_15519589.1173619425212 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline right, code got mangled, here's the file<br><br><div><span class="gmail_quote">On 3/11/07, <b class="gmail_sendername">Christoffer Lern/b>lt;lerno / dragonascendant.com> wrote: </span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Fun Quiz!<br><br>Here's my solution (ASCII only I'm afraid). I use a wrapper object to <br>handle a neighbourhood. Since I only allow access one at a time, I<br>simply recycled a single object. This is unsafe in the general case,<br>but works nicely here I think.<br><br>My code for rotations are explicit than calculated, but I find it <br>easier to read and understand what is going on.<br><br><br>#!/usr/bin/env ruby -w<br><br>module SimFrost<br><br> class FrostGrid<br><br> attr_reader :data<br><br> def initialize(width, height, percent)<br> @width, @height = width, height <br> @data = Array.new(height) { Array.new(width) { rand * 100 <<br>percent ? '.' : ' ' }.join }<br> self[width / 2, height / 2] =*<br> @neighbourhood = Neighbourhood.new(self)<br> @tick = 0 <br> end<br><br> def [](x, y)<br> @data[y % @height][x % @width]<br> end<br><br> def []=(x,, value)<br> @data[y % @height][x % @width] = value<br> end<br><br> def tick<br> @tick += 1 <br> vapour = 0<br> each_neighbourhood do |neighbourhood|<br> neighbourhood.mutate<br> vapour += 1 if neighbourhood.contains_vapour?<br> end<br> vapour<br> end<br><br> def draw_freeze <br> draw # Before we start freezing<br> draw while tick > 0<br> draw # After everything is frozen<br> end<br><br> def draw<br> puts "Tick: #{@tick}"<br> puts "+" + "-" * @width + "+" <br> @data.each { |row| puts "|#{row}|" }<br> puts "+" + "-" * @width + "+"<br> end<br><br> def each_neighbourhood<br> @tick.step(@tick + @height, 2) do |y| <br> @tick.step(@tick + @width, 2) do |x|<br> yield @neighbourhood[x, y]<br> end<br> end<br> end<br><br> end<br><br> class Neighbourhood<br><br> 2.times do |y|<br> 2.times do |x|<br> class_eval "def xy#{x}#{y}; @grid[@x + #{x}, @y + #{y}]; end"<br> class_eval "def xy#{x}#{y}=(v); @grid[@x + #{x}, @y + #{y}]<br>= v; end"<br> end<br> end<br><br> def initialize(grid) <br> @grid = grid<br> end<br><br> def [](x, y)<br> @x, @y = x, y<br> self<br> end<br><br> def ccw90<br> self.xy00, self.xy10, self.xy01, self.xy11 = xy10, xy11, xy00,<br>xy01<br> end <br><br> def cw90<br> self.xy00, self.xy10, self.xy01, self.xy11 = xy01, xy00, xy11,<br>xy10<br> end<br><br> def each_cell<br> @y.upto(@y + 1) { |y| @x.upto(@x + 1) { |x| yield x, y } }<br> end <br><br> def contains?(c)<br> each_cell { |x, y| return true if @grid[x, y] == c }<br> false<br> end<br><br> def contains_ice?<br> contains? ?*<br> end<br><br> def contains_vapour?<br> contains? ?.<br> end<br><br> def freeze<br> each_cell { |x, y| @grid[x, y] = ?* if @grid[x, y] == ?. }<br> end<br><br> def rotate_random<br> rand < 0.5 ? ccw90 :w90<br> end<br><br> def mutate<br> ontains_ice? ? freeze : rotate_random<br> end<br><br> def to_s<br> "+--+\n+" << xy00 << xy10 << "+\n+" << xy01 << xy11 << "+\n+--+" <br> end<br> end<br><br><br> def SimFrost.simfrost(width, height, percent = 50)<br> FrostGrid.new(width, height, percent).draw_freeze<br> end<br><br>end<br><br>if __FILE__ == $PROGRAM_NAME<br> SimFrost::simfrost(40, 20, 35) <br>end<br><br><br><br></blockquote></div><br> ------ art_17926_15519589.1173619425212-- ------ art_17925_9518028.1173619425212 Content-Type: application/octet-stream; name=snowflake.rb Content-Transfer-Encoding: base64 X-Attachment-Id: f_ez5j2szu Content-Disposition: attachment; filename="snowflake.rb" Y2xhc3MgU25vd2ZsYWtlDQogIGF0dHJfcmVhZGVyIDpncmlkLCA6dmFwb3INCiAgZGVmIGluaXRp YWxpemUgKHlfc2l6ZT0yNCwgeF9zaXplPTMwLCB2YXBvcl9wZXJjZW50PTMwKQ0KICAgIEB5X3Np emU9eV9zaXplLzIqMiAgICAjdGhpcyBzaG91bGQgdGFrZSBjYXJlIG9mIHRob3NlIG9kZCBudW1i ZXJzDQogICAgQHhfc2l6ZT14X3NpemUvMioyDQogICAgQHZhcG9yX3BlcmNlbnQ9dmFwb3JfcGVy Y2VudA0KICAgIEB2YWN1dW09IiAiDQogICAgQHZhcG9yPSIrIg0KICAgIEBpY2U9IioiDQogICAg QG9mZnNldD0xDQogICAgY3JlYXRlX2dyaWQNCiAgZW5kDQogIA0KICBkZWYgY3JlYXRlX2dyaWQN CiAgICBAZ3JpZD1BcnJheS5uZXcoQHlfc2l6ZSl7QXJyYXkubmV3KEB4X3NpemUpfQ0KICAgIEBn cmlkLmNvbGxlY3QhIGRvIHxyb3d8DQogICAgICByb3cuY29sbGVjdCEgZG8gfHNxdWFyZXwNCiAg ICAgICAgcmFuZCgxMDApIDwgQHZhcG9yX3BlcmNlbnQgPyBAdmFwb3IgOiBAdmFjdXVtDQogICAg ICBlbmQNCiAgICBlbmQNCiAgICBAZ3JpZFtAeV9zaXplLzJdW0B4X3NpemUvMl09QGljZQ0KICBl bmQNCiAgDQogIGRlZiBjaGVja19uZWlnaGJvcmhvb2RzDQogICAgQG9mZnNldCA9IChAb2Zmc2V0 ICsxKSUyDQogICAgQGdyaWQuY29sbGVjdCF7fHJvd3wgcm93LnB1c2gocm93LnNsaWNlISgwKSl9 LnB1c2goQGdyaWQuc2xpY2UhKDApKSBpZiBAb2Zmc2V0ID09IDEgICN0b3J1cyBtZSENCiAgICAo MC4uLkB5X3NpemUpLnN0ZXAoMikgZG8gfGl8DQogICAgICAoMC4uLkB4X3NpemUpLnN0ZXAoMikg ZG8gfGp8DQogICAgICAgIG5laWdoYm9yaG9vZD1bQGdyaWRbaV1bal0sIEBncmlkW2ldW2orMV0s IEBncmlkW2krMV1bal0sIEBncmlkW2krMV1baisxXV0NCiAgICAgICAgaWYgIW5laWdoYm9yaG9v ZC5pbmNsdWRlPyhAdmFwb3IpDQogICAgICAgIGVsc2lmIG5laWdoYm9yaG9vZC5pbmNsdWRlPyhA aWNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0aGVyZSdzIGdvdCB0byBi ZSBhIHJ1YnllciB3YXkgb2YgZG9pbmcgdGhpcy4uLg0KICAgICAgICAgIEBncmlkW2ldW2pdICAg ICAgICAgPUBpY2UgaWYgIEBncmlkW2ldW2pdICAgICAgICAgICA9PSBAdmFwb3IgICAgICN0b3Ag bGVmdCBjb3JuZXINCiAgICAgICAgICBAZ3JpZFtpXVtqKzFdICAgICA9QGljZSBpZiAgQGdyaWRb aV1baisxXSAgICAgICA9PSBAdmFwb3IgICAgICNvbmUgcmlnaHQNCiAgICAgICAgICBAZ3JpZFtp KzFdW2pdICAgICA9QGljZSBpZiAgQGdyaWRbaSsxXVtqXSAgICAgICA9PSBAdmFwb3IgICAgICNv bmUgZG93bg0KICAgICAgICAgIEBncmlkW2krMV1baisxXSA9QGljZSBpZiAgQGdyaWRbaSsxXVtq KzFdICAgPT0gQHZhcG9yICAgICAjcmlnaHQgYW5kIGRvd24NCiAgICAgICAgZWxzaWYgcmFuZCgy KT09MQ0KICAgICAgICAgIEBncmlkW2ldW2pdLCBAZ3JpZFtpXVtqKzFdLCBAZ3JpZFtpKzFdW2pd LCBAZ3JpZFtpKzFdW2orMV0gPSBAZ3JpZFtpKzFdW2pdLCBAZ3JpZFtpXVtqXSwgQGdyaWRbaSsx XVtqKzFdLCBAZ3JpZFtpXVtqKzFdDQogICAgICAgIGVsc2UgICAgICAgICNJdCdzIHRoZSBjb3Jy ZWN0IHNlcXVlbmNlLCBtYXliZS4uLiAgSSB0aGluay4uLg0KICAgICAgICAgIEBncmlkW2ldW2pd LCBAZ3JpZFtpXVtqKzFdLCBAZ3JpZFtpKzFdW2pdLCBAZ3JpZFtpKzFdW2orMV0gPSBAZ3JpZFtp XVtqKzFdLCBAZ3JpZFtpKzFdW2orMV0sIEBncmlkW2ldW2pdLCBAZ3JpZFtpKzFdW2pdDQogICAg ICAgIGVuZA0KICAgICAgZW5kDQogICAgZW5kICAgI3BvcCBpcyB0byBwdXNoLCBhcyBzbGljZSEo MCkgaXMgdG8gPz8/LiAgTWFueSB0aGFua3MgdG8gSmFtZXMgRWR3YXJkIEdyYXk6IGZsaXAgdGhl IGRhdGEhDQogICAgQGdyaWQucmV2ZXJzZSEuY29sbGVjdCF7fHJvd3wgcm93LnJldmVyc2UhLnB1 c2gocm93LnNsaWNlISgwKSkucmV2ZXJzZSF9LnB1c2goQGdyaWQuc2xpY2UhKDApKS5yZXZlcnNl ISBpZiBAb2Zmc2V0ID09MQ0KICBlbmQNCiAgDQogIGRlZiB0b19zDQogICAgQGdyaWQuY29sbGVj dHt8cm93fCByb3cuam9pbn0uam9pbigiXG4iKSAgICANCiAgZW5kDQplbmQNCg0Kcz1Tbm93Zmxh a2UubmV3KDE4LDE4LDEwKQ0Kd2hpbGUgcy5ncmlkLmNvbGxlY3R7fHJvd3wgdHJ1ZSBpZiByb3cu aW5jbHVkZT8ocy52YXBvcil9LmluY2x1ZGU/KHRydWUpDQogIHB1dHMgcw0KICA1LnRpbWVzIGRv IHB1dHMgZW5kDQogIHNsZWVwKDAuMSkNCiAgcy5jaGVja19uZWlnaGJvcmhvb2RzDQplbmQNCiAg cHV0cyBzDQoNCj1iZWdpbiBSdW5uaW5nIHRocnUgdGhlIGZpbmlzaCBsaW5lDQoNCiAgICAgICAg ICAgICAgICoqDQogICAgICAgKiAgICAgICAqDQogICAgICAgKiAgICogICoNCiAgICAgICAgKiAg ICoqDQogICAgICAgICAqKiAqKg0KICAgICAgICAgICoqDQogICAgICAgICoqKiAqDQogICAgICAg ICAgKioqDQogICAgICAgICAgICogKg0KICAgICAgICAgICAgKiAqDQogICAgICAgICAgICAgKg0K ICAgICAgICAgICAgICoNCj1lbmQ------ art_17925_9518028.1173619425212--