トップ 最新 追記

println '日記'

2004|09|10|

2004-10-01

_ [その他]ジョギング

ループ1周(約5km)を走った。今日は、あまり疲れなかった。

_ [Java]続・J2SE5.0

昨日の日記で1回触れただけなのにもかかわらず、今日は何故かやたら J2SE5.0で検索して来ている人がいるので、Googleで検索してみた。すると、663件中、15件目(10/1 20:30頃)に来ていることがわかった。うーむ、何故こんなに上位に来ているのだろう。よくわからん。

本日のツッコミ(全1件) [ツッコミを入れる]

_ TELL [関係あるかどうかわかりませんが、 筑波朝比奈アンテナで、更新日時表示が??????なのにナゼか一番上です。]

本日のリンク元 | 60 | 6 | 4 | 4 | 2 | 2 | 2 | 2 | 2 | 1 |

2004-10-02

_ [その他]ミーティング

サークルで、明日の登山の最終ミーティング。食料やコンロなどのの振り分けや、明日の天気についての確認などを行った。とりあえず、日中はなんとか曇りで持つだろうということで、登山は決行ということになった。

本日のリンク元 | 11 | 5 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 1 |

2004-10-03

_ [その他]登山中止

今日は、登山の日、だったはずなのだが、現地の付近まで行って、雨が強いため断念ということになった。とはいえ、わざわざ車で遠くまで出かけてきて、そのままつくばに帰るというのもありえないということで、どこか遊べる場所を探すことに。話し合いの結果、巨大迷路パラディアムに行った後、龍王峡に行くことに。

しかし、巨大迷路を終えた段階で、雨で体がかなり濡れてしまったため、龍王峡を中止して、温泉に行くことに。温泉は、露天風呂と屋内の風呂両方があり、館内もきれいで、なかなか良い所だった。これで、雨がなければ最高だったのだが。

温泉に入った後は、帰ることに。昼ごはんを食べていなかったため、帰る途中に、宇都宮によって餃子を食べたが、なかなかうまかった。さすが、餃子の町だ。

餃子を食べた後は、何事も無く、19:00過ぎ頃にはつくばに帰って来た。その後、反省会と晩御飯を終えて、20:30頃、解散した。

本日のリンク元 | 11 | 8 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |

2004-10-04

_ [授業]サイクリング

今週は天気が悪いためか、サイクリングそのものはなく、最来週から始まる、オリエンテーリングについての説明などがあった後、解散した。

_ [Pnuts]Pnutsアップデート

ダウンロードしてみる。今回は、配列式{...}や、未定義変数をタグ関数にするnodeEdit()などが追加されている。

本日のリンク元 | 5 | 5 | 1 | 1 | 1 | 1 |

2004-10-05

_ [授業]プログラミング言語処理

前回に引き続いてyaccの使い方の説明と、これから実習で作る言語処理系tinyCについての説明などがあった。今日は久しぶりにノートパソコンを持っていかなかったので、普通に授業を聞くことに。とはいえ、やはり退屈なので、途中からJava仮想マシン仕様を読んだりしていた。

_ [授業]数値計算

今回は、関数の近似の方法について。実習は、時間内にちゃんと終えて提出することができた。こころなしか、今日の実習は、前回や、前々回 よりも簡単な気がする。

本日のリンク元 | 7 | 2 | 2 | 1 | 1 | 1 |

2004-10-06

_ [プログラミング][Java]虫食い算

IkejiWikiで、虫食い算の話が出ていたので、こちらも解いてみることにする。アルゴリズムとしては、基本的には総当りだが、無駄な計算をしないために、枝狩りをすることにした。また、言語は速度重視ということで、Javaを使った。コードは以下の通り。

import static java.lang.Math.*;
import static java.lang.System.*;

