Urutan Switching

11

Intro

Urutan Switching didefinisikan seperti ini:

Mulailah dengan norang - orang yang berdiri dalam lingkaran ( 6untuk contoh ini).

 1  2
6    3
 5  4

Mulai dari orang 1, orang yang ada di sebelah kiri orang yang "dipilih" dihapus.

 1
6    3
 5  4

Orang yang dihapus dapat "mengalihkan" metode penghapusan ke atas:

  • Jika orang yang dilepas itu genap (dalam kasus ini), orang yang dipindahkan berikutnya akan berada di sebelah kanan orang "terpilih" berikutnya.
  • Jika orang yang dipindahkan itu aneh, orang yang dihapus berikutnya akan berada di sebelah kiri orang "terpilih" berikutnya.

Orang yang dipilih berikutnya juga tergantung pada orang yang sebelumnya dihapus.

  • Jika orang yang dilepas itu genap, orang yang dipilih berikutnya akan berada di sebelah kanan orang yang dipilih sebelumnya.
  • Jika orang yang dipindahkan itu aneh, lihat di atas, tetapi ganti "kanan" dengan "kiri".

Jadi orang yang dipilih selanjutnya adalah 6.

Sekarang kami menghapus orang di sebelah kanan 6, yaitu 5:

 1
6    3
    4

Karena 5aneh, orang yang dipindahkan sekarang ke kiri. Orang yang baru terpilih adalah 1.

Kami sekarang menghapus 3:

 1
6
    4

Kami melanjutkan proses ini, hingga tersisa 1 angka - dalam contoh ini, angka terakhirnya adalah 1. Oleh karena itu S(6) = 1.

Beberapa angka pertama adalah:

 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

Tugas

Tugas Anda adalah membuat program (atau fungsi) yang mengembalikan S(n)( nnomor th dalam urutan Switching) saat diberikan n, menggunakan jumlah byte terkecil.

Contoh input dan output:

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

Anda dijamin mendapatkan bilangan bulat positif.

Ini adalah , jadi kode terpendek dalam byte menang!

Catatan: Tidak ada urutan OEIS (apa?), Untuk menyelamatkan Anda dari kesulitan mencari.

clismique
sumber
7
Tidak ada hit di oeis, untuk menyelamatkan pencarian orang.
xnor
Jelas 2tidak pernah ada, tetapi tidak 7?
Jonathan Allan
1
@ Jonathan Allan Saya baru saja memeriksa 1000 syarat pertama, dan hasilnya saat ini "tidak". Namun saya tidak yakin - haruskah saya menganggap itu sebagai "tantangan sampingan" yang bisa dibuktikan oleh orang atau sesuatu? Ini untuk poin brownies, jadi tidak mengurangi tantangan.
clismique
Mungkin itu akan menjadi jelas ketika seseorang datang dengan metode selain dengan mengikuti instruksi Anda ...
Jonathan Allan
3
Bagaimana Anda mengharapkan orang memecahkan ini tanpa OEIS? Tolong, seseorang mendorong OEIS?
Erik the Outgolfer

Jawaban:

4

Python 2, 183 94 byte

-4 byte terima kasih kepada Artyer (gunakan input()dan printbukannya defdan return)
-1 byte berkat FlipTack (gunakan print-~p[0]bukan 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

Ini hanya mengikuti instruksi yang diberikan, saya perhatikan beberapa pola, mungkin bisa dieksploitasi?

Satu-satunya perubahan adalah:

  • untuk menggunakan 0pengindeksan berbasis (bahkan orang-orang aneh dan sebaliknya) - ini menghemat 5 byte dalam logika golf dan diperbaiki pada akhirnya dengan+1
  • untuk digunakan 1sebagai kiri dan -1kanan (untuk menggunakan rentang - sama seperti semua orang menghadap ke luar sebagai gantinya)
  • untuk mengubah logika langkah di mana individu yang dipilih berikutnya ditemukan untuk memperhitungkan popdari membuat indeks "penunjuk" sudah langkah satu ke kanan dalam daftar (atau ke kiri dalam terminologi asli).

Tidak Disatukan:

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
Jonathan Allan
sumber
Bisakah baris terakhir print-~p[0]?
FlipTack
Kenapa ya bisa!
Jonathan Allan