Anahtarlama Sırası


11

giriş

Anahtarlama sırası şu şekilde tanımlanır:

nBir daire içinde duran insanlarla başlayın ( 6bu örnek için).

 1  2
6    3
 5  4

Kişiden başlayarak 1"seçilen" kişinin solundaki kişi kaldırılır.

 1
6    3
 5  4

Kaldırılan kişi kaldırma yöntemini "değiştirebilir":

  • Kaldırılan kişi eşitse (bu durumda), kaldırılan bir sonraki kişi bir sonraki "seçilen" kişinin sağında olacaktır.
  • Kaldırılan kişi tuhafsa, bir sonraki kaldırılan kişi bir sonraki "seçilen" kişinin solunda olur.

Bir sonraki seçilen kişi daha önce kaldırılan kişiye de bağlıdır.

  • Kaldırılan kişi eşitse, bir sonraki seçilen kişi önceki seçilen kişinin sağında olacaktır.
  • Kaldırılan kişi tuhafsa, yukarıya bakın, ancak "sağ" ı "sol" ile değiştirin.

Öyleyse bir sonraki seçilen kişi 6.

Şimdi sağdaki kişiyi kaldırıyoruz 6, yani 5:

 1
6    3
    4

Çünkü 5garip, kaldırılan kişi artık solda. Yeni seçilen kişi 1.

Şimdi kaldırıyoruz 3:

 1
6
    4

Bu işleme 1 numara bırakılıncaya kadar devam ediyoruz - bu örnekte son sayı 1. Bu nedenle S(6) = 1.

İlk birkaç sayı:

 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

Görev

Göreviniz, verildiğinde S(n)( nAnahtarlama sırasındaki inci sayısı) nen az bayt kullanarak dönen bir program (veya işlev) yapmaktır .

Örnek giriş ve çıkışlar:

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

Pozitif bir tamsayı almanız garanti edilir.

Bu , bayt en kısa kod kazanır!

Not: Arama sorununu ortadan kaldıracak OEIS dizisi (ne?) Yoktur.


7
Oeis isabet yok, insanları arama kurtarmak için.
— xnor

Açıkçası 2asla kalmıyor, ama öyle 7mi?
— Jonathan Allan

1
@JonathanAllan İlk 1000 terimi kontrol ettim ve sonuç şu anda "hayır" dır. Yine de emin değilim - bunu insanların kanıtlamaya çalışabileceği bir “yan zorluk” olarak mı koymalıyım? Brownie noktaları için, bu yüzden meydan okumayı azaltmıyor.
— clismique

Belki birileri talimatlarınızı takip etmekten başka bir yöntem bulduktan sonra açık olacaktır ...
— Jonathan Allan

3
İnsanların bunu OEIS olmadan çözmesini nasıl beklersiniz? Birisi OEIS'i itiyor, lütfen?
— Outgolfer Erik

Yanıtlar:


4

Python 2, 183 94 bayt

-4 Artyer sayesinde bayt (kullanımı input()ve printyerine defve return)
-1 bayt sayesinde FlipTack için (kullanımı print-~p[0]yerine 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

Bu sadece verilen talimatları takip ediyor, bazı desenleri fark ettim, belki de istismar edilebilir mi?

Tek değişiklikler:

  • 0tabanlı indeksleme kullanmak (böylece insanlar tek ve tam tersi) - bu, golf edilmiş mantığa 5 bayt kazandırır ve sonunda+1
  • kullanımına 1bıraktı ve -1hak olarak (- Herkes yerine dışa karşı karşıya gibi bir dizi kullanmak için)
  • pop"işaretçi" indeksini listede listede sağdan (veya orijinal terminolojide solda) yapan bir sonraki seçilen bireyin hesaba katıldığı tespit edilen adımın mantığını değiştirmek için .

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

Son satır olabilir print-~p[0]mi?
— FlipTack

Neden evet!
— Jonathan Allan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.