public class Musikuisan{ public static void main(String[] args){ MusikuisanSolver solver = new SimpleSolver(); long start = currentTimeMillis(); solver.solve(); out.printf("time = %d\n", currentTimeMillis() - start); } }
abstract class MusikuisanSolver{ protected int figure_; void solve(){ int n = (int)pow(10, figure_); for(int i = 0; i < n; i ++){ if(pruned(i))continue; for(int j = 0; j < n; j++){ if(satisfied(i, j))correct(i, j); } } } abstract boolean pruned(int n); abstract boolean satisfied(int n, int s); abstract void correct(int n, int s); }
class SimpleSolver extends MusikuisanSolver{ private int[] south_; private int s0_, s1_, s2_, s3_, s4_, s5_; SimpleSolver(){ figure_ = 6; } boolean pruned1(int n){ for(int i = 0; i < 10; i++){ if(n * i / 1000 == 2002)return false; } return true; } boolean pruned2(int n){ for(int i = 0; i < 10; i++){ if((n * i - 2002) % 10000 == 0)return false; } return true; } boolean pruned(int n){ return pruned1(n) || pruned2(n); } private void split(int v, int n){ int rest = v; s0_ = rest / 100000 * n; rest = rest % 100000; s1_ = rest / 10000 * n; rest = rest % 10000; s2_ = rest / 1000 * n; rest = rest % 1000; s3_ = rest / 100 * n; rest = rest % 100; s4_ = rest / 10 * n; rest = rest % 10; s5_ = rest * n; } boolean satisfied(int n, int s){ split(s, n); long t; return (s5_ >= 2002000 && s5_ < 2003000) && (s4_ >= 1000000) && (s3_ >= 100000 && s3_ < 1000000) && (s2_ >= 1000000 && (s2_ - 2002) % 10000 == 0) && (s1_ >= 1000000) && (s0_ >= 1000000) && ((t = (((long)n) * s / 1000000 - 2002)) % 10000 == 0 && t / 10000 > 10); } void correct(int n, int s){ out.printf("n = %d, s = %d\n", n, s); } }

実行結果(実行環境:Pentium M 1GHz, Memory 768MB J2RE1.5.0 on Windows XP)は、

C:\java_example>java Musikuisan
n = 250286, s = 647268
time = 2109

C:\java_example>java -server Musikuisan n = 250286, s = 647268 time = 625

一応、答えがあっているかどうか検算してみると、

C:\java_example>pnuts
Pnuts version 1.1 (20040807001111), 1.5.0 (Sun Microsystems Inc.)
Java HotSpot(TM) Client VM (mixed mode, sharing)
> 250286 * 8
2002288
> 250286 * 6
1501716
> 250286 * 2
500572
> 250286 * 7
1752002
> 250286 * 4
1001144
> 250286 * 6
1501716
> 250286 * 647268
162002118648

となり、正しい答えであることがわかる。

追記:IKeJIWikiにあるRuby版をほぼそのままJavaに移植して、 正規表現でマッチングを行っていたところを、数値演算で 比較するように置き換えたものも作ってみた。

