Skip to content

Instantly share code, notes, and snippets.

@Kroisse
Created March 24, 2014 11:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kroisse/9738650 to your computer and use it in GitHub Desktop.
Save Kroisse/9738650 to your computer and use it in GitHub Desktop.
use std::io::IoResult;
trait Shape {
fn draw(&self, size: uint, buf: &mut Writer) -> IoResult<()>;
}
fn draw<T: Shape>(shape: T, size: uint) {
match shape.draw(size, &mut std::io::stdio::stdout()) {
Ok(_) => (),
Err(e) => fail!(e),
}
}
struct Triangle {
ch: char,
}
struct Diamond {
ch: char,
}
impl Shape for Triangle {
fn draw(&self, size: uint, buf: &mut Writer) -> IoResult<()> {
for i in range(1, size + 1) {
for _ in range(0, i) {
try!(write!(buf, "{}", self.ch));
}
try!(writeln!(buf, ""));
}
Ok(())
}
}
impl Shape for Diamond {
fn draw(&self, size: uint, buf: &mut Writer) -> IoResult<()> {
let pad = size & 1;
let radius = size / 2 + 1;
for i in range(1, radius + pad).chain(range(1, radius).rev()) {
for _ in range(1, radius - i) {
try!(write!(buf, " "));
}
for _ in range(0, i * 2 - pad) {
try!(write!(buf, "{}", self.ch));
}
try!(writeln!(buf, ""));
}
Ok(())
}
}
fn main() {
let t = Triangle { ch: '*' };
let d = Diamond { ch: '#' };
draw(t, 8);
draw(d, 8);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment