この記事は筑波大学AC入試 Advent Calendar 2024 - Adventarの11日目の記事です。

自分は2002年度のAC入試で情報学類に入りました。

このAdvent calendarを見て、体験記の記事を見てたら、 自分も体験記を書いた事があったな、 と思い出したのでひっぱり出してきた。

あと、この記事で言及してるAC入試で提出したBASIC処理系は、 2024年の今では簡単に動かす方法がないと思っていたが、 WASMと煙と鏡とCheerpJというのを使うと実行できるらしいので、 動くようにしてみた。

今更BASICの使い方がわかる人もいなそうなので、 説明も書いておいたので見て試してみてね。

体験記

以下の記事は http://blog.ikeji.ma/archives/1089 で公開されていたものをサルベージしてきたもの、誤字脱字も含めて原文まま。


昔話(大学受験編)

2013-10-12 05:21:46

昨日、この記事が話題になっていた。

http://mainichi.jp/feature/exam/news/20131011k0000m040148000c.html

国公立大入試:2次の学力試験廃止 人物評価重視に 毎日新聞 2013年10月11日 07時00分 政府の教育再生実行会議(座長、鎌田薫・早稲田大総長)が、国公立大入試の2次試験から「1点刻みで採点する教科型ペーパー試験」を原則廃止する方向で検討することが分かった。同会議の大学入試改革原案では、1次試験で大学入試センター試験を基にした新テストを創設。結果を点数グループでランク分けして学力水準の目安とする考えだ。2次試験からペーパー試験を廃し、面接など「人物評価」を重視することで、各大学に抜本的な入試改革を強く促す狙いがある。実行する大学には補助金などで財政支援する方針だ。

この記事を読んで、自分が大学に入った時の事を思い出したので、この件に一石を投じる事には絶対ならないと思うけど、書き留めておこうと思う。

俺は、まあ、コンビニに行くなら車で行くのが当然って感じの所で生まれた。 俺が通う事になる大学は、同じ市内の、車で1時間ぐらい行った所にある大学だった。この大学の学内にある本屋は、専門書を買うのに向いてるのと、この大学に生協がないおかげで、学外の人でも誰でも1割引で本が買えるという利点があるので、小中学生の頃に良く行ってた記憶がある。

高校生になると、自宅から大学とは別方向にバスで1時間弱の所にある高校に通っていた。その高校は、売りとして、「歴史がある」とか「伝統が長い」みたいなのが最初に出てくるような所で、特にすごい進学校という訳でもなく、かといって、表立って校則違反をする人が大量にいるような所でもない、まあ、普通の高校だった。もちろん、凄いプログラムが書ける人とかもいない。

そんな中、俺は、というと、全く勉強した記憶がない。授業中は持ち込んだノートPCかPDAでコードを書いていた。たしかPDAって言っても、NECのMobileGearでこいつは大きめのキーボードとDOSが動いていて、perlとか開発環境を入れてた。こいつは電池で動くので制服のポケットに、近くの写真屋でもらった使い捨てカメラから取り出された電池をパンパンになるまで詰め込んでいた。 電池が無い時のために、「とほほのWWW入門」を印刷した物を内ポケットに入れて持ち歩いてた。 放課後は、高校の近くの電気屋に行って、やってたベンチャー会社が失敗して地元に帰ってきたという、マニアな店員と立ち話をしたり、手伝ったりして。その後、本屋に行って、毎日閉店まで居座りながら、技術書を端から端まで立ち読みするとかしてた。 家遅くに帰ると、11時ちょうどに、ピーガーとか音がするモデムでダイアルアップして、朝までインターネットをしてた。 とまあ、こんな生活だったから、まあ、試験は学年最下位近く、下は不登校の子がいるだけ、みたいな感じだった。通っていた高校は、素行が悪くなければ、成績が悪くても文句は言われなかったので特に困ってなかった。両親も、心配はするけど、義務教育は終わったから、後は自分で何とかしろ、って感じでそんなに強くは言ってこなかった。

