2011-05-12 17:24:54 +02:00
|
|
|
/* -*- mode::rust;indent-tabs-mode::nil -*-
|
2010-09-20 22:08:28 +01:00
|
|
|
* Implementation of 99 Bottles of Beer
|
|
|
|
* http://99-bottles-of-beer.net/
|
|
|
|
*/
|
|
|
|
use std;
|
2011-05-17 20:41:41 +02:00
|
|
|
import std::int;
|
|
|
|
import std::str;
|
2010-09-20 22:08:28 +01:00
|
|
|
|
|
|
|
tag bottle { none; dual; single; multiple(int);}
|
|
|
|
|
|
|
|
fn show(bottle b) {
|
|
|
|
alt(b) {
|
|
|
|
case (none) {
|
|
|
|
log "No more bottles of beer on the wall, no more bottles of beer,";
|
|
|
|
log "Go to the store and buy some more, "
|
|
|
|
+"99 bottles of beer on the wall.";
|
|
|
|
}
|
|
|
|
case (single) {
|
|
|
|
log "1 bottle of beer on the wall, 1 bottle of beer,";
|
|
|
|
log "Take one down and pass it around, "
|
|
|
|
+"no more bottles of beer on the wall.";
|
|
|
|
}
|
|
|
|
case (dual) {
|
|
|
|
log "2 bottles of beer on the wall, 2 bottles of beer,";
|
|
|
|
log "Take one down and pass it around, 1 bottle of beer on the wall.";
|
|
|
|
}
|
|
|
|
case (multiple(?n)) {
|
2011-05-17 20:41:41 +02:00
|
|
|
let str nb = int::to_str(n, 10u);
|
|
|
|
let str mb = int::to_str(n - 1, 10u);
|
2010-09-20 22:08:28 +01:00
|
|
|
log nb + " bottles of beer on the wall, " + nb + " bottles of beer,";
|
|
|
|
log "Take one down and pass it around, "
|
|
|
|
+ mb + " bottles of beer on the wall.";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fn next(bottle b) -> bottle {
|
|
|
|
alt(b) {
|
|
|
|
case (none) {
|
|
|
|
ret none;
|
|
|
|
}
|
|
|
|
case (single) {
|
|
|
|
ret none;
|
|
|
|
}
|
|
|
|
case (dual) {
|
|
|
|
ret single;
|
|
|
|
}
|
|
|
|
case (multiple(3)) {
|
|
|
|
ret dual;
|
|
|
|
}
|
|
|
|
case (multiple(?n)) {
|
|
|
|
ret multiple(n - 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Won't need this when tags can be compared with ==
|
|
|
|
fn more(bottle b) -> bool {
|
|
|
|
alt(b) {
|
|
|
|
case (none) {
|
|
|
|
ret false;
|
|
|
|
}
|
|
|
|
case (_) {
|
|
|
|
ret true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fn main() {
|
|
|
|
let bottle b = multiple(99);
|
|
|
|
let bool running = true;
|
|
|
|
while (running) {
|
|
|
|
show(b);
|
|
|
|
log "";
|
|
|
|
running = more(b);
|
|
|
|
b = next(b);
|
|
|
|
}
|
|
|
|
}
|