2

D で非常に単純なものをコーディングしようとしていますが、標準ライブラリのテンプレート関数の 1 つ (具体的にはnextPermutationからstd.algorithm) にいくつか問題があります。

私がやろうとしていることの核心は、パンデジタル数のすべての順列 (つまり、1 から 9 までのすべての値を正確に 1 回含む数) を作成することです。

これを行うために、次のことを行いました。

import std.algorithm;
import std.conv;

int[] pandigitals()
{
    char[] initial = "123456789".dup;
    auto pan = [to!int(initial)];
    while(nextPermutation!(initial)) {
       pan ~= to!int(initial);
    }
    return pan;
}

これは私にエラーを与えます:

エラー: nextPermutation の型を解決できません!(初期)

また、タイプを明示的に設定しようとしました:

while(nextPermutation!("a<b", char[])(initial))

ただし、これにより、テンプレートと一致しないというエラーが発生します。

エラー: テンプレート インスタンス std.algorithm.nextPermutation!("a < b", char[]) はテンプレート宣言と一致しません nextPermutation(alias less = "a < b", BidirectionalRange)(ref BidirectionalRange range) if (isBidirectionalRange!BidirectionalRange && hasSwappableElements!BidirectionalRange)

呼び出しの正しい形式は何ですか?

4

1 に答える 1

5

最初の問題はinitial、関数の引数ではなくテンプレートの引数として渡していることです。は!()テンプレート引数用です。そのため、代わりに

while(nextPermutation!(initial))

あなたがする必要があります

while(nextPermutation(initial)) {

さて、それでもエラーが発生します。

q.d(10): Error: template std.algorithm.nextPermutation cannot deduce function from argument types !()(char[]), candidates are:
/usr/include/D/phobos/std/algorithm.d(12351):        std.algorithm.nextPermutation(alias less = "a<b", BidirectionalRange)(ref BidirectionalRange range) if (isBidirectionalRange!BidirectionalRange && hasSwappableElements!BidirectionalRange)

そして、それhasSwappableElements!(char[])は' テンプレート制約falseごとに、型が動作するためnextPermutationsに必要なためです。truenextPermutations

これfalseは、すべての文字列がdchar実際の要素の型ではなく範囲として扱われるためです。これは、UTF-8 ( char) と UTF-16 ( wchar) ではコード ポイントごとに複数のコード ユニットが存在するため、個々のコード ユニットを操作するとコード ポイントが分割される可能性があるのに対し、UTF-32 ( dchar) では常に 1 つのコードが存在するためです。コードポイントあたりの単位。基本的に、 または の配列がcharまたはwcharの範囲として扱われるchar場合wchar、文字を分割するリスクが高くなり、文字全体ではなく文字の断片になってしまいます。したがって、一般的に D では、個々の文字を操作する場合は、またはdcharではなくを使用する必要があります。Unicode にあまり詳しくない場合は、この記事を読むことをお勧めします。charwcharJoel Spoelskyによるこの主題に関する.

ただし、理由に関係なく、それhasSwappableElements!(char[])はであるため、別のタイプを使用する必要があります。最も簡単な方法は、アルゴリズムを代わりに使用するように交換することです。false falsedchar[]

int[] pandigitals()
{
    dchar[] initial = "123456789"d.dup;
    auto pan = [to!int(initial)];
    while(nextPermutation(initial)) {
       pan ~= to!int(initial);
    }
    return pan;
}
于 2014-06-23T16:33:49.043 に答える