◆第三話 プログラミング試験の罠

文字数 3,090文字

 車の中でギレルモは、隣の助手席に座るカルロスに指示を出す。カルロスは膝の上にノートパソコンを置く。画面には統合開発環境が表示されている。
「試験は最低レベルから始める。そして徐々に難易度を上げていく。使えるプログラミング言語はなんだ?」
「C、C++、C#、Java、JavaScript、Python、Swift、Go、Kotlinなんでもいいですよ。ScalaやHaskellも少し使います。PerlやPHP、COBOLやLispでも大丈夫です。新しい言語を学べと言われれば、二十四時間あれば、ひととおり書けるようになります」
 この一年の仕事で、様々なプログラミング言語に触れた。名前を挙げていないマイナーな言語も修得している。ギレルモとカルロスは、驚いた表情をしながら話し合った。
「分かった。じゃあ予定どおりC言語で試験をする」
「いいですよ」
 そうだろうなとは思っていた。MRLはロボットの会社だ。ロボットの制御には、C言語がよく使われる。Cは、多数あるプログラミング言語の中では、人間ではなく機械に寄り添ったものだ。高速に動作して、繊細に機械を扱うのに向いている。
「それでは問題だ。一から百までの数を一行ずつ出力するプログラムを作れ。ただし三の倍数のときは、数の代わりに『Fizz』、五の倍数のときは『Buzz』と出力し、三と五の両方に共通する倍数のときは『FizzBuzz』と出力せよ」
 レオナルドは心の中で笑う。これは有名なFizzBuzz問題だ。プログラマでない人間を門前払いにするための、初歩の初歩というべき試験だ。このレベルの質問をされるとは思っていなかった。レオナルドは答えを書くために、助手席のノートパソコンに手を伸ばす。
「――ただし、口頭で答えよ」
 腰を浮かせたレオナルドは、そのまま動きを止めた。ギレルモは挑むような目でレオナルドをにらんでいる。なるほど、脳内だけでプログラムを組み立てろということか。単純なFizzBuzz問題では面白くないと思っていたところだ。

  #include <stdio.h>
  int main(void) {
    int i;
    for (i = 1; i <= 100; i++) {
      if (i % 3 == 0 && i % 5 == 0) {
        printf("FizzBuzz\n");
      } else if (i % 3 == 0) {
        printf("Fizz\n");
      } else if (i % 5 == 0) {
        printf("Buzz\n");
      } else {
        printf("%d\n", i);
      }
    }
    return 0;
  }

 レオナルドはソースコードを口頭で述べた。その文字の羅列を助手席のカルロスが入力していく。全ての文字列の入力が終わり、カルロスは実行した。

  1
  2
  Fizz
  4
  Buzz
  Fizz
  7
  8
  Fizz
  Buzz
  11
  Fizz
  13
  14
  FizzBuzz
  ……

 数字と文字が出力され、正しい答えが表示された。
 ギレルモはアクセルを踏み、車を急発進させる。レオナルドは、勢いよく後部座席に倒れ込む。乱暴な運転だなと思いながら、座席に座り直した。
 車は町の中を抜け、外に出る。建物がどんどん遠ざかり、緑に覆われた道になる。自動車は、島の東側の工業地帯に向かっている。
「次の試験だ」
 ギレルモはハンドルを握ったまま声を出す。
「今と同じ出力結果を、違う条件式を用いて述べよ」
 レオナルドは考える。先のコードの条件分岐は「三と五の倍数か」「三の倍数か」「五の倍数か」「それ以外か」でおこなった。
 ド・モルガンの法則を使えという問題か。ド・モルガンの法則は、論理積や論理和の否定に関する定理だ。レオナルドは、頭の中でプログラムを展開する。条件式の部分だけを変えて、答えを口頭で述べる。

  ……
      if (i % 15 != 0) {
        if (i % 3 != 0) {
          if (i % 5 != 0) {
            printf("%d\n", i);
          } else {
            printf("Buzz\n");
          }
        } else {
          printf("Fizz\n");
        }
      } else {
        printf("FizzBuzz\n");
      }
  ……

 レオナルドが述べたあと、入力したカルロスは、正解だとギレルモに告げた。バックミラーに映ったギレルモの顔は、相変わらずむすっとしている。本当は雇いたくないのに、仕方なく試験をしているといった風情だ。
 車の進む先に工場の立ち並ぶ様子が見えてきた。どれも町工場程度の小さなものだ。建物は海に近いものほど古い。徐々に工業地帯を拡張しているために、最新のものを島の内側に建てているのだろう。
「次の試験だ」
 工業地帯が目前に迫って来たとき、ギレルモが車を停めて口を開いた。嫌な問題の出し方をする。ここで間違って車を降ろされたら、長い距離を歩いて帰らないといけない。
「これまでと同じ処理を、最短で述べよ。リミットは五分だ」
 次はコードゴルフか。プログラムの文字を削り、短い文字数で書くプログラマの遊びだ。最短打数を競うゴルフに見立てたものだ。
 頭の中で、五分で短くするのは難しい。正答させないための問題だろう。しかしレオナルドは、コードゴルフの経験がある。そして、C言語のFizzBuzz問題の最短コードを知っている。
 七十三文字。ただしこの解は、利用している環境によっては正しく動作しない。たとえば、オンラインコンパイラのideone《アイディーイーワン》では不正解になる。そうした環境での最短コードは七十四文字になる。
 どちらが正解かレオナルドは考える。ギレルモの態度からして、七十三文字を答えたら不正解にするはずだ。少なくとも大学の友人で性悪のBBなら、そうした罠を用意する。

  main(i){for(;i<101;puts(i++%5?"":"Buzz"))printf(i%3?i%5?"%d":0:"Fizz",i);}

 一文字ずつ確かめながら、カルロスは入力する。
「確認できました。正解です」
 カルロスは驚いた顔をする。ギレルモは不満そうな表情を浮かべて顔を歪める。やはり、七十三文字を答えたら不正解と言うつもりだったのだ。その罠をレオナルドは回避した。
 ギレルモがアクセルを踏む。車は工場のあいだを縫っていく。道の先には、周囲の建物の数倍あるビルが見えてきた。近代的な建物の入り口には、メンデス・ロボット・ラボラトリという金属製のプレートが掲げてあった。
ワンクリックで応援できます。
(ログインが必要です)

登場人物紹介

登場人物はありません

ビューワー設定

文字サイズ
  • 特大
背景色
  • 生成り
  • 水色
フォント
  • 明朝
  • ゴシック
組み方向
  • 横組み
  • 縦組み