public class Calc{
  public static void main(String[] args){
    int t;
    long start = System.currentTimeMillis();
    for(int a = 100000; a < 1000000; a++){
      for(int b1 = 1; b1 < 10; b1++){
        t = a * b1;
        if(2002000 < t && t < 2002999){
          for(int b2 = 1; b2 < 10; b2++){
            if(a * b2 > 999999){
              for(int b3 = 1; b3 < 10; b3++){
                if(1000000 > a * b3){
                  for(int b4 = 1; b4 < 10; b4++){
                    t = a * b4;
                    if(t > 999999 && (t - 2002) % 10000 == 0){
                      for(int b5 = 1; b5 < 10; b5++){
                        if(a * b5 > 999999){
                          for(int b6 = 1; b6 < 10; b6++){
                            int b = b6 * 100000 + b5 * 10000 + b4 * 1000 + b3 * 100 + b2 * 10 + b1;
                            long r = ((long)a) * b / 1000000 - 2002;
                            if(r / 10000 >= 10 &&
                               r % 10000 == 0){
                              System.out.printf("Hit!! :%d,%d\n",a,b);
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    System.out.printf("time = %d\n", System.currentTimeMillis() - start);
  }
}

実行結果は、

C:\java_example>java Calc
Hit!! :250286,647268
time = 141

C:\java_example>java -server Calc Hit!! :250286,647268 time = 203

この結果を見ると、どうやらIKeJIWiki版の方が、枝狩り刈りをより積極的に行っているためか、速いようだ。しかも、面白いことに、IKeJIWiki版では、Server VMにした方が遅いという結果が出ている。

_ [授業]計算機システム実験

今回は、実験を進める代わりに、プログラミング言語処理の課題3をやっていた。この課題は、単に四則演算+変数への代入+結果の表示の機能のみを持ったインタプリタを作るというだけのもので、実験の時間中に簡単に作ることができた。ちなみに、作成したコードはこちら。

_ [その他]地震

先ほど、かなり大きな地震があった。テレビで確認してみると、震度5弱らしい。こんなに大きな揺れを経験したのは、初めてだ。今までで経験した、一番大きな揺れは、阪神大震災のときだが、震源地からだいぶ離れていたので、震度4ほどだった。

本日のツッコミ(全1件) [ツッコミを入れる]

_ sugi [枝狩りじゃなくて枝刈りな]

本日のリンク元 | 45 | 7 | 3 | 3 | 3 | 2 | 2 | 2 | 1 | 1 |

2004-10-07

_ [プログラミング][Java]続・虫食い算

ついさっき気がついたのだが、昨日のプログラムは、1回実行してその時間を計るだけなので、計測誤差が全く考慮に入っていない。というわけで、後でそれを含めて再度計測し直してみることにする。

本日のリンク元 | 16 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 1 |

2004-10-08

_ [Nice]Nice0.9.9

このバージョンでは、instanceofによる型の判定をコンパイラが静的に検出して、ある型であることが確実である範囲内で、キャストなしで、その型として扱うことが可能になっている。例えば、以下のコードは、コンパイラによるチェックを通過して、正常に実行される。

package ex;
void main(String[] args){
	Object obj = "hello,world";
	assert obj instanceof String;
	println(obj.substring(0, 5));
}

結果は、以下のようになる。

C:\nice_programs>nicec ex
nice.lang: parsing
ex: parsing

C:\nice_programs>java ex.fun hello

また、assert文だけでなく、if文を使ってチェックをすることも可能になっている。

package ex2;
void main(String[] args){
	Object o = "hello,world";
	if(o instanceof String){
		o.substring(0, 5);
	}
}

このようにコンパイラによる静的なチェックを、言語の柔軟性を増すために使っている例はあまり見たことが無いので、なかなか新鮮だ。

_ [その他]ジョギング

ループ1周(約5km)を走ったが、今日もあんまり疲れなかった。だいぶ慣れてきたのかも。

_ [授業]休講

1限目の授業がある教室に行ってみるが、誰もいない…。そういえば、先週の授業で、今週は休講だと言っていたような気がする。毎度のことだが、いつ休講かはちゃんと事前にメモしておかなければ。

本日のリンク元 | 10 | 2 | 1 | 1 | 1 | 1 |

2004-10-09

_ [その他]台風

天気情報を見ると、台風が接近してきている。今もかなり雨が強いが、この調子だと、夕方頃には、もっと悪天候になりそうだ。

本日のリンク元 | 9 | 1 | 1 | 1 | 1 | 1 | 1 |

2004-10-10

_ [その他]学園祭

本当は昨日から始まっているはずだったが、台風のため1日目は中止になったので、今日が実質的に初日ということになる。

自分は、学園祭実行委員OBとしてのシフトがあり、企画を見る暇はほとんど無かった。明日は、あるていどまとまった時間の休憩がありそうなので、そのときにどこか見に行くか。

本日のリンク元 | 10 | 3 | 3 | 1 | 1 | 1 | 1 | 1 | 1 |

2004-10-11

_ [その他]学園祭その2

今日が最終日。結局、せっかくの休憩時間は、寝ることに使ってしまったため、企画を見て回ることはできなかった。そんなに見たい企画があったわけでもないし、まあいいか。

あとは、案内所でパンフ販売など、あまり昨日と変わらなかったが、最終日なので、後片付けがある分、昨日よりも疲れた気がする。

_ [プログラミング]

最近、ちっともプログラミング言語の作成が進んでいない。このままでは、12月の発表に間に合わない気がしてきた。なんとかしなければ。とりあえず、来週中に一気に進めてしまうことにしよう。

本日のリンク元 | 8 | 2 | 1 | 1 | 1 | 1 |

2004-10-12

_ [授業]数値計算法

今日は、非線型方程式の解法について。といっても、実際に扱ったのは、ほぼニュートン法だけだった。他にはどんな解法があるのだろうか。

本日のリンク元 | 12 | 3 | 1 | 1 |