大学時代、理学部数学科にいたわけだけど、当時の数学科の授業と言えば、9割方純粋数学で応用数学は計算機概論、計算機演習、グラフ理論くらいと少なかった。
自分は数学研究会という部活に入っていて、応用数学部門の部長をしていたんだけど、応用部門はコンピュータ、基礎数学部門は純粋数学と、部活の中でも部門を分けるほど、大きな部活でした。
部自体の設立は私が生まれる前からあったらしく、多いときは部員数が40人くらい居て、数学科だけに留まらず、理学部化学科、薬学部、経済学部、女子短大の部員もいて活気があったが、私が卒業して数年で新入部員が入らないのが連続したらしく廃部したようです。
1980年代後半から1990年代初頭に理学部数学科の大学生をしていたんだけど、プログラミング言語といえば、BASIC、FORTRAN、CASL、LISP、Pascal、C、といったところで、C言語においては丁度出始めたばかりで、教授よりも生徒のほうが、遥かに知識が高かったくらいです。
授業ではFORTRAN77、LISP(Common Lisp)を習う程度。
ゼミでは6502アセンブラ、CASLとアセンブリ言語。
部活では自分が部長のときはFORTRAN77を部員に教え、各自部員はBASICやCもやっていた。
学校のパソコンは富士通、自宅のパソコンはNEC、ということで、BASICはF-BASICとN88BASIC。
学生だったのでTurbo Cのアカデミックパックを購入し、月刊C MAGAZINE(通称Cマガ)を毎月購入していた。
プログラマのバイトではC言語で1行何10円の世界でした。
他にもセブンイレブンのバイトでは、店長もパソコン好きで、店にパソコン雑誌を置こうとか画策していた。
さて、先の問題のようなものが、プログラミングの問題として出題されたとして、どのような解答をすると教授の受けが良いのだろうか。
ということを考えてみたいと思う。
・理論考証がしっかりしていること。
・ソースが読みやすいこと。
・高速であること。
・独自性があること。
・拡張性が高いこと。
・・・
どこに重きを置くのか、なかなか難しい話しではある。
数学科なので、情報工学科、情報科学科、情報処理科などの情報系学科とは違い、生徒の全てがコンピュータやプログラミングに長けているわけではない。
というか、当時はそこまで細分化された学部や学科は無かったし、自宅にコンピュータを持っている生徒は少なかった。
パソコンはマニア向けだったし、高価でしたからね。
つまり、プログラミングに疎い生徒は、他人のプログラムを盗んで、変数名とかを書き換えて提出といった悪どいことをする場合もある。
そういうのに備えて、出来の悪いプログラムや、バグを仕込んだものをフロッピーに入れておくといったことをする。
変な情報戦が授業の裏で展開されていたわけです。
話しを戻して、どこに重きを置くのか。
現在のコンピュータを取り巻く環境は、マシンパワーを使って力技でゴリゴリと解くということもできるので、ソースが読みやすいに重きが置かれるのかもしれません。
30年前のコンピュータを取り巻く環境は、まだDOS全盛のころで、シングルタスクで、使えるメモリ空間も少なく、答えを出すのに何日もかかるなんてこともありました。
つまり、出題者側も答えを出すのに何日も掛かるような問題は出題出来ず、出来の良いプログラムであれば秒殺で答えを導き出し、出来の悪いプログラムは何分、何時間も掛かっても答えを出さないということもあった。
当時の数学科の生徒数は1クラス60人くらいで、2クラスで120人くらいだったかと思うので、必須科目だとしたら全員分の課題の採点は面倒だっただろうなと思う。
つまり、時代と共に課題の傾向も変わり、重きを置くところも変化しているとも言える。
理学部数学科であったから、当然数学にまつわるような課題だったりもし、数学的な理論考証はしっかりとやらねばならない。
例えば、円周率πを小数点以下何位まで求めるとか、プログラムの出来、不出来は、出力速度で一目瞭然だろう。
例えば、
#include <stdio.h>
int a=10000,b,c=8400,d,e,f[8401],g;void main(){for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
}
というプログラムを提出したとしよう。
BASICでは、5行プログラム(1行80文字未満)というのが流行っていたんだけど、C言語はフリーフォーマットなので、変数名とか関数名とかでなければ、スペースで区切れる所は、どこでも改行できてしまう。
上記ソースはC言語版の5行プログラムと言えよう。
さて、C言語のソースを読み解ける人でも、他人のプログラムソースを読むのは至難の技である。
ましてや、何をするプログラムなのかを知らない状態である。
コンパイル&リンク、実行をしないで、何をするプログラムだか解りますか?
こんな読みづらい、理解しづらい、トリッキーなプログラムを書いたら、一般的に考えれば点数を貰えないはずです。
ただ、実行してみると、とてつもないポテンシャルを秘めたものだということが解りますよ。
環境がある方は試してみて下さい。
環境がない方のために、出力結果は伏せ文字にしておきます。
ではでは