バックグラウンド
順列のパリティは、ウィキペディアで定義されている次のように、次のとおりです。
順列σの符号または署名はsgn(σ)で示され、σが偶数の場合は+ 1、σが奇数の場合は-1として定義されます。
順列の符号は、次のように明示的に表現できます。
sgn(σ)=(−1)^ N(σ)
ここで、N(σ)はσの反転数です。
あるいは、置換σの符号は、転置の積への分解から次のように定義できます。
sgn(σ)=(−1)^ m
ここで、mは分解の転置の数です。
数学でギリシャ語のアルファベットスープが好きではない人のために、例(ウィキペディアから盗まれた)を使って定義を少し簡略化してみます。
例
入力配列{1, 2, 3, 4, 5}、およびその順列を考えてみましょう{3, 4, 5, 2, 1}。その順列に元の配列から取得するためには、インデックスを交換しなければならない0と2、1と3、その後、2および4。これは独自のソリューションではありませんが、パリティは明確に定義されているため、すべての場合に機能します。
3つのスワップが必要なので、この順列にoddパリティを付けます。ご想像のとおり、偶数のスワップを必要とする順列にはevenパリティがあると言われています。
チャレンジ
あなたの課題は、置換のパリティを決定するために、できるだけ少ないバイトでプログラムを書くことです。プログラムまたは機能は以下を行う必要があります。
- 置換の前後のセットを表す2つの入力配列(または文字列)を引数として受け入れます。
- 順列が与えられると、偶数
eまたはo奇数の文字を返すか出力します。 - 配列または文字列内のすべてのインデックスに一意の値があると想定する必要があります。
テストケース
次の名前の関数を宣言したと仮定しますf。
f([10], [10]) == "e"
f([10, 30, 20], [30, 20, 10]) == "e"
f([10, 30, 20, 40], [30, 20, 40, 10]) == "o"
これはcode-golfで、バイト単位の最短プログラムが勝ちです!
[10], [10] -> e転置ゼロ)。[10 30 20], [30 20 10] -> e(2つの転置)。[10 30 20 40], [30 20 40 10] -> o(3つの転置)