試してみよう
From The Joel on Software Translation Project
Joel Spolsky / 青木靖 訳
2005年12月29日 木曜
私がペンシルベニア大で大学最初の年を迎える頃には、自分は非常に優れたプログラマだと思っていた。すべて独学で学び、Turbo Pascalで大きなシステムを2つ作っていた・・・1つは小さな工場のための完全な在庫システムで、もう1つはイスラエル最大のパン工場で生産ラインのスケジューリングに使われていた。
中間試験の時になって、私は自分で思っているほど頭が良くないことに気付いた。私はいくつかの問題が全然できなかった。私はまだポインタを理解しておらず、再帰も理解していなかったためだ。
根に持つのはやめて、その中間試験問題をお教えすることにしよう・・・大学一年のときの私よりうまくやれるか試してみるといい。
1a. (MIT-Scheme) 次の関数
(define (accumulate combiner null-value l)
(if (null? l)
null-value
(combiner (car l)
(accumulate combiner
null-value
(cdr l)))))
を用い、リストの平方和を計算するsum-of-squaresを実装せよ。例:
(sum-of-squares '(1 2 3 4 5))
の値は55になる。
(答えを見るには、箱の中のテキストを選択する。)
(define (sum-of-squares l)
(accumulate (lambda (x y) (+ (* x x) y))
0
l))
1b. (JavaScript) Schemeなんか知らないかもしれないね。次の問題は1aをJavaScriptにしたものだ。
次の関数
function accumulate(combiner, nullValue, l)
{
if (l.length == 0)
return nullValue;
var first = l.shift();
return combiner(first, accumulate(combiner, nullValue, l));
}
を用い、リストの平方和を求めるsumOfSquaresを実装せよ。例:
sumOfSquares([1,2,3,4,5])
の値は55になる。
(答えを見るには、箱の中のテキストを選択する。)
function sumOfSquares(lst)
{
return accumulate(function(x,y){return x*x+y}, 0, lst);
}
2. (ANSI C) 以下の形式でCのプログラムを書け。
#include <stdio.h>
int main(int argc, char **argv)
{
???
}
コンパイル後に以下を実行すると、それぞれの引数の最初の文字が出力される(今の場合、"cheese"となる)。
% ./a.out could harold eat eight salami elephants
(答えを見るには、箱の中のテキストを選択する。)
#include <stdio.h>
int main(int argc, char** argv)
{
int i;
for (i=1; i<argc; i++)
{
putchar(argv[i][0]);
}
putchar('\n');
return 0;
}
3. (ANSI C) 以下のCプログラムの出力はどうなるか?
#include <stdio.h>
char *fn(int i, char *s)
{
while (i)
{
s++;
i--;
}
return s;
}
int main(int argc, char** argv)
{
int a = 2;
static char c[] = "test";
printf("%s\n", fn(a,c));
return 0;
}
(答えを見るには、箱の中のテキストを選択する。)
st (改行)
もっとプログラミング問題をやりたければ、TopCoderをチェックするといい。
(オリジナル: Test Yourself)