試してみよう

From The Joel on Software Translation Project

Jump to: navigation, search

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)

Personal tools