脳トレブームが起こる前から(「脳」ブームよりは後ですが)「アルゴリズムを考えるのはプログラマを目指しているかによらず論理パズルみたいで面白いのではないか」と思って、数年前にC言語を使った簡易ゲームの製作過程を読み物として提供していました。
脳トレブームが過熱中の現在ですが、題材としてプログラムコードを使ったパズルを見かけません。(脳トレとは別にパズル自体は存在すると思いますが、メジャーではないでしょう。)
このパズルの問題は「プログラマでなくても解け、プログラマであっても考えてみる必要がある」としていますが、今回はパイロット版なのでプログラマにとって身近なケース(というか筆者の十八番コード)を取り上げます。
「条件に当てはまる要素を削除する」
コード(C#2.0(Fx2.0)以降)
private void Routine()
{
// (省略)
// 条件に当てはまる要素を削除する
List list; // リスト(要素が?個入っているものとする)
[__________(A)__________]
{
if (IsToDelete([__(C)__]))
[__________(B)__________]
}
// (省略)
}
問題
[__(A)__]と[__(B)__]に入るコードを書きなさい。
この問題は予備知識が必要なので出題対象はプログラマ限定です。(なのでコードを書かせます。)
補足
[__(A)__]はブロックの先頭についている。
[__(B)__]は1行。
補足2
この例だとpublic int RemoveAll(Predicate match)(Listクラス)を使った方が簡単・確実ですが、使わない場合でお答えください。
効能には個人差がありますが、男女に関係なく利用いただけます。