3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

D言語Advent Calendar 2022

Day 11

やさしいD言語クイズ(その3)

Posted at

はじめに

やさしい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にも値の指定がないのでA1を加えた1が代入されます。
  • Cは、後方のEの値が決まってから、値が確定します。
  • Dには7が代入され、次のEは、D1を加えた8が代入されます。
  • Eの値が決まったので、C9になります。

問題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の実行結果
実行結果
カモ🦆シカ🦌のようなウシ🐄🐂

答えへの補足

関数のオーバーロード、連想配列、可変長引数を扱った問題です。

  • mainzoo関数はopCallと紐づいています。(関数呼出しのオーバーロード)
  • opCallの引数はstring型の可変長と定義しています。string型の動的配列のように扱えます。
  • カモシカのようなウシは関数です。opDispatchに紐づけられます。(フォワード機能)
  • opDispatchs1カモシカのようなウシが代入されます。
3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?