Các số Shotgun là một chuỗi với định nghĩa khá đơn giản nhưng một số cấu trúc thú vị. Bắt đầu với các số tự nhiên:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
Bây giờ lấy tất cả các số tại các chỉ số chia hết cho 2 , nhóm chúng thành các cặp và hoán đổi các số trong mỗi cặp:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
^ ^ ^ ^ ^ ^ ^
<---> <---> <-----> <----
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
Bây giờ làm tương tự với các chỉ số chia hết cho 3 :
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
^ ^ ^ ^
<------> <--------->
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
Và sau đó cho 4 , 5 , 6 , v.v.
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
1, 4, 8, 6, 5, 3, 7, 2, 10, 12, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 3, 7, 2, 10, 5, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 14, 7, 2, 10, 5, 11, 3, 13, 16, ...
...
Sau k bước như vậy, các số k + 1 đầu tiên sẽ được cố định. Vì vậy, chúng ta có thể định nghĩa chuỗi vô hạn của số Shotgun là giới hạn cho phép k đi đến vô cùng. 66 số đầu tiên là:
1, 4, 8, 6, 12, 14, 16, 9, 18, 20, 24, 26, 28, 22, 39, 15, 36, 35, 40, 38, 57, 34, 48, 49, 51, 44,
46, 33, 60, 77, 64, 32, 75, 56, 81, 68, 76, 58, 100, 55, 84, 111, 88, 62, 125, 70, 96, 91, 98, 95,
134, 72, 108, 82, 141, 80, 140, 92, 120, 156, 124, 94, 121, 52, 152, 145, ...
Sự thật thú vị: Mặc dù có được chỉ bằng cách hoán vị các số tự nhiên, chuỗi này không chứa bất kỳ số nguyên tố nào.
Các thách thức
Cho một số nguyên n > 0
, tìm n
số Shotgun thứ. Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và trả lại đầu ra hoặc in ra STDOUT (hoặc thay thế gần nhất).
Đây là mã golf, vì vậy bài nộp ngắn nhất (tính bằng byte) sẽ thắng.
Bảng xếp hạng
Điều này nhận được nhiều câu trả lời hơn tôi nghĩ, cũng như một số người cạnh tranh trong cùng một ngôn ngữ. Vì vậy, đây là một Snippet Stack để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.
Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:
# Language Name, N bytes
nơi N
là kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:
# Ruby, <s>104</s> <s>101</s> 96 bytes
10
, 21
, 25
và 30
không xuất hiện một trong hai, ví dụ.
k
lần lặp thứ, k
phần tử thứ trong mảng được chuyển sang 2k
vị trí thứ và sẽ không được chạm lại cho đến khi 2k
lặp lại, tại thời điểm đó, nó được chuyển sang 4k
vị trí thứ, ad infinitum. Một nguyên tố không được chuyển đổi cho đến khi đến lượt của nó, có thể nói, vì vậy tất cả các số nguyên tố được xáo trộn về phía trước. Nhưng chúng ta có thể dễ dàng lập danh sách các nạn nhân vô tội chỉ bằng cách in ra phần tử đầu tiên được hoán vị ở lần lặp 2 và mỗi lần lặp lẻ. Danh sách đi: 2, 3, 5, 7, 10, 11, 13, 21, 17, 19, 30, 23, 27, 25, 29, 31, 45, 42, 37, 54, 41, 43, 65, ...