奥深き競技プログラミングの世界 〜 第1問・出題編 〜

先日面接である企業にお邪魔した際プログラムの課題を与えられた
課題は全部で4問あったが競技プログラミング未経験の私にとってどれも非常に興味深く面白かったためこの感動を共有したいと思う

第1問 「携帯文字入力」 Lv. ★
————————————————————
AさんはBさんに携帯電話でメールを送ろうとしています。

携帯電話の数字ボタンには次の文字が割り当てられており、ボタン 0 は確定ボタンです。

ふつうの携帯電話とは違い、この携帯電話では1文字の入力が終わったら必ず確定ボタンを押すことになっています。

1: . , ! ? (スペース)
2: a b c
3: d e f
4: g h i
5: j k l
6: m n o
7: p q r s
8: t u v
9: w x y z
0: 確定ボタン

例えば、ボタン 2、ボタン 2、ボタン 0 と押すと、文字が ‘a’ → ‘b’ と変化し、ここで確定ボタンが押されるので、文字 b が出力されます。
同じ数字を続けて入力すると変化する文字はループします。
すなわち、ボタン 2 を 5 回押して、次にボタン 0 を押すと、文字が ‘a’ → ‘b’ → ‘c’ → ‘a’ → ‘b’ と変化し、ここで確定ボタンを押されるから ‘b’ が出力されます。

何もボタンが押されていないときに確定ボタンを押すことはできますが、その場合には何も文字は出力されません。

Aさんが押したボタンの列を入力すると、Aさんが作ったメッセージを出力するプログラムを作成してください。

・入力
20
220
44033055505550666011011111090666077705550301110
000555555550000330000444000080000200004440000

・出力
a
b
hello, world!
keitai

※ 入力には標準入力、出力には標準出力を用いてください。
————————————————————

難易度の低いものから順に一記事に一つずつ紹介していこうと思う

ところでこの課題は出し方も一風変わっていてそれも興味深かった
最初に4つの問題をずらっと見せられその後以下のように進めるのだ

————————————————————
1)上記4つの問題を、コンピュータは使わずに方針を検討し、あなたにとって難しいと思う順番に並べてください。
  制限時間はありません。

2)最も簡単と判断したプログラムを作成してください。
  制限時間は30分です。

3)最も難しいと判断したプログラムを作成してください。
  制限時間は2時間です。

4)解答の正誤を判別するために用いたテストケースなど、解答に使った情報を全て提出してください。
————————————————————

この出題形式が醸す”己が試されている感”が何とも言えず心地良い

当然以下のように使用言語の仕様以外の調べ物は禁じられているし
アルゴリズムを内包するようなライブラリの使用は避けたいところ

————————————————————
問題を解くにあたり、言語の文法やライブラリのリファレンスは参照可能ですが、インターネットやアルゴリズムの教科書などで、解法そのものや、強力なヒントとなるアルゴリズム(ダイクストラ法など)を探すことはご遠慮ください。
————————————————————

今回は第1問の出題編ということで暫くこのシリーズを続けてみる
但し最初に出題編だけを書くか解答編と交互に書くかは未定である

普段プログラミングはしているものの仕事で使うのはライブラリをパッチワークのように組み合わせるだけの単純作業が多いと感じる
今回与えられた課題のおかげで久しぶりに頭を使ってプログラムを書いたような気がしていて暫くアルゴリズムの世界に浸ってみたい