จำนวนการแปลงจนกระทั่งทำซ้ำ


12

ให้ลำดับของจำนวนเต็มหรือเฉพาะเจาะจงมากขึ้นการเปลี่ยนแปลงของ0..N ลำดับนี้ดังนี้

  • เอาท์พุท [x] = ย้อนกลับ (อินพุต [อินพุต [x]])
  • ทำซ้ำ

ตัวอย่างเช่น: [2,1,0]กลายเป็นและที่ตรงกันข้ามคือ[0,1,2] กลายเป็นและย้อนกลับ[2,1,0][0,2,1][0,1,2][2,1,0]

ตัวอย่างที่ 1

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

ตัวอย่างที่ 2

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

ตัวอย่างที่ 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

ตัวอย่างที่ 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

งานของคุณคือการกำหนดฟังก์ชั่น (หรือโปรแกรม) ที่ใช้การเรียงสับเปลี่ยนของจำนวนเต็ม0..Nและส่งกลับ (หรือเอาท์พุท) จำนวนขั้นตอนจนกระทั่งการเปลี่ยนแปลงเกิดขึ้นที่เกิดขึ้นแล้ว ถ้าXแปรรูปXแล้วส่งออกควรจะเป็นศูนย์ถ้าXแปลงไปYและYไปX(หรือY) แล้วออกที่ควรจะเป็น 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

หากภาษาของคุณไม่รองรับ "ฟังก์ชั่น" คุณอาจสันนิษฐานได้ว่าลำดับนั้นถูกกำหนดให้เป็นรายการแบบแยกช่องว่างของจำนวนเต็มเช่น0 1 2หรือ3 1 0 2ในบรรทัดเดียว

ข้อเท็จจริงสนุก:

  • ลำดับ 0,1,2,3, .. , N จะเปลี่ยนเป็น N, ... , 3,2,1,0 เสมอ
  • ลำดับ N, .. , 3,2,1,0 จะเปลี่ยนเป็น N, .. , 3,2,1,0 เสมอ
  • ลำดับ 0,1,3,2, ... , N + 1, N จะเปลี่ยนเป็น N, ... , 3,2,1,0 เสมอ

งานโบนัส : คิดสูตรทางคณิตศาสตร์

กฎทางเลือก :

  • หากดัชนีแรกของภาษาของคุณคือ 1 แทนที่จะเป็น 0 คุณสามารถใช้วิธีเรียงสับเปลี่ยน1..N(คุณสามารถเพิ่มหนึ่งลงในจำนวนเต็มทุกตัวอย่างและตัวอย่าง)

ฉันต้องการเพิ่มเติมเช่น "สูตรปิด" เช่น $ f (a_ {0}, a_ {1}, a _ {... }} = a_ {0} ^ a_ {1} + ... $ โดยที่ $ a_ { i} $ เป็น i-TH องค์ประกอบในลำดับที่กำหนด.
MrOman

คุณแน่ใจหรือไม่ว่า "สูตรปิด" มีอยู่จริง?
ทอดด์ซีเวลล์

" return (หรือ outputs) จำนวนขั้นตอนจนกระทั่งเกิดการเปลี่ยนแปลงที่เกิดขึ้นแล้ว " สิ่งนี้ไม่สอดคล้องกับทุกสิ่งที่ตามมา สำหรับการเริ่มต้นมันทำให้ค่าตอบแทนเป็น 0 เป็นไปไม่ได้ ...
Peter Taylor

ตัวอย่างที่ 3 ถูกต้องไหม ฉันเห็น3,0,1,2ควรเปลี่ยนเป็น2,3,0,1
FireCubez

มันคือจำนวนการแปลงสภาพก่อนการทำซ้ำ
mroman

คำตอบ:


4

JavaScript (ES6), 54 ไบต์

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

ลองออนไลน์!


สิ่งที่ไม่[]ทำในฟังก์ชั่นหรือไม่?
mroman

ฟังก์ชั่นเป็นวัตถุ ดังนั้นสามารถใช้เพื่อเข้าถึงสถานที่ให้บริการg[a] a
Arnauld

ฉันเห็นแล้ว คุณกำลังใช้gเพื่อจัดเก็บรัฐมา
mroman


3

Pyth, 10 9 8 ไบต์

tl.u@LN_

คำอธิบาย:

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.

ชุดทดสอบ


3

Haskell, 52 ไบต์

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

ลองออนไลน์!

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 ไบต์

-9 ไบต์ขอบคุณ nwellnhof

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

ลองออนไลน์!

คำอธิบาย:

{                              }  # 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 ไบต์

-7 ขอบคุณ bubbler

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

ลองออนไลน์!

อย่างไร

คำอธิบายเดิม การปรับปรุงครั้งล่าสุดของฉันเปลี่ยนเฉพาะส่วนที่พบว่า "ดัชนีขององค์ประกอบแรกที่เราเคยเห็น" ตอนนี้ใช้ "nub sieve" เพื่อทำในไบต์ที่น้อยลง

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

หมายเหตุวลีสุดท้ายทั้งหมด1<:@i.~[:({:e.}:)\นั้นใช้เพื่อค้นหา "ดัชนีขององค์ประกอบแรกที่มีอยู่แล้ว" ดูเหมือนว่าจะได้รับมานานมาก แต่ฉันก็ไม่สามารถตีมันได้มากกว่านี้ ยินดีต้อนรับข้อเสนอแนะ



1

Dyalog APL, 29 28 27 ไบต์

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

ใช้อาร์เรย์แบบบรรจุกล่อง จะฝึกอบรมและอธิบายในภายหลัง

ลองมันนี่เป็นชุดทดสอบ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.