折しも、CGI全盛期で、とりあえずPerlが書ければインターネットで遊ぶのに困りはしなかった。 オフラインで遊ぶのにはVB5と、貯金をはたいてProfessional版を買ったDelphiを使ってた。

俺が高校3年生になる頃、1学年上の先輩が、新しいAC入試という入試で大学に入ったという話を聞いた。 聞く所によると、その入試では一切ペーパーテストが無く、書類選考と面接だけ、という話だった。 その先輩は、推薦で受けても受かるんじゃないか、と言われているような先輩だったが、パンフレットによると、AC入試は「学力競争型の試験とは違う」「ナンバーワンよりオンリーワンを目指す」とか、書いてあった。

こいつはきっと俺のためにある試験だ、と思った。 とりあえず、親に頼んで大学まで車を出してもらい、直接大学の入試課に行き願書セットをもらってきた。

願書セットを一通り見てみた。 まず、A4サイズの封筒があった。これに自分がこの大学に入るに値する事を証明する自己推薦書を入れて出すらしい。 その他に、高校の評定を出せと書かれていた。げげげ、話が違う。

まあ、ここは、自己推薦書の方を頑張って出せば評価されるだろう、と考える事にして、何を出すか作戦を練る事にした。

まず、何か大きい計算をする事を考えた、 その頃、CPUベンチマークといえば、スーパーπという円周率を計算するソフトが主流だった(そして大学に入ったら、そのスーパーπの作者が担任の先生だった。という話はまた今度)。図書館にあったブルーバックスで、富士通のマイコンFMシリーズで円周率を延々計算する話があったので、とりあえずそれを読み、いろいろ調べた。円周率は俺の頭で世界一になるのは難しいだろうが、他の誰も注目していない数ならどうか、例えば、大きい素数を探すとか、eを計算するとか。しかし、色々調べてみたが、計算方法が良くわからなかったり、適当に実装してみたら、遅すぎて駄目だったり。結局良い方法は見つからなかった。

7月ごろ、もう1度考えなおしてみる事にした。 間接的な評価ではなく、それ単体で価値がある事を説得できるような自己推薦書出さねばならない。自分が出すなら、プログラムを送りつけるしかないだろう。しかも、感動を伝えるには、相手に実行してもらわないといけない。 この時点で得意なPerlとVBは外していた。インターネットごしじゃないとCGIを見せるのは難しいし、VBの実行ファイルが送りつけられてきても、俺だったら絶対実行しない。VBやPerlでいままで書いていた物については、メインではなく、自己推薦書に追記として自分が過去に書いたソフトの紹介としてつけておく事にした。 いろいろ考えた結果、その時に丁度流行してきていたJavaアプレットを作る事にした。大学の先生が使っているPCのOSは不明だが、ブラウザがあれば実行できるだろうし。

次に重要な何を作るか、だ。 高校生らしくゲームとかも考えたが、たぶん評価する人はかなり年上の人のはずだから、あまりウケないだろう。ゲームと言えば、前に仲間内で作ったノベルゲーム用のスクリプトエンジンがかなり複雑になっていた事を思い出した。そこで、前から作ろうと思っていた、BASICクローンを作る事にした。

高校の数学では、明かにPC-9800シリーズのもののようなBASICのコードがでてくる。しかし、その時点でNECは98NXに方針変更していて、もはや実機は存在しなくなっていた。 これは作るチャンスだ。

そこで、これから作るBASICは、数学の教科書に載っているプログラムを実行できる最低限の文法をサポートする事にした。 数字、文字列、四則演算、比較、分岐、サブルーチンコールなどは必要だから入れる。 一方、配列、組み込み以外の関数などは教科書に出てこないからサポートしない。

やる事は決まったのが、そろそろ夏休みという時期。高校では学校でやる夏期講習に参加しろとか言われていた。こっちは実装で忙しいんだけど、全員参加と言われたので仕方ない。

