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.