ลำดับการสลับ


11

Intro

ลำดับการสลับถูกกำหนดดังนี้:

เริ่มต้นด้วยnคนที่ยืนเป็นวงกลม ( 6สำหรับตัวอย่างนี้)

 1  2
6    3
 5  4

เริ่มต้นจากบุคคล1บุคคลที่อยู่ทางด้านซ้ายของบุคคล "ที่เลือก" จะถูกลบออก

 1
6    3
 5  4

บุคคลที่ถูกลบสามารถ "เปลี่ยน" วิธีการกำจัดได้:

  • หากบุคคลที่ถูกลบออกเป็นเลขคู่ (ซึ่งเป็นในกรณีนี้) บุคคลที่ถูกลบออกคนถัดไปจะอยู่ทางขวาของบุคคล "ที่ถูกเลือก" ถัดไป
  • หากบุคคลที่ถูกลบออกเป็นเลขคี่บุคคลที่ถูกลบออกคนถัดไปจะอยู่ทางซ้ายของบุคคล "ที่เลือก" ถัดไป

บุคคลที่ถูกเลือกถัดไปจะขึ้นอยู่กับบุคคลที่ถูกลบไปก่อนหน้านี้ด้วย

  • หากบุคคลที่ถูกลบออกเป็นเลขคู่บุคคลที่ถูกเลือกถัดไปจะอยู่ทางขวาของบุคคลที่เลือกก่อนหน้า
  • หากบุคคลที่ถูกลบออกเป็นเลขคี่ให้ดูด้านบน แต่แทนที่ "ขวา" ด้วย "ซ้าย"

6ดังนั้นบุคคลที่ได้รับการแต่งตั้งต่อไปคือแล้ว

ตอนนี้เราลบบุคคลไปทางขวาของ6ซึ่งก็คือ5:

 1
6    3
    4

เพราะ5แปลกแล้วบุคคลที่ถูกลบจะอยู่ทางซ้าย 1บุคคลที่ได้รับการแต่งตั้งใหม่คือ

ตอนนี้เราลบ3:

 1
6
    4

เรายังคงกระบวนการนี้จนกว่าเราจะเหลือ 1 หมายเลข - 1ในตัวอย่างนี้จำนวนสุดท้ายคือ S(6) = 1ดังนั้นจึง

ตัวเลขสองสามตัวแรกคือ:

 n | S(n)
---------
 1 | 1
 2 | 1
 3 | 3
 4 | 1
 5 | 5
 6 | 1
 7 | 3
 8 | 6
 9 | 5
10 | 6
11 | 9

งาน

งานของคุณคือการสร้างโปรแกรม (หรือฟังก์ชั่น) ที่ส่งคืนS(n)( nหมายเลข th ในลำดับการสลับ) เมื่อได้รับnโดยใช้จำนวนไบต์น้อยที่สุด

ตัวอย่างอินพุตและเอาต์พุต:

1  -> 1
10 -> 6
13 -> 13

คุณรับประกันว่าจะได้รับจำนวนเต็มบวก

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

หมายเหตุ: ไม่มีลำดับ OEIS (อะไร?) เพื่อช่วยคุณในการค้นหาปัญหา


7
ไม่มีการเข้าชม oeis เพื่อบันทึกการค้นหาของผู้คน
xnor

เห็นได้ชัดว่า2ไม่เคยอยู่ แต่จะทำ7อย่างไร
Jonathan Allan

1
@JanathanAllan ฉันเพิ่งตรวจสอบ 1,000 คำแรกและผลลัพธ์คือ "ไม่" ในขณะนี้ ฉันไม่แน่ใจว่า - ฉันควรวางสิ่งนั้นเป็น "ความท้าทายด้าน" ที่ผู้คนสามารถพยายามพิสูจน์หรืออะไรบางอย่าง? มันเป็นคะแนนบราวนี่ดังนั้นมันจึงไม่เบี่ยงเบนความท้าทาย
clismique

อาจจะเห็นได้ชัดเมื่อมีคนมาพร้อมกับวิธีการอื่นนอกเหนือจากการทำตามคำแนะนำของคุณ ...
Jonathan Allan

3
คุณคาดหวังให้ผู้คนแก้ไขปัญหานี้โดยไม่ใช้ OEIS อย่างไร มีคนผลัก OEIS ไหม
Erik the Outgolfer

คำตอบ:


4

Python 2, 183 94 ไบต์

-4 ไบต์ขอบคุณ Artyer (ใช้input()และprintมากกว่าdefและreturn)
-1 ไบต์ขอบคุณ FlipTack (ใช้print-~p[0]แทนprint p[0]+1)

p=range(input())
d=i=1
while p[1:]:m=p.pop(i)%2;i-=m+m-(d<0);d=-m|1;i+=d;i%=len(p)
print-~p[0]

repl.it

นี่เพิ่งทำตามคำแนะนำที่ให้มาฉันสังเกตเห็นรูปแบบบางอย่างแล้ว

การเปลี่ยนแปลงเพียงอย่างเดียวคือ:

  • เพื่อใช้การ0จัดทำดัชนีตาม (ดังนั้นแม้กระทั่งคนแปลกและในทางกลับกัน) - นี่คือบันทึก 5 ไบต์ในตรรกะ golfed และได้รับการแก้ไขในตอนท้ายด้วย+1
  • ใช้1เป็นซ้ายและ-1ขวา (ใช้ช่วง - เหมือนทุกคนหันออกไปข้างนอกแทน)
  • เพื่อเปลี่ยนลอจิกของขั้นตอนที่พบบุคคลที่ถูกเลือกถัดไปเพื่อพิจารณาpopไอเอ็นจีจากรายการที่ทำดัชนี "ตัวชี้" แล้วขั้นตอนที่หนึ่งไปทางขวาในรายการ (หรือทางซ้ายในคำศัพท์ดั้งเดิม)

Ungolfed:

def circle(n):
    people = range(n) # p
    direction = 1 # d
    removeIndex = 1 # i
    while n > 1:
        removingMod2 = people.pop(removeIndex) % 2 # m
        removeIndex -= removingMod2 + removingMod2 - (direction == -1)
        direction = -removingMod2 or 1
        removeIndex += direction
        n -= 1
        removeIndex %= n
    return people[0] + 1

บรรทัดสุดท้ายสามารถเป็นได้print-~p[0]หรือไม่
FlipTack

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