親に、これが無いと大学に行けない、大学入学祝いとして買ってもらうつもりだったのを1年まえがりさせてくれ、と頼み込んで、新しくノートPCを買ってもらう事にした。 できる限り安いので、という事で買ったのが東芝のLibretto L1 こいつは、CD-ROMとかFDDなどの部品が無いからその分安い。一方で、画面解像度が高く(1280x600)エディタとドキュメントを同時に出せそう、更にCPUがCrusoeなのでバッテリーが持つ。

こいつの10GBのHDDに、JDKとJBuilderそれとJavaのドキュメントHTML版を詰め込んでJavaの開発環境はばっちりだ。

夏休み中、夏期講習に行っては、ずっと内職でJavaのコードを書いてた。 Javaでまとまったコードを書いたのは、それがはじめてだったから、それはそれは酷いコードだったと思う。 たしか、Vectorクラスの存在に気づかず、自前でリンクドリストを作ってメモリ管理したり、数字をパースするのに一文字づつ手で切り出していたと思う。 そんなこんなで、夏休みの終りごろには、処理系もそれを解説する説明書も完成してたと思う。 見栄えをかっこよくするのに、一応LINE文と、適当なCGを書くBASICソフトも入れておいた。(PAINT文は作れなかった。)

完成した所で、文章に関しては一応、国語の先生に見せようか、と思って、持っていったら、先生に今忙しいから、と断られた。2年生の時の担当だった国語の先生に見せたら、内容が全くわからないから、ですます調だけ統一しとけ、と教えてもらえた。この先生は親切だ。

9月に入ると、すぐに提出締切があった。説明書とソースコード一式を全部を印刷して、いつもより倍以上高い国内産のを買ったCD-Rにも焼いて、提出用の封筒に入れた。 担任の先生に頼んで、成績証明書も作ってもらった。高校のハンコで封されている封筒に入っていて、自分ではどんな成績かわからないのだけど、渡す時に先生が「(どうせうかんないんだし)別に色をつけなくていいよね」と言っていたから、きっと酷い成績だったんだろう。いいんだ、俺は成績じゃなくてプログラムで評価してもらうんだ。

多分、普通の高校生は皆そうだと思うけど、この時の俺は割と天狗になっていた。BASICのインタプリタが書ける人はそういういないだろうと。まあ、高校という小さい世界だけが自分の世界だったから当然なんだけど。

9月末。とりあえず、書類選考は通ったので(天狗はそんなの当然だろと言ってた)、実際の面接に行く事になった。 平日だったので、高校を休んで、念のため指定された時間の1時間ぐらい前に面接会場に行った。 面接控え室に行くと、他の受験生が2人きた。 聞くと、片方は俺の次に面接を受ける人で、もう一人は、その更に次の人で、そいつは、面接時間の2時間以上前に来ていたそうだ。 とりあえずお互いに自己紹介をした、俺の次の面接の人は他県から、2時間前に来たやつは関西から来たらしい。 得意な言語は、perlとVBだ、といったら馬鹿にされた。俺以外の2人は、今Rubyというプログラミング言語にハマっていて、これはとても素晴しいと言っていた。Cマガの特集で取り上げられて、一躍メジャーになっっているらしい(CマガなんてBCCの最新版が欲しい時だけしか買ってないよ)。全く聞いた事もない言語だった。perlなんて時代遅れだからRubyにすべきだ、と2人から言われて、俺はここで初めて自分よりもコンピュータに詳しい、しかも、コンピュータに対する情熱がある同級生に出会った。天狗になってた鼻がポロっと落ちた感じだ。しかも、Rubyというプログラミング言語はこの大学の卒業生が作ったらしい。

そんな感じで、緊張と驚きと落ち込みの中、俺の面接時間がきた。2人には、じゃあまた、入学式で会おうぜ、って言って別れたけど。俺だけ落ちるんじゃないか、という考えが頭をよぎりながら、面接室に行った。

