はじめに
やさしいD言語クイズの第3回です。
クイズを通して、D言語の言語仕様を紹介しています。これをきっかけにD言語に興味を持ってもらえると幸いです。
参考までに、過去2回の出題内容を紹介します。
クイズの前提
Online D Editor(2022/12/10現在)での実行結果をクイズの正解とします。
Online D Editorの環境情報(2022/12/10現在)
import std.stdio;
void main(){
writeln(__VENDOR__);
writeln(__VERSION__);
}
実行結果
Digital Mars D
2099
問題7
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。
import std.stdio;
void main(){
enum {
A,
B,
C = E + 1,
D = 7,
E
}
writeln(A, B, C, D, E);
}
問題8
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。
import std;
void main()
{
int[4] a = [1, 2, 3, 4];
int[4] b = 2 * a[] - 1;
int[4] c = a[] * a[] - b[];
writeln(a);
writeln(b);
writeln(c);
}
問題9
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。
import std;
struct zoo
{
static string[string] cage;
void opDispatch(string s1)(){
string s = s1;
foreach ( key; cage.keys ){
s = s.replace(key, cage[key]);
}
writeln( s );
}
static void opCall(string[] s ...){
foreach ( i; 0 .. s.length / 2 ){
cage[s[i * 2]] = s[i * 2] ~ s[i * 2 + 1];
}
}
}
void main()
{
zoo z;
with ( z ){
zoo("カモ", "🦆", "シカ", "🦌", "ウシ", "🐄🐂");
カモシカのようなウシ;
}
}
ここから回答編です。ネタばれ注意!!
問題7の答え
問題7の実行結果
実行結果
01978
答えへの補足
enum(列挙型)についての問題です。
- 最初の要素である
A
には、値の指定がないので、初期値の0
が代入されます。 - 次の
B
にも値の指定がないのでA
に1
を加えた1
が代入されます。 -
C
は、後方のE
の値が決まってから、値が確定します。 -
D
には7
が代入され、次のE
は、D
に1
を加えた8
が代入されます。 -
E
の値が決まったので、C
は9
になります。
問題8の答え
問題8の実行結果
実行結果
[1, 2, 3, 4]
[1, 3, 5, 7]
[0, 1, 4, 9]
答えへの補足
ベクトル演算についての問題です。
-
2 * a[] - 1
では、配列a
の各要素に2
をかけて1
を引く演算を行います。
2 \times \vec{a} - 1 =
2
\times
\begin{pmatrix}
2 \times 1 - 1 \\
2 \times 2 - 1 \\
2 \times 3 - 1 \\
2 \times 4 - 1 \\
\end{pmatrix}
=
\begin{pmatrix}
1 \\
3 \\
5 \\
7 \\
\end{pmatrix}
-
a[] * a[] - b[]
では、配列の各要素同士で演算を行います。
\vec{a} \times \vec{a} - \vec{b} =
\begin{pmatrix}
1 \times 1 - 1 \\
2 \times 2 - 3 \\
3 \times 3 - 5 \\
4 \times 4 - 7 \\
\end{pmatrix}
=
\begin{pmatrix}
0 \\
1 \\
4 \\
9 \\
\end{pmatrix}
問題9の答え
問題9の実行結果
実行結果
カモ🦆シカ🦌のようなウシ🐄🐂
答えへの補足
関数のオーバーロード、連想配列、可変長引数を扱った問題です。
-
main
のzoo
関数はopCall
と紐づいています。(関数呼出しのオーバーロード) -
opCall
の引数はstring
型の可変長と定義しています。string
型の動的配列のように扱えます。 -
カモシカのようなウシ
は関数です。opDispatch
に紐づけられます。(フォワード機能) -
opDispatch
のs1
にカモシカのようなウシ
が代入されます。