Trình tự chuyển đổi


11

Giới thiệu

Trình tự chuyển đổi được định nghĩa như vậy:

Bắt đầu với nnhững người đứng trong một vòng tròn ( 6ví dụ này).

 1  2
6    3
 5  4

Bắt đầu từ người 1, người ở bên trái của người "được chọn" sẽ bị xóa.

 1
6    3
 5  4

Người bị loại bỏ có thể "chuyển" phương thức loại bỏ lên:

  • Nếu người bị loại bỏ là số chẵn (trong trường hợp này), người bị xóa tiếp theo sẽ ở bên phải của người "được chọn" tiếp theo.
  • Nếu người bị xóa là số lẻ, người bị xóa tiếp theo sẽ ở bên trái của người "được chọn" tiếp theo.

Người được chọn tiếp theo cũng phụ thuộc vào người bị loại bỏ trước đó.

  • Nếu người bị loại là chẵn, người được chọn tiếp theo sẽ ở bên phải của người được chọn trước đó.
  • Nếu người bị xóa là số lẻ, xem bên trên, nhưng thay thế "bên phải" bằng "bên trái".

Vì vậy, người được chọn tiếp theo là sau đó 6.

Bây giờ chúng tôi loại bỏ người ở bên phải 6, đó là 5:

 1
6    3
    4

Bởi vì 5là số lẻ, người bị loại bỏ bây giờ ở bên trái. Người mới được chọn là 1.

Bây giờ chúng tôi xóa 3:

 1
6
    4

Chúng tôi tiếp tục quá trình này, cho đến khi chúng tôi còn lại 1 số - trong ví dụ này, số cuối cùng là 1. Vì vậy, do đó S(6) = 1.

Một vài số đầu tiên là:

 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

Bài tập

Nhiệm vụ của bạn là tạo ra một chương trình (hoặc một hàm) trả về S(n)( nsố thứ trong chuỗi Chuyển đổi) khi được cung cấp n, sử dụng lượng byte ít nhất.

Ví dụ đầu vào và đầu ra:

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

Bạn được đảm bảo để có được một số nguyên dương.

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Lưu ý: Không có trình tự OEIS (cái gì?), Để giúp bạn tránh những rắc rối khi tìm kiếm.


7
Không có lượt truy cập vào oeis, để cứu mọi người tìm kiếm.
xnor

Rõ ràng 2không bao giờ vẫn còn, nhưng không 7?
Jonathan Allan

1
@Jonathan ALLan Tôi mới kiểm tra 1000 thuật ngữ đầu tiên và kết quả hiện tại là "không". Mặc dù vậy, tôi không chắc chắn - tôi có nên coi đó là một "thử thách phụ" mà mọi người có thể cố gắng chứng minh hay không? Đó là điểm brownie, vì vậy nó không làm mất đi thách thức.
clismique

Có lẽ sẽ rõ ràng một khi ai đó nghĩ ra một phương pháp khác hơn là làm theo hướng dẫn của bạn ...
Jonathan Allan

3
Làm thế nào để bạn mong đợi mọi người giải quyết điều này mà không có OEIS? Ai đó đẩy OEIS, làm ơn?
Erik the Outgolfer

Câu trả lời:


4

Python 2, 183 94 byte

-4 byte nhờ Artyer (sử dụng input()printhơn defreturn)
-1 byte nhờ FlipTack (sử dụng print-~p[0]hơn 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]

thay thế

Điều này chỉ cần làm theo các hướng dẫn được đưa ra, tôi đã nhận thấy một số mô hình, có thể nó có thể được khai thác?

Những thay đổi duy nhất là:

  • để sử dụng 0lập chỉ mục dựa trên (vì vậy ngay cả mọi người là số lẻ và ngược lại) - điều này giúp tiết kiệm 5 byte trong logic đánh gôn và được sửa ở cuối với+1
  • để sử dụng 1như bên trái và -1bên phải (để sử dụng một phạm vi - thay vào đó, giống như mọi người đều hướng ra ngoài)
  • để thay đổi logic của bước mà cá nhân được chọn tiếp theo được tìm thấy để tính poptừ ing trong danh sách làm cho chỉ mục "con trỏ" đã bước một sang phải trong danh sách (hoặc bên trái theo thuật ngữ gốc).

Ung dung:

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

Dòng cuối cùng có thể được print-~p[0]?
FlipTack

Tại sao có nó có thể!
Jonathan Allan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.