面接は2,3人ぐらいの面接官がむこうがわ、こっち側に俺一人って感じでだった。 右端の若い面接官が、書類の束を見て、開口一番、 「君、成績わるいね」 たぶん、内申書がそうとう悪かったんだろうな。

とりあえず、無難な答えをして、その後は順当に、作ったBASIC処理系の話をした。いきなり、設計の話をしようとしたら、その前にまず、あなたの人生におけるこの処理系の位置付けみたいな所から話してくれ、と言われたと思う。

もう一人いた、年上の面接官は、これぞ博士って感じの人で、 ただ一つだけ、「君、オブジェクト指向は好きか?」という質問をされた。

これは好き、と答えるべきなのか、嫌いと答えるべきかわからなかったので、「このJavaコード以前には、あんまりオブジェクト指向でプログラムを作った事がなかったので、あまり好きではないですが、大変重要だと思いますし、大学に入ったら勉強したいと思います。」という感じで答えた。 これが正解だったのかは、あんまりわからない。

そんな感じで、ちょっと時間オーバーして話した後、最後に仕切っていた右端の面接官が、「何か言い忘れた事はありますか?」と聞いてきた。 とりあえず、「提出したコードのパーサーに問題があり、小数点数のパースに失敗する事がありました、これがdiffです。」って言って渡しておいた。

面接した感触はそんなに悪くはなかったけど、成績の話と、他の受験生のすごさを見て、受かる気はしなかった。 とりあえず、高校に戻って、担任の先生に報告した。「先生、他の受験生に聞いたら、どうもRubyってのを知らないと駄目っぽいです」「そりゃそうだろ、おまえなんかに受かるわけないだろ」って感じの事を言われた。

とりあえず、やる事はやったので、あとは合格発表を待つだけだ。 合格発表は10月の前半だったと思う、たしか今度も平日だった。確か、手紙でも合格通知が来る予定だったけど、いてもたってもいられなくて、高校を休んで見に行く事にした。もし、ここで受からなかったら、筆記試験がある大学に行かないといけないわけだから、少しでも勉強すべきなんだろうけど、まあ、どうせ俺の頭じゃロクな所に行けないだろうから関係ない。 今回も親父に車で連れていってもらって、また大学に行った。

合格発表の場所は外の合格発表用の掲示板ではなくて、1階のロビーだった。行ってみたら誰もいなかった。 合格発表自体は、コゴコロと押せる足がついた感じのホワイトボードに模造紙が貼ってあるけど、裏返しになっていて見れない。早めに発表しちゃうと怒られるからちょっと待って、と大学の人に言われた。 どきどきしながら待っていると、サラリーマン風の人とおばさんが一人きた。サラリーマン風の人は、無口みたいで遠まきに見てた。 だいたい時間になって、大学の人がホワイトボードをひっくりかえして発表すると、何と俺の受験番号があった。 とりあえず、びっくりしたけど、嬉しかったので、子供が合格したらしいおばさんと二人でやったーって飛び跳ねて喜んだ。 無口なおじさんは、無口なままホワイトボードをデジカメで撮ってた。

そういえば、面接会場で会った2人はどうしたんだろうか?と思い、メールを出してみると、片方から「あとで、手紙で来るまで待ってるから教えないどいて」だって。 この余裕な発言、きっと絶対受かる自身があったんだろう、このやろう。

とりあえず、まあ、合格できて良かったという事で、親父に高校まで送って行ってもらった。 もちろん、俺以外の人は授業中だったので、教室に入るか、次の休み時間まで教室の外で待つか、迷って中の様子を覗いていると、先生が「今の時期に、推薦だなんだで大学を決めちゃうやつは、妥協したやつだ、最後まで頑張って自分の行けるギリギリの大学に行ったやつが偉いんだ」という話をしてた。 うわ、めっちゃ入りにくい。

