見出し画像

共通テスト「情報Ⅰ」でしか使わない謎プログラミング言語DNCLとは?

共通テスト「情報Ⅰ」の勉強を始めると、多くの受験生が最初につまずくものがあります。

それは大問3、プログラミング。

そして、そのプログラミングで使われているよく分からない日本語風のプログラミング言語。

それがDNCLです。

公式ドキュメントはこちら

「プログラミング言語なの?」「Pythonとは何が違うの?」「これって受験が終わっても役に立つの?」

初めて見る人なら、そんな疑問を抱くのも当然でしょう。

もちろんDNCLは、プログラマーが仕事で使うような言語ではありません。情報の考え方やアルゴリズムを学ぶために作られた、教育用の記述方法です。

この記事では、DNCLとは何なのか、なぜ共通テストで使われるのか、そして効率よく対策する方法まで分かりやすく紹介します。

DNCLとは?

DNCL(Daigaku Nyushi Center Language)は、高校「情報」の入試向けに作られたプログラム表記法の一つです。

そのまますぎる名前です。

一般的なプログラミング言語のようにパソコンへ入力して動かすことを目的としたものではなく、アルゴリズムや論理的な考え方を表現するために使われます。

そのため、PythonやJavaのような開発言語とは役割が異なります。

そもそも日本語でプログラミング言語を作ると表記ゆれしすぎる上に、データ量が無駄に増えて使い物にならないでしょう。

共通テストでは、プログラムを書く能力ではなく、「このプログラムは何をしているのか」を読み解く力が問われます。


試しに書いてみる

せっかくなのでいくつかの有名なプログラムをこの言語で再現してみましょう。
(実際の試験で書かせることはありません。)

①素因数分解

n ← 【外部からの入力】
d ← 2
n > 1 の間,
∣   もし n % d = 0 ならば
∣   ∣   d を表示する
∣   ∣   n ← n ÷ d
∣   そうでなければ
∣   ∣   d を 1 増やす
∣   を実行する
を繰り返す

②クイックソート

// 1. 配列の作成(12個の自然数を入れる)
Data ← {34, 12, 78, 5, 23, 1, 99, 45, 67, 8, 51, 30}

// 2. クイックソート関数の定義
関数 QuickSort(left, right) を
∣   i ← left
∣   j ← right
∣   // 基準値(ピボット)を中央の要素にする
∣   pivot ← Data[(left + right) ÷ 2]
∣   
∣   // 基準値をもとに左右に分割
∣   i ≦ j の間,
∣   ∣   Data[i] < pivot の間,
∣   ∣   ∣   i を 1 増やす
∣   ∣   を繰り返す
∣   ∣   Data[j] > pivot の間,
∣   ∣   ∣   j を 1 減らす
∣   ∣   を繰り返す
∣   ∣   もし i ≦ j ならば
∣   ∣   ∣   // 要素の入れ替え(交換)
∣   ∣   ∣   work ← Data[i]
∣   ∣   ∣   Data[i] ← Data[j]
∣   ∣   ∣   Data[j] ← work
∣   ∣   ∣   i を 1 増やす
∣   ∣   ∣   j を 1 減らす
∣   ∣   を実行する
∣   を繰り返す
∣   
∣   もし left < j ならば
∣   ∣   QuickSort(left, j) を実行する
∣   を実行する
∣   もし i < right ならば
∣   ∣   QuickSort(i, right) を実行する
∣   を実行する
と定義する

// 3. メイン処理の実行
QuickSort(0, 11) を実行する
Data を表示する

再帰を用いたので、かなり素早く並べてくれます。

③ハノイの塔

再帰といえば、やっぱりハノイの塔ですよね。

// n: 円盤の数, from_p: 移動元, to_p: 移動先, work_p: 作業用
関数 Hanoi(n, from_p, to_p, work_p) を
∣   もし n = 1 ならば
∣   ∣   // 円盤が1枚なら直接移動させて終了
∣   ∣   from_p と "から" と to_p と "へ移動" を表示する
∣   そうでなければ
∣   ∣   // 1. 上の n-1 枚を「作業用の柱」へ避難させる
∣   ∣   Hanoi(n - 1, from_p, work_p, to_p) を実行する
∣   ∣   
∣   ∣   // 2. 一番下の1枚を「目的の柱」へ移動させる
∣   ∣   from_p と "から" と to_p と "へ移動" を表示する
∣   ∣   
∣   ∣   // 3. 避難させた n-1 枚を「目的の柱」へ移動させる
∣   ∣   Hanoi(n - 1, work_p, to_p, from_p) を実行する
∣   を実行する
と定義する

// 実行
Hanoi(3, "A", "C", "B") を実行する

Pythonならこんな感じ。

def hanoi(n, from_p, to_p, work_p):
    if n == 1:
        # 円盤が1枚なら直接移動
        print(f"{from_p}から{to_p}へ移動")
    else:
        # 1. 上の n-1 枚を「作業用の柱」へ避難させる
        hanoi(n - 1, from_p, work_p, to_p)
        
        # 2. 一番下の1枚を「目的の柱」へ移動させる
        print(f"{from_p}から{to_p}へ移動")
        
        # 3. 避難させた n-1 枚を「目的の柱」へ移動させる
        hanoi(n - 1, work_p, to_p, from_p)

# 実行
hanoi(3, "A", "C", "B")

実行結果

AからBへ移動
CからBへ移動
AからCへ移動
BからAへ移動
BからCへ移動
AからCへ移動


なぜPythonではないの?

どうせならPythonを出題すればいいのに」と思った人もいるかもしれません。

確かに、Pythonは高校の授業でも広く使われています。
AIブームで今最もアツい言語でもあります。

それでも共通テストでDNCLが採用されているのには理由があります。

