Jumlah transformasi hingga berulang

12

Diberikan urutan bilangan bulat atau untuk lebih spesifik permutasi 0..N mengubah urutan ini sebagai berikut:

  • output [x] = mundur (input [input [x]])
  • ulang

Misalnya: [2,1,0]menjadi [0,1,2]dan terbalik adalah [2,1,0]. [0,2,1]menjadi [0,1,2]dan terbalik [2,1,0].

Contoh 1

In:   0 1 2
S#1:  2 1 0
S#2:  2 1 0
Output: 1

Contoh 2

In:   2 1 0
S#1:  2 1 0
Output: 0

Contoh 3

In:   3 0 1 2
S#1:  1 0 3 2
S#2:  3 2 1 0
S#3:  3 2 1 0
Output: 2

Contoh 4

In:   3 0 2 1
S#1:  0 2 3 1
S#2:  2 1 3 0
S#3:  2 0 1 3
S#4:  3 0 2 1
Output: 3

Tugas Anda adalah mendefinisikan fungsi (atau program) yang mengambil permutasi bilangan bulat 0..Ndan mengembalikan (atau menampilkan) jumlah langkah hingga permutasi terjadi yang telah terjadi. Jika Xmentransformasikan ke Xmaka output harus nol, Jika Xmentransformasikan ke Ydan Yke X(atau Y) maka output harus 1.

Y -> Y: 0 steps
Y -> X -> X: 1 step
Y -> X -> Y: 1 step
A -> B -> C -> D -> C: 3 steps
A -> B -> C -> D -> A: 3 steps
A -> B -> C -> A: 2 steps
A -> B -> C -> C: 2 steps
A -> B -> C -> B: also 2 steps

Testcases:

4 3 0 1 2 -> 0 3 4 1 2 -> 4 3 2 1 0 -> 4 3 2 1 0: 2 steps 
4 3 2 1 0 -> 4 3 2 1 0: 0 steps
4 3 1 2 0 -> 4 1 3 2 0 -> 4 3 2 1 0 -> 4 3 2 1 0: 2 steps
1 2 3 0 4 -> 4 1 0 3 2 -> 0 3 4 1 2 -> 4 3 2 1 0 -> 4 3 2 1 0: 3 steps
5 1 2 3 0 4 -> 0 5 3 2 1 4 -> 1 5 3 2 4 0 -> 1 4 3 2 0 5 -> 
  5 1 3 2 0 4 -> 0 5 3 2 1 4: 4 steps

Jika bahasa Anda tidak mendukung "fungsi" Anda dapat mengasumsikan bahwa urutan diberikan sebagai daftar bilangan bulat terpisah spasi putih seperti 0 1 2atau 3 1 0 2pada satu baris.

Fakta menyenangkan:

  • urutan 0,1,2,3, .., N akan selalu berubah menjadi N, ..., 3,2,1,0
  • urutan N, .., 3,2,1,0 akan selalu berubah menjadi N, .., 3,2,1,0
  • urutan 0,1,3,2, ..., N + 1, N akan selalu berubah menjadi N, ..., 3,2,1,0

Tugas bonus : Mencari tahu rumus matematika.

Aturan opsional :

  • Jika indeks pertama bahasa Anda adalah 1 bukannya 0, Anda dapat menggunakan permutasi 1..N(Anda bisa menambahkan satu ke setiap integer dalam contoh dan testcases).
mroman
sumber
Maksud saya lebih seperti "formula tertutup" seperti $ f (a_ {0}, a_ {1}, a _ {...}} = a_ {0} ^ a_ {1} + ... $ di mana $ a_ { i} $ adalah elemen ke-i dalam urutan yang diberikan
mroman
Apakah Anda yakin "formula tertutup" itu ada?
Todd Sewell
" mengembalikan (atau menampilkan) jumlah langkah sampai permutasi terjadi yang telah terjadi. " Ini tidak konsisten dengan hampir semua yang mengikutinya. Sebagai permulaan, itu membuat nilai pengembalian 0 tidak mungkin ...
Peter Taylor
Apakah contoh ketiga benar? Saya melihat 3,0,1,2harus berubah menjadi2,3,0,1
FireCubez
Ini adalah jumlah transformasi sebelum pengulangan.
mroman