俺は、多分、学年で最初か2番目ぐらいに進学先が決まったんだったと思う。 担任の先生には、「決まったからって、うわっついて遊びあるくな」「必要なくてもセンター試験は受けに行け」とか言われたけど、元々勉強してたわけじゃないし、別に生活が変わる事もなく、高校に通ってた。 ただ、時間に余裕ができたので、ネット上では「2chを倒すぞー」とか言って頑張ってたりしたけど。 毎日通ってた、電気屋のおやじには、「成績が駄目でもパソコンで大学に受かってた人と同じパソコンください」と来た人がいたとかいないとか聞いたけど、嘘くさい。

その後も、この高校では、先生が俺の英語の成績に落第点を付けていて、追試をお願いしたり(そりゃ、面接で心配されるわけだ。)、センター試験を受けに行ったら、別の先生に「何で君くんの?邪魔しないで。」(いや、先生にいわれたんですけど。)とか言われてイラついたりしたけど、まあ、もうおさらばだから関係ない。

で、4月1日に、3人で入学式に出て、そこの学類長挨拶で、「ちょっとJavaができても、大学では通用しませんから。」という訓示を受けて、俺の大学生活がはじまった。 大学生活の話はまたこんど。


23年前(2001年)の事を12年前(2013年)に書いたものを2024年の末に読むための説明を書いておく。

  • MobileGear: 自分が持っていたのはWindows CEが入る前の世代のMC-MK11。CPUとして486SX、メモリ1MB、640x240の白黒液晶が入っているやつ。画面開閉センサが壊れていたので中古屋で1万円ぐらいで買えた。
  • PDA: 小型の情報端末。ソーシャルな機能は基本ない。
  • 使い捨てカメラ : レンズ付きフィルムとも。フラッシュがついてる機種もあってアルカリ電池が入ってるんだけど、36枚写真を撮ったら電池が残っていても捨てられる運命にあったのだ。
  • PC-9800 : NEC製のパソコンで、今あるPC/AT互換機ではないパソコン。昔は一番普及しててどこのご家庭にもあった。
  • 98NX : NEC製のパソコンで、PC/AT互換機。
  • Cマガ: C Magazine、2006年まで売ってたC言語の月刊誌。
  • 2001年はJavaという言語がハイプで、C#はまだリリースされてなかった。
  • JBuilder: Delphiと同じBorland社(現Embarcadero社)が作っていたJavaのIDE。当時はまだEclipseはなかった。
  • この頃はブラウザで複雑な事をやるならJava Appletを作るものだった。
  • BASIC : CPUが8ビットだった頃にパソコンで良く使われたプログラミング言語。簡単に使えるので入門用になってた。今だとPython?
  • VB : VisualBasic。GUIでボタンを置いて、BASICでコードを書くとプログラムが作れるやつ。
  • Delphi : VBからBを抜いてPascalにしたやつ。Borland社製
  • BCC : Borland C Compiler。当時はCのコンパイラも手に入れるのは大変だったんだよ。
  • 2001年のRubyは1.6とかそれぐらいで、WebではCGIとして動いてた。当然Railsなどなかった。
  • Libretto L1は安いと言ってるが、それでも10万円ぐらいした。
    • 5万円以下のノートPCが表れるのは2000年代後半のネットブックブーム。
  • 当時はAC入試の合格発表はネット公開されてなかった。
    • この後に、勝手にネットに公開する学生が表れて問題になり、公式でネット公開される事になった。
  • はてブでのこの記事への言及
  • Twitterでのこの記事への言及

提出したBASIC処理系

CheerpJと結合して開けるようにしたものを以下のURLに公開する。

http://test.ikeji.ma/ibasic/IBasic.html

また、当時書いたサンプルプログラムがここにある。 http://test.ikeji.ma/ibasic/exec.html