Pythonとの違い

実際に、DNCLを見ていると、「Pythonと似ている」と感じる場面もあります。

条件分岐や繰り返しなど、考え方そのものは共通していますし、Pythonをもとにして言語を作っていると考えられます。

一方で、書き方にはいろいろと違いがあります。

例えば、

  • 文法がより日本語に近い

  • 教育目的に合わせて簡潔に表現されている

つまり、考え方はプログラミングそのものですが、文法は別物と考えると理解しやすいでしょう。

学習環境の差を小さくするため

高校によって使用するプログラミング言語はさまざまです。

  • Python

  • JavaScript(またはTypeScript)

  • Ruby

  • Scratch

  • VBA

もしかするといきなりC++を学習している強い高校(?)もあるかもしれません。

もし特定の言語だけで出題すると、その言語を学んでいない受験生が不利になる可能性があります。DNCLなら、全員が初見なので、どの言語を学んだ人でも同じ条件で問題に取り組めます。

「文法」ではなく「考え方」を測るため

情報Ⅰで本当に評価したいのは、

  • 条件分岐

  • 繰り返し

  • 変数

  • 配列

  • アルゴリズム

といった論理的思考です。

別に「セミコロンをつけよう」「字下げをしよう」「変数の型を考えよう」なんていう勉強は不要なのです。

その上、今はAIが台頭した世界。細かいところの書式なんて勝手に整えてくれます。

私たちが試験で問われるのはプログラムがどのような処理を行うか。
言語ごとの特性はどうだって良い。

だからこそ、DNCLは余計な文法を減らし、本質的な考え方だけを問えるよう工夫されています。
DNCLが動的型付け(数値も文字も同じ変数に代入できる)であることにも注目してみましょう。
初学者にもわかりやすい、実際の日本語に極めて近い設計になっています。


DNCLでよく出てくる構文

最初は難しく見えても、実際に使われる構文はそれほど多くありません。

例えば、

  • 変数への代入

  • 条件分岐

  • 繰り返し

  • 配列

  • 関数

  • 入力・出力

このあたりを理解しておけば、多くの問題に対応できます。

その上、そこまで複雑なアルゴリズムを問われるとは思いません。
出ても再帰まででしょう。

しかもクイックソート(再帰)なんて問われた暁には予備校は揃って「難化」というでしょう。

共通テストは難しくしすぎると怒られます。
よって、そこまで複雑な問題は出されないはず。

解くうえでとにかく重要なのは、1行ずつ順番に処理を追うことです。

頭の中だけで考えるのではなく、変数の値を紙に書きながら確認すると、正答率が大きく上がります。

  • ループしている場所では、何周しているか

  • 配列にはどこまで入っているか

  • 処理が止まるのはいつか

とにかく試験用紙に書かれているコードを読みとばさず、1行ずつ確かめるのが重要。
プログラムは基本的に普通の日本語として読めば大丈夫です。

その前後にある会話パートも読みましょう。

添字が0から始まるのか1から始まるのかにも注意!


DNCLは受験後も役に立つ?

結論から言えば、DNCLそのものを大学や仕事で使う機会はほとんどありません。

しかし、DNCLを通して身に付けた

  • アルゴリズムを考える力

  • 論理的思考力

  • プログラムを読む力

は、その後JavaやSwiftやRなどを学ぶ際にも役立ちます。

実際、プログラミング初心者にとって最も難しいのは文法ではなく、「コンピュータがどう考えて処理しているか」を理解することです。

その土台作りという意味では、DNCLを学ぶ価値は十分にあるはず。


効率よく勉強するコツ

DNCLを得意にするためには、暗記だけでは不十分です。

おすすめの勉強法は、

  1. 基本構文を理解する

  2. 変数の動きを紙に書く

  3. 問題を解く

  4. 解説を読んで処理を追い直す

という流れです。

慣れてくると、プログラム全体の流れが自然と見えるようになるはず。


間違ったやり方

DNCLを暗記しようとする

構文を丸暗記するよりも、「この命令は何をしているか」を理解する方が重要です。

もとは普通の日本語ですから、日本語の指示を読んでいるんだというマインドで、変に怖がる必要はありません。

難しいプログラムを書く練習をする

共通テストでは、複雑なプログラムを書く力は基本的に求められません。

上に記述した「ハノイの塔」なんて出されたら入試センターに抗議してもいいと思います。

大事なのは順を追って読む力。
その読む力を優先して鍛えましょう。

一行飛ばして読む(ぜったいだめ)

処理は基本的に上から順番に実行されます。
そのため、読み飛ばして添字を1つ飛ばすなんてあっては大量失点のもとに…

一つひとつ丁寧に追う習慣が、高得点への近道です。


まとめ

DNCLは、多くの受験生にとって「初めて見る謎の言語」です。
多くの受験生だけでなく、プログラミングに関する仕事をする人にとっても謎言語です。

ですが、その正体は、プログラミングの考え方を分かりやすく表現するための教育用の記述方法です。

最初は戸惑うかもしれませんが、扱われる構文は限られており、基本を押さえれば十分対応できます

「読めるようになること」を目標に学習を進めれば、共通テスト情報Ⅰでも自信を持って問題に取り組めるはず。

情報Ⅰはできれば得意な科目にしておきたいところ。
そしてミスも多いところ。

読むのに慣れて、プログラミングを得点源にしよう!

この記事を気に入ってくれた方は❤️やコメントをお願いします!

いいなと思ったら応援しよう!

ぎっちゃ | 京大情報のひよっこ(18) 記事を読んでくれてありがとうございます。応援の気持ちが何よりの原動力です! いただいたチップはいろんな方のnoteの購入費として還元したり、お茶菓子代として使わせていただきます🙇‍♂️