No Such Blog or Diary

«Prev || 1 | 2 | 3 | 4 |...| 56 | 57 | 58 || Next»

KUPCで遊ぶ

Haskell 縛りで参加を決めたのが 13:03.そこから問題Aのコードを速攻で書き終えて手元でコンパイルしようと思ったら ghc が入ってない.しょうがないので Haskell Platform のダウンロードを始めてお昼ごはん.この時点で既にまったりモード.結局,最初の4問解いた時点で2時間とかショボすぎる.そして5問目の問題文を読んでやる気を無くして退場.

とりあえずAは割った余りで判定して終了.Bは色の変化回数の偶奇(=両端の色)で判定して終了.Cは同一グループに嫌いな人がいる人達をかき集めて終了.Dは貪欲で終了.そしてEの問題文を読んで入出力周りが面倒そうに思えて試合終了.

……コードがゴルフっぽくなってしまうのはなぜだらう?

python でモジュールをインストールするのメモ

とりあえず ez_setup.py をダウンロードして実行:

wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py

そしたら使いたいモジュールを easy_install する:

easy_install chardet
easy_install encutils

楽だなぁ.使ってもらえる言語にはライブラリ(パッケージ)管理システムが重要だよね.

閑話休題.

Visual Studio でコンソールアプリケーションが出力を見る前に終わってしまうのをどうにかする方法: http://d.hatena.ne.jp/jonki/20110414

つか,自分はコンソールアプリケーションを作るのに Visual Studio なんか使わんのでいきなり聞かれてもわからん.ソースファイルが1つだけのコンソールアプリを作るのにIDEなんか使うなよというスタンス.

cygwin 上の fread の挙動とか

"rb" ないし "r" で fopen した時には CR+LF をそのままにする.戻り値は,読み込んだバイト数 / サイズ.直感的で平和.

"rt" で fopen されてると CR+LF を LF に置き換える.戻り値は,(読み込んだバイト数 ー その中のCR+LFの数) / サイズ.先に CR+LF を LF に置き換えてからバイナリモードと同様に動く.つまり,カウント数×サイズ よりも多くのバイトを読みに行くかも.

つーかなんでテキストモードとかあるんだ? 要らない子だと思うのだけど.

C言語で return を省略した関数の戻り値を使うのは不定

ISO/IEC 9899 のC99の仕様とか C11のドラフト の 6.9.1 Function definitions には次のように書かれている.つまりは return なしで関数の最後まで行き,その関数の戻り値が使われたなら,何が起こるかわからないと.

12 If the } that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined.

が, どうせ return 文が無いだけならコンパイラが %eax にデータを上書きしないだけなので,それを期待すれば下の階乗のプログラムは想定通りに動く(gcc 4.5.3 @ cygwin で確認).つまり,関数の最後で関数を呼び,末端の呼び出しの return をいちばん外側まで到達させる(末尾再帰なわけだけど).実際にアセンブリで見てもそうなってる.

#include <stdio.h>
int fact(int k) 
{
    static int f=1;
    if( k <= 0 ) return f;
    f*=k--;
    fact(k);
}
int main(int argc, char*argv[])
{
    printf("%d\n", fact(10));
}

で,お手伝いしているプログラミング演習で結構な数の学生らが上のようなものを書いてしまい,それが適当に動いてしまったがために「再帰呼び出しを繰り返してもどこかで発行した return の値が最初の呼び出しまで戻る」とか勘違いしてしまったのが問題.その次の課題の二分探索のプログラムで結構な数の学生が再帰呼び出しに return を書いてくれないという状況に陥った.ま,再帰関数の説明の資料が void 型の関数だったので理解のしようもないのだけど(注:私は資料にノータッチ).

つか,それって再帰の深部で値を exception に乗せて throw で投げて再帰の外で catch するという exception-driven programming の思想だよね(注:普通の意味と違う).

意地の悪い問題

プログラミング演習の初回のアンケートに,下記のプログラムが何を計算するか分かれば答えよ,とかいう設問を入れてみた.

int hoge(int x, int y) {
  int k = x % y;
  while(k!=0) { y^=k; k^=y; y^=k; k = k%y; }
  return y;
}

答えは「x と y の最大公約数」なのだけど,y と k のスワップを XOR 3 回でやっている点が意地悪い.まぁ,XOR 3回でスワップができると理解できた人もいたのでそれ程ひどくもないのかもしれないけど,よくわからん.

ほか,わからないものはとりあえず動かしてみようというの数人いて,「打ち込んだけどコンパイルエラーが出るぞどうなってるんだ」という質問をもらったりした.まあ,main 関数書いてないからねぇ…… 「次の関数が何を計算するのか」という質問にすべきだったか?

とりあえず,なかなかにレベルのばらつきが酷いのでなんともはや.

今日のエラーメッセージ

Template Haskell でゴニョゴニョしてたら GHC がパニクった.

TTreeB.hs:69:3:ghc: panic! (the 'impossible' happened)
  (GHC version 7.2.2 for x86_64-unknown-linux):
	unknownNameSuggestErr UnhelpfulSpan
 
Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug

まあ,生成したプログラムがおかしいんだろうけどデバッグめんどくさい……

«Prev || 1 | 2 | 3 | 4 |...| 56 | 57 | 58 || Next»
Search
Feeds

Page Top