Anzahl der Transformationen bis zur Wiederholung


12

Bei einer gegebenen Folge von ganzen Zahlen oder genauer gesagt einer Permutation der 0..N Transformation lautet diese Folge wie folgt:

  • ausgang [x] = rückwärts (eingang [eingang [x]])
  • wiederholen

Zum Beispiel: [2,1,0]wird [0,1,2]und umgekehrt ist [2,1,0]. [0,2,1]wird [0,1,2]und umgekehrt [2,1,0].

Beispiel 1

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

Beispiel 2

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

Beispiel 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

Beispiel 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

Ihre Aufgabe ist es, eine Funktion (oder ein Programm) zu definieren, die eine Permutation von ganzen Zahlen verwendet 0..Nund die Anzahl der Schritte zurückgibt (oder ausgibt), bis eine bereits aufgetretene Permutation auftritt. Wenn zu Xtransformiert wird, sollte Xdie Ausgabe Null sein. Wenn Xzu Yund Yzu X(oder Y) transformiert wird, sollte die Ausgabe 1 sein.

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

Testfälle:

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

Wenn Ihre Sprache keine "Funktionen" unterstützt, können Sie davon ausgehen, dass die Sequenz als durch Leerzeichen getrennte Liste von Ganzzahlen wie 0 1 2oder 3 1 0 2in einer einzelnen Zeile angegeben wird.

Wissenswertes:

  • Die Folge 0,1,2,3, .., N wird immer in N, ..., 3,2,1,0 transformiert
  • Die Folge N, .., 3,2,1,0 wird immer in N, .., 3,2,1,0 transformiert
  • Die Folge 0,1,3,2, ..., N + 1, N wird immer zu N, ..., 3,2,1,0 transformiert

Bonusaufgabe : Finde eine mathematische Formel heraus.

Optionale Regeln :

  • Wenn der erste Index Ihrer Sprache 1 anstelle von 0 ist, können Sie Permutationen verwenden 1..N(Sie können jeder Ganzzahl im Beispiel und in den Testfällen einfach eine hinzufügen).

Ich meinte eher eine "geschlossene Formel" wie $ f (a_ {0}, a_ {1}, a _ {...}} = a_ {0} ^ a_ {1} + ... $ wobei $ a_ { i} $ ist das i-te Element in der angegebenen Sequenz.
mroman

Sind Sie sicher, dass eine solche "geschlossene Formel" existiert?
Todd Sewell

" Gibt die Anzahl der Schritte zurück (oder gibt sie aus), bis eine Permutation auftritt, die bereits stattgefunden hat. " Dies widerspricht nahezu allem, was darauf folgt. Erstens macht es einen Rückgabewert von 0 unmöglich ...
Peter Taylor

Ist das 3. Beispiel korrekt? Ich sehe, 3,0,1,2sollte sich zu2,3,0,1
FireCubez

Es ist die Anzahl der Transformationen vor einer Wiederholung.
mroman

Antworten:


4

JavaScript (ES6), 54 Byte

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

Probieren Sie es online!


Was macht []man mit einer Funktion?
mroman

Eine Funktion ist ein Objekt. So g[a]kann darauf zugegriffen werden, um auf das Grundstück zuzugreifen a.
Arnauld

Ah ich sehe. Sie verwenden g, um den Zustand in zu speichern.
mroman


3

Pyth, 10 9 8 Bytes

tl.u@LN_

Erläuterung:

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.

Testsuite .


3

Haskell, 52 Bytes

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

Probieren Sie es 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 dank nwellnhof

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

Probieren Sie es online!

Erläuterung:

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

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

Probieren Sie es online!

Wie

ursprüngliche Erklärung. Meine letzte Verbesserung ändert nur das Stück, das "den Index des ersten Elements findet, das wir bereits gesehen haben". es verwendet jetzt das "Nubsieb", um dies in weniger Bytes zu tun.

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

Beachten Sie, dass der gesamte letzte Satz 1<:@i.~[:({:e.}:)\dem Auffinden "des Index des ersten Elements, das bereits gesehen wurde" gewidmet ist. Das scheint furchtbar lange zu dauern, aber ich konnte nicht mehr Golf spielen. Vorschläge sind willkommen.




Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.