CheerpJのサーバーからrt.jarをダウンロードするので、起動は結構遅い。 数十秒かかるので注意。 また、INPUT文を使うとswingロードするため、しばらくブロックされたりする。

使い方

簡単に使い方を説明する。

起動すると、画面のほとんどに表示領域、 下に1行の入力欄がある。 この入力欄に入力してEnterを押すと処理が行われる。

入力は直接実行モードとプログラミングモードがある。

例えば、PRINT "HELLO"と入力すると、直接実行モードになり、 HELLOと結果が表示される。

10 PRINT 1+2+3などと、行頭に数字があると、 プログラミングモードになり、 メモリにプログラムとして記憶される。 BASICではプログラムの各行に行番号がついている。 同じ行番号を定義すると前に定義したのが上書きされる。 プログラムは行の順序にソートされる。 この状態で、RUNマンドを実行すると、記憶されたプログラムが実行される。

例えば、次のように1行ずつ入力すると、フィボナッチ数が10個表示される。

NEW
10 cur = 1
20 prev = 0
30 FOR i = 1 TO 10
40   PRINT cur
50   GOSUB 1000
60 NEXT i
70 END
1000 t = cur + prev
1010 prev = cur
1020 cur = t
1030 RETURN
RUN

コマンド

NEW: 記憶されたプログラムとデータが消える

LIST: 実行すると、記録されてるプログラムを画面に表示する。 LIST 100で100番以降、 LIST 100-200のようにすると100から200の間だけ表示する。

RUN: プログラムを最初から実行する。 起動前にデータも全部破棄する。

LET: 変数に値を代入する。 LET a=3 ただ、LETなくても代入できる。 a=3

PRINT: 画面に文字列、数字、式の計算結果を出す。 PRINT 123 N80-BASICを見様見真似で、カンマとかコロンでフォーマットしながら出力できるようにしたが、 挙動があやしい。

INPUT: ユーザーから入力を受け取り、指定した変数に入れる。 INPUT a プロンプトを表示したり、複数の入力を受け取るのもできる。 INPUT "高さ",height,"幅",width

END: その場でプログラムを終了する。

IF: 条件分岐IF 1 = a THEN PRINT 1みたいな。ELSEはないし、1行しか書けないのでそこにGOTOを良く書く。 実は複文かける、IF 1 THEN PRINT 3 : PRINT 4とか。 ELSEはない。

GOTO: ジャンプ、GOTO 10とかすると10行目に実行がうつる。

GOSUBRETURN: 関数呼び出しと復帰。

10 PRINT "Call function"
20 GOSUB 100
30 PRINT "Returned from function"
100 PRINT "Here is a function"
110 RETURN

FORNEXT : ループ

10 FOR I=0 TO 100 STEP 10
20 PRINT I
30 NEXT I

CLSLINE : グラフィック

画面にはテキストとグラフィックを表示できて、 両方を描くと合成されて表示される。 CLS 1でテキストを消す。 CLS 2でグラフィックを消す。 CLS 3で両方を消す。

LINE 10,10,100,100で、左上から右下に線を引く。引数は始点のx座標、始点のy座標、終点のx座標、終点のy座標。 LINEが唯一のグラフィックを描く命令。

演算子と数値と変数

変数には数値しか入れられない。(文字列もない) 数値は良くわかってなかったので全部Doubleで処理してる。 そのため、PRINT 123123.0になる。 二項演算子(+,-,*,/,<,>,<=,>=,<>,=,AND,OR)、単項演算子(+-)あたりを作った。 ブール値は真が1、偽が0かそれ以外。

中身

プログラムはテキストのまま記録してる。 PC-98のBASICのようにバイトコードにしてたりはしない。

プログラム、変数、コールスタックなどはリンクドリストを作って管理してる。 リストなので、常に線形探索してる。

プログラムの解釈は、LL(1)というか、(高校生はそういう理論知らないので)前から読んでswitch-caseしてる。

まとめ

AC入試はいいぞ。