Pergantian 27 fungsi

22

pengantar

Mari kita mendefinisikan fungsi terner sebagai fungsi dari set tiga elemen S = {0,1,2}ke dirinya sendiri: ia menghubungkan ke setiap elemen elemen Slain dari S. Salah satu contoh fungsi terner fadalah

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

Ada 27 fungsi terner yang berbeda, dan kami mewakilinya dengan bilangan bulat dari 0 hingga 26: fungsi fdikodekan sebagai f(0) + 3*f(1) + 9*f(2). Contoh fungsi di atas disandikan sebagai angka 6.

Kita dapat menerapkan dua fungsi terner fdan gsecara berurutan, dan jika f(g(k)) == g(f(k))berlaku untuk semua kdi S, maka fungsi bolak-balik . Tugas Anda adalah memverifikasi apakah ini masalahnya.

Memasukkan

Input Anda adalah dua bilangan bulat dalam rentang inklusif dari 0 hingga 26. Keduanya mewakili dua fungsi ternary fdan g. Input harus diambil dalam 1format desimal, biner atau unary (string s).

Keluaran

Output Anda adalah nilai kebenaran jika fdan gbolak - balik, dan nilai palsu jika tidak. Anda tidak boleh berasumsi bahwa input sudah dipesan.

Contohnya

Pertimbangkan input 5 dan 16. Mereka mengkode fungsi terner

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

Kami punya f(g(1)) == f(2) == 0dan g(f(1)) == g(1) == 2, jadi fdan gtidak bolak-balik dan output yang benar adalah falsey.

Di sisi lain, input 3 dan 10 mengkodekan fungsi ternary

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

dan dapat diverifikasi bahwa f(g(k)) == g(f(k))berlaku untuk semua kdi S. Maka hasil yang benar adalah benar.

Berikut adalah tabel 27 × 27 dari semua input yang mungkin, dengan +menandai output yang benar dan output -yang palsu:

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

Aturan dan penilaian

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Zgarb
sumber
Bisakah input menjadi array dengan dua angka?
Luis Mendo
1
@ DonMuesli Itu diizinkan sesuai konsensus di Meta .
Zgarb

Jawaban:

4

Jelly, 17 14 13 byte

+13ḃ3Um0ị2/⁼/

Cobalah online! atau verifikasi semua 27 × 27 kasus .

Bagaimana itu bekerja

+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.
Dennis
sumber
Saya telah menyalin ide Anda memverifikasi semua kasus uji dan menampilkan matriks :-)
Luis Mendo
3

MATL , 19 18 byte

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

Truthy adalah array dengan semua yang ada. Falsy adalah array yang mengandung setidaknya satu nol.

Cobalah online! atau verifikasi semua kasus (perlu beberapa detik).

       % 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
Luis Mendo
sumber
Saya pikir biasanya hanya daftar kosong yang dianggap palsu.
Timtech
1
@Timtech Itu tergantung bahasa. Di MATL, array yang berisi angka nol adalah falsy.
Dennis
Oke, hanya memeriksa ...
Timtech
@Timtech Tentu! Ini dia secara lebih terperinci: Sebuah ekspresi benar ketika hasilnya tidak kosong dan hanya mengandung elemen nol (angka logis atau nyata)
Luis Mendo
3

Python 2, 61 byte

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

Diberikan input i, kita dapat mengimplementasikan fungsi yang diwakili ndengan melakukan n/3**i%3untuk mengekstraksi idigit ternary dari n. Fungsi memeriksa bahwa hasil yang sama didapat untuk masing-masing 0,1,2saat menerapkan fungsi dalam urutan apa pun. Sebenarnya, karena langkah pertama dilakukan 3**, tes ini dengan[1,3,9] malah dilakukan.

Penggunaan kembali kode terlihat boros, tetapi saya tidak melihat cara yang lebih baik. Membandingkan:

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])
Tidak
sumber
1

JavaScript (ES7), 68 byte

(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)

Sayangnya konversi basis 3 terlalu mahal:

(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))
Neil
sumber
0

Mathematica, 77 byte

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

Pengindeksan berbasis-satu Mathematica kembali menyerang!

murphy
sumber
1
Lebih pendek untuk menetapkan {1,1,1}ke variabel dan menggunakannya.
CalculatorFeline