Jawaban:

4

JavaScript (ES6), 54 byte

a=>~(g=a=>g[a]||~-g(g[a]=a.map(i=>a[i]).reverse()))(a)

Cobalah online!

Arnauld
sumber
Apa yang []dilakukan pada suatu fungsi?
mroman
Fungsi adalah objek. Jadi, g[a]bisa digunakan untuk mengakses properti a.
Arnauld
Ah saya mengerti. Anda menggunakan guntuk menyimpan negara di.
mroman
4

Python 2 , 67 byte

f=lambda l,*h:len(h)-1if l in h else f([l[i]for i in l][::-1],l,*h)

Cobalah online!

Erik the Outgolfer
sumber
3

Pyth, 10 9 8 byte

tl.u@LN_

Penjelasan:

t               One less than
 l              the number of values achieved by
  .u            repeating the following lambda N until already seen value:
    @LN_N         composing permutation N with its reverse
         Q      starting with the input.

Suite uji .

lirtosiast
sumber
3

Haskell, 52 byte

([]#)
a#x|elem x a= -1|n<-x:a=1+n#reverse(map(x!!)x)

Cobalah online!

a # x                -- function '#' takes a list of all permutations
                     -- seen so far (-> 'a') and the current p. (-> 'x')
  | elem x a = -1    -- if x has been seen before, return -1 
  | n<-x:a =         -- else let 'n' be the new list of seen p.s and return
    1 +              -- 1 plus
       n #           -- a recursive call of '#' with the 'n' and
        reverse ...  -- the new p.

([]#)                -- start with an empty list of seen p.s 
nimi
sumber
3

Perl 6 , 44 35 byte

-9 byte terima kasih kepada nwellnhof

{($_,{.[[R,] |$_]}...{%.{$_}++})-2}

Cobalah online!

Penjelasan:

{                              }  # Anonymous code block
                  ...    # Create a sequence where:
  $_,  # The first element is the input list
     {.[[R,] |$_]} # Subsequent elements are the previous element reverse indexed into itself
                     {        }    # Until
                      %.{$_}       # The index of the listt in an anonymous hash is non-zero
                            ++     # Then post increment it
 (                            )-2  # Return the length of the sequence minus 2
Jo King
sumber
2

J, 33 27 26 byte

-7 terima kasih kepada bubbler

_1(+~:i.0:)|.@C.~^:(<@!@#)

Cobalah online!

bagaimana

penjelasan asli. peningkatan terakhir saya hanya mengubah bagian yang menemukan "indeks elemen pertama yang telah kita lihat". sekarang menggunakan "nub saringan" untuk melakukannya dalam lebih sedikit byte.

1 <:@i.~ [: ({: e. }:)\ |.@C.~^:(<@!@#)
                        |.@C.~          NB. self-apply permutation and reverse
                              ^:        NB. this many times:
                                (<@!@#) NB. the box of the factorial of the
                                        NB. the list len.  this guarantees
                                        NB. we terminate, and the box means
                                        NB. we collect all the results
         [: ({: e. }:)\                 NB. apply this to those results:
                      \                 NB. for each prefix
             {: e. }:                   NB. is the last item contained in 
                                        NB. the list of previous items?
1 <:@i.~                                NB. in that result find:
1    i.~                                NB. the index of the first 1
  <:@                                   NB. and subtract 1

Perhatikan bahwa seluruh frasa akhir 1<:@i.~[:({:e.}:)\dikhususkan untuk menemukan "indeks elemen pertama yang telah terlihat." Ini sepertinya sangat lama untuk mendapatkan itu, tetapi saya tidak bisa bermain golf lagi. Saran diterima.

Jonah
sumber
1

Dyalog APL, 29 28 27 byte

¯2∘+∘≢{⍵,⍨⊂⌽(⍋⍳⊢)⊃⍵}⍣{⍺≢∪⍺}

Membawa array kotak. Akan melatih dan menjelaskan nanti.

Cobalah di sini sebagai test suite .

lirtosiast
sumber