Número de transformações até a repetição


12

Dada uma sequência de números inteiros ou, para ser mais específico, uma permutação de 0..N transformar essa sequência da seguinte maneira:

  • saída [x] = reverso (entrada [entrada [x]])
  • repetir

Por exemplo: [2,1,0]torna - se [0,1,2]e invertido é [2,1,0]. [0,2,1]torna [0,1,2]- se e invertido [2,1,0].

Exemplo 1

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

Exemplo 2

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

Exemplo 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

Exemplo 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

Sua tarefa é definir uma função (ou programa) que aceita uma permutação de números inteiros 0..Ne retorna (ou gera) o número de etapas até que ocorra uma permutação que já ocorreu. Se Xtransforma para, Xentão, a saída deve ser zero; Se Xtransforma para Ye Ypara X(ou Y), a saída deve ser 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

Casos de teste:

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

Se o seu idioma não suporta "funções" você pode assumir que a seqüência é dado como espaços em branco lista de inteiros separados, como 0 1 2ou 3 1 0 2em uma única linha.

Curiosidades:

  • a sequência 0,1,2,3, .., N sempre se transformará em N, ..., 3,2,1,0
  • a sequência N, .., 3,2,1,0 sempre se transformará em N, .., 3,2,1,0
  • a sequência 0,1,3,2, ..., N + 1, N sempre se transformará em N, ..., 3,2,1,0

Tarefa bônus : descubra uma fórmula matemática.

Regras opcionais :

  • Se o primeiro índice do seu idioma for 1 em vez de 0, você poderá usar permutações 1..N(basta adicionar um a cada número inteiro no exemplo e nos casos de teste).

Eu quis dizer mais como uma "fórmula fechada", como $ f (a_ {0}, a_ {1}, a _ {...}} = a_ {0} ^ a_ {1} + ... $ onde $ a_ { i} $ é o i-ésimo elemento na sequência dada.
mroman

Você tem certeza de que existe uma "fórmula fechada"?
Todd Sewell

" retorna (ou gera) o número de etapas até que ocorra uma permutação que já ocorreu. " Isso é inconsistente com praticamente tudo o que segue. Para começar, ele faz um valor de retorno de 0 impossível ...
Peter Taylor

O terceiro exemplo está correto? Eu vejo que 3,0,1,2deveria se transformar em2,3,0,1
FireCubez 19/11/18

É o número de transformações antes de uma repetição.
mroman

Respostas:


4

JavaScript (ES6), 54 bytes

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

Experimente online!


O que []faz em uma função?
mroman

Uma função é um objeto. Portanto, g[a]pode ser usado para acessar a propriedade a.
Arnauld

Ah entendo. Você está usando gpara armazenar o estado.
mroman


3

Pitão, 10 9 8 bytes

tl.u@LN_

Explicação:

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.

Conjunto de teste .


3

Haskell, 52 bytes

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

Experimente 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 

3

Perl 6 , 44 35 bytes

-9 bytes graças a nwellnhof

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

Experimente online!

Explicação:

{                              }  # 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

2

J, 33 27 26 bytes

-7 graças a bubbler

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

Experimente online!

como

explicação original. minha última melhoria apenas altera a peça que encontra "o índice do primeiro elemento que já vimos". agora ele usa a "peneira nub" para fazer isso em menos bytes.

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

Observe que toda a frase final 1<:@i.~[:({:e.}:)\é dedicada a encontrar "o índice do primeiro elemento que já foi visto". Isso parece muito longo para conseguir isso, mas não pude jogar mais. Sugestões são bem-vindas.




Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.