書籍「7つの言語7つの世界」Io言語2日目セルフスタディ
http://github.com/yppp/sevenlang
二次元配列の総和
dim2sum := method(n, n flatten sum) dim2sum := method(n, n prepend(0) reduce(x, y, x = x + y sum))
Listに自分で定義した平均を求めるメソッドを追加、数字以外が混ざっていたら例外を投げるように
List myAvg := method(reduce(x, y, if(y proto != Number, Exception raise("二度と数字以外を入れるんじゃねーぞ、バーカ!"), x + y)) / size)
二次元配列を現わすプロトタイプを書くdimはxとyの大きさのリストを確保、ゲッターとセッター、transposeは行列で言う所の転置をするメソッド
Dim2list := Object clone do( dim := method(x, y, result := list(); y repeat(nl := list(); x repeat(nl append(nil)); result append(nl)); self lis := result); set := method(x, y, val, self lis at(y) atPut(x, val); self lis); get := method(x, y, self lis at(y) at(x)); transpose := method( result := Dim2list clone; write(self lis at(0) size, self lis size, "\n"); result dim(self lis size, self lis at(0) size); self lis at(0) size repeat(i, self lis size repeat(j, write(i,j,"\n"); result set(j, i, self get(i, j))))); )
ファイルから二次元配列を読んだり書いたりする
maread := method(path, lis := list(); File open(path) readLines foreach(line, lis append(line split(" ") select(v, v != "") map(v, v asNumber))); File open(path) close; lis); mawrite := method(path, lis, f := File open(path); lis foreach(v, f write(v join(" ") append("\n" at(0)))); File open(path) close; lis);
数当てゲーム、前の答えより近づいたか遠くなったか答えるたび表示する
hitandblow := method( f := File standardInput num := (Random value(99) + 1) floor; prev := 0; 10 repeat(i, in := f readLine asNumber; if(num == in, "hit!" println; break); if(prev != 0, if(prev > ((num - in) abs), "near" println, "far" println)); prev = (num - in) abs; if(i == 9, write("fail ", "atarinumber ", num)); ); )