27個の関数の整流


22

前書き

3要素関数を、それ自体に設定された3要素からの関数として定義してみましょうS = {0,1,2}:のS別の要素の各要素に関連付けSます。三項関数の一例f

f(0) = 0; f(1) = 2; f(2) = 0

正確に27の異なる三項関数があり、それらを0から26の整数で表します:関数fはとしてエンコードされf(0) + 3*f(1) + 9*f(2)ます。上記のサンプル関数は、数値6としてエンコードされます。

2つの3項関数fg順番に適用できます。f(g(k)) == g(f(k))すべてのkin が成立する場合S、関数は通勤します。あなたの仕事は、これが事実かどうかを確認することです。

入力

入力は、0〜26の範囲の2つの整数です。これらは2つの3項関数fおよびを表しgます。入力は、10進数、2進数、または単項(1sの文字列)形式で行う必要があります。

出力

あなたの出力はtruthy値の場合fgそうでない場合は通勤、およびfalsey値。入力が順序付けられていると想定することはできません。

入力5と16を検討します。これらは3次関数をエンコードします

f(0) = 2; f(1) = 1; f(2) = 0
g(0) = 1; g(1) = 2; g(2) = 1

我々は持っているf(g(1)) == f(2) == 0g(f(1)) == g(1) == 2、そうfg通勤していないと、正しい出力がfalseyです。

一方、入力3と10は3項関数をエンコードします

f(0) = 0; f(1) = 1; f(2) = 0
g(0) = 1; g(1) = 0; g(2) = 1

そして、それはf(g(k)) == g(f(k))すべてkで保持することが確認できますS。正しい出力は真実です。

以下は、すべての可能な入力の27×27の表で+、真実の出力と偽の出力をマークしてい-ます。

+ - - + - - + - - + - - + - - + - - + - - + - - + - -
- + - - - - - - - - - - + - - - - - - - - + - - - - -
- - + - - - - - - - - - - - - - - - - - - + - - + - -
+ - - + - - - - - - + - - + - - - - + - - + - - - - -
- - - - + - - - - - - - - + - - - - - - - + - - - - -
- - - - - + - - - - - - - + - - - - - - - + - - - - -
+ - - - - - + - - - - - - - - - - - - - - + - - - - -
- - - - - - - + - - - + - - - - - - - - - + - - - - -
- - - - - - - - + - - - - - - - - - + - - + - - - - -
+ - - - - - - - - + - - - - - - - - - - - + - - - - -
- - - + - - - - - - + - - - - - - - - - - + - - - - -
- - - - - - - + - - - + - - - - - - - - - + - - - - -
+ + - - - - - - - - - - + + - - - - - - - + + - - - -
- - - + + + - - - - - - + + + - - - - - - + + + - - -
- - - - - - - - - - - - - + + - - - - - - + - - - - -
+ - - - - - - - - - - - - - - + - - - - - + - - - - -
- - - - - - - - - - - - - - - - + - - - - + - + - - -
- - - - - - - - - - - - - - - - - + - - - + + - - - -
+ - - + - - - - + - - - - - - - - - + - - + - - - - +
- - - - - - - - - - - - - - - - - - - + - + - - - - +
- - - - - - - - - - - - - - - - - - - - + + - - - - +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
- - - - - - - - - - - - + + - - - + - - - + + - - - +
- - - - - - - - - - - - - + - - + - - - - + - + + - +
+ - + - - - - - - - - - - - - - - - - - - + - + + - +
- - - - - - - - - - - - - - - - - - - - - + - - - + +
- - - - - - - - - - - - - - - - - - + + + + + + + + +

ルールとスコアリング

完全なプログラムまたは関数を作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。


入力は2つの数値を持つ配列にできますか?
ルイスメンドー

1
@DonMuesli Metaのコンセンサスに従って許可されています。
ズガルブ

回答:


4

ゼリー、17 14 13バイト

+13ḃ3Um0ị2/⁼/

オンラインでお試しください!または、すべての27×27ケースを確認します

使い方

+13ḃ3Um0ị2/⁼/  Main link. Argument: [f, g] (encoded as integers)

+13            Add 13 ([1, 1, 1] in base 3) to f and g.
   ḃ3          Convert f + 13 and g + 13 to bijective base 3.
               Bijective base 3 uses the digits 1 to 3 instead of 0 to 2.
               This yields [[f(2)+1, f(1)+1, f(0)+1], [g(2)+1, g(1)+1, g(0)+1]].
               The increments account for 1-based indexing.
     U         Reverse each digit array.
               This yields [[f(0)+1, f(1)+1, f(2)+1], [g(0)+1, g(1)+1, g(2)+1]].
      m0       Concatenate the list with a reversed copy of itself.
        ị2/    Split the result into pairs, and reduce each one by indexing.
               This computes g○f and f○g.
          ⁼/   Reduce by match; return 1 iff g○f = f○g.

すべてのテストケースを検証し、マトリックスを表示するというアイデアをコピーしました:-)
ルイスメンドー

3

MATL19 18バイト

I:PII$YAZ{Y:)1Mw)=

Truthyはすべての配列です。Falsyは、少なくとも1つのゼロを含む配列です。

オンラインでお試しください!または、すべてのケースを確認します(数秒かかります)。

       % implicitly input an array of two numbers
I:P    % push [3 2 1]
I      % push 3
I$     % specify that the next function takes 3 inputs
YA     % convert input to base 3 with alphabet [3 2 1] and 3 digits. Gives 2x3 array
Z{     % convert into cell of two cells, one with each row
Y:     % split cell array. We have two arrays on the stack, one per function
)      % index operation to compute f ∘ g. Function composition is indexing
1M     % push the two arrays again
w      % swap the two arrays
)      % index operation to compute g ∘ f
=      % test for equality element-wise
       % implicitly display

私は通常、空のリストのみが偽とみなされると思います。
ティムテック

1
@Timtech それは言語に依存します。MATLでは、ゼロを含む配列は偽です。
デニス

さて、確認するだけです
...-Timtech

@Timtech確かに!ここでは、より詳細に:その結果が空であり、唯一の非ゼロ要素(論理的または実際の数値)が含まれている場合、式が真である
ルイスMendo

3

Python 2、61バイト

lambda m,n:all(n/3**(m/i%3)%3==m/3**(n/i%3)%3for i in[1,3,9])

入力を考えるとi、我々はによって表される機能を実装することができますn実行してn/3**i%3抽出するためiの第三の数字をn。関数は0,1,2、関数をいずれかの順序で適用するときに、それぞれに対して同じ結果が得られることを確認します。実際、最初のステップはであるため、代わりに3**テストを行い[1,3,9]ます。

コードの再利用は無駄に見えますが、より良い方法は見つかりませんでした。比較する:

q=lambda x,i:x/3**i%3;lambda m,n:all(q(m,q(n,i))==q(n,q(m,i))for i in[0,1,2])

1

JavaScript(ES7)、68バイト

(a,b)=>![0,1,2].some(n=>t(a,t(b,n))-t(b,t(a,n)),t=(a,n)=>a/3**n%3|0)

残念ながら、ベース3の変換は高すぎます。

(a,b)=>[0,1,2].every(n=>a[b[n]]==b[a[n]],g=a=>(27+a).toString(3).slice(1),a=g(a),b=g(b))

0

Mathematica、77バイト

Reverse[#][[#2+{1,1,1}]]==Reverse[#2][[#+{1,1,1}]]&@@IntegerDigits[{##},3,3]&

MathematicaのOneベースのインデックス作成が再び成功しました!


1
{1,1,1}変数に割り当てて使用する方が短い。
電卓
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.