Chuỗi hoán vị xoắn ốc


17

Chúng ta có thể cuộn các số tự nhiên theo hình xoắn ốc hình chữ nhật:

 17--16--15--14--13
  |               |
 18   5---4---3  12
  |   |       |   |
 19   6   1---2  11
  |   |           |
 20   7---8---9--10
  |
 21--22--23--24--25

Nhưng bây giờ chúng ta có chúng trên một lưới hình chữ nhật, chúng ta có thể thư giãn xoắn ốc theo một thứ tự khác, ví dụ như đi theo chiều kim đồng hồ, bắt đầu từ phía bắc:

 17  16--15--14--13
  |   |           |
 18   5   4---3  12
  |   |   |   |   |
 19   6   1   2  11
  |   |       |   |
 20   7---8---9  10
  |               |
 21--22--23--24--25

Chuỗi kết quả rõ ràng là một hoán vị của các số tự nhiên:

1, 4, 3, 2, 9, 8, 7, 6, 5, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, 22, 21, 20, 19, 18, 17, ...

Nhiệm vụ của bạn là tính toán trình tự này. ( OEIS A020703 , nhưng cảnh báo spoiler: nó chứa một định nghĩa thú vị khác và một số công thức mà bạn có thể muốn tự mình tìm ra.)

Sự thật thú vị: tất cả 8 đơn hàng giải quyết có thể có mục OEIS của riêng họ.

Các thách thức

Cho một số nguyên dương n, trả về nphần tử thứ của dãy trên.

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à xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).

Luật tiêu chuẩn được áp dụng.

Các trường hợp thử nghiệm

1       1
2       4
3       3
4       2
5       9
6       8
7       7
8       6
9       5
100     82
111     111
633     669
1000    986
5000    4942
9802    10000
10000   9802

Để biết danh sách đầy đủ lên đến và bao gồm n = 11131 xem tệp b trên OEIS .

Câu trả lời:


6

Thạch, 11 10 byte

’ƽð²+ḷ‘Ḥ_

Một câu trả lời Jelly khác trên điện thoại của tôi.

’ƽð²+ḷ‘Ḥ_   A monadic hook:
’ƽ          Helper link. Input: n
’             n-1
 ƽ            Atop integer square root. Call this m.
   ð         Start a new dyadic link. Inputs: m, n
    ²+ḷ‘Ḥ_    Main link:
    ²+ḷ       Square m, add it to itself,
       ‘      and add one.
        Ḥ     Double the result
         _    and subtract n.

Hãy thử nó ở đây .


Bất cứ lời khuyên về việc bắt đầu với Jelly? Tôi không thể biết làm thế nào các dĩa / móc được phân tích cú pháp.
Lynn

Học APL hoặc J trước. Chuỗi thực sự dễ dàng hơn so với xe lửa vì tất cả các chức năng đều có tính cố định.
lirtosiast

Tôi hiểu rồi. Vâng, tôi có kinh nghiệm J. Tôi cho rằng tôi sẽ cố gắng đọc jelly.pyvà tìm ra chuỗi nào được hỗ trợ.
Lynn

2
Làm thế quái nào bạn gõ nó trên điện thoại của bạn!? Điều đó ấn tượng hơn bản thân mã!
DJMcMayhem

8

Japt, 20 19 16 byte

V=U¬c)²-V *2-U+2

Kiểm tra nó trực tuyến!

Dựa trên quan sát rằng

F (N) = trần (N ^ .5) * (trần (N ^ .5) -1) - N + 2

Hay nói đúng hơn là

F (N) = hình vuông đầu tiên lớn hơn hoặc bằng N, trừ căn bậc hai của nó, trừ N, cộng với 2.

Tôi không biết lời giải thích này có trên trang OEIS hay không, vì tôi chưa xem nó.


5

Julia, 28 byte

n->2((m=isqrt(n-1))^2+m+1)-n

Đây là hàm lambda chấp nhận một số nguyên và trả về một số nguyên. Để gọi nó, gán nó cho một biến.

Chúng tôi xác định m là lớn nhất nguyên như vậy mà m 2n -1, tức là số nguyên căn bậc hai của n -1 ( isqrt). Sau đó, chúng ta có thể đơn giản hóa biểu thức OEIS 2 ( m + 1) m - n + 2 xuống chỉ đơn giản là 2 ( m 2 + m + 1) - n .

Dùng thử trực tuyến


4

CJam, 14 byte

qi_(mQ7Ybb2*\-

Sử dụng phương pháp của Alex: 2*(m^2+m+1)-nở đâu m = isqrt(n-1).


2

ES7, 31 28 26 byte

n=>(m=--n**.5|0)*++m*2-~-n

Tôi đã độc lập khám phá ra công thức của Alex nhưng tôi không thể chứng minh được vì lúc đó tôi không ở gần máy tính.

Chỉnh sửa: Đã lưu 3 byte một phần nhờ @ETHproductions. Đã lưu thêm 2 byte.


n=>((m=--n**.5|0)+m*m)*2-n+1sẽ làm việc, tôi nghĩ.
Sản phẩm ETH

@ETHproductions Cảm ơn, tôi đã tự hỏi làm thế nào để có được điều đó --ntrong đó ...
Neil

@ETHproductions Heh, tôi quản lý để cạo 2 byte từ câu trả lời của bạn.
Neil


1

MATL , 16 13 byte

qX^Y[tQ*Q2*G-

Dựa trên câu trả lời của CJam của Lynn .

Hãy thử trực tuyến! (Y[đã được thay thế bởiktheo những thay đổi trong ngôn ngữ)

q       % input n. Subtract 1
X^      % square root
Y[      % floor
tQ      % duplicate and add 1
*       % multiply
Q       % add 1
2*      % multiply by 2
G-      % subtract n

Điều này sử dụng một cách tiếp cận khác với các câu trả lời khác ( 16 byte ):

6Y3iQG2\+YLt!G=)

Nó rõ ràng tạo ra hai ma trận xoắn ốc (thực tế, các phiên bản lật theo chiều dọc của chúng, nhưng điều đó không ảnh hưởng đến đầu ra). Điều thứ nhất là

17    16    15    14    13
18     5     4     3    12
19     6     1     2    11
20     7     8     9    10
21    22    23    24    25

và cái thứ hai theo dõi đường dẫn đã sửa đổi:

25    10    11    12    13
24     9     2     3    14
23     8     1     4    15
22     7     6     5    16
21    20    19    18    17

Để tìm nsố thứ tự của dãy, nó đủ để tìm ntrong ma trận thứ hai và chọn số tương ứng trong số thứ nhất. Các ma trận cần phải đủ lớn để nxuất hiện và nên có kích thước lẻ để gốc (số 1) ở cùng một vị trí trong cả hai.

Hãy thử trực tuyến quá! (6Y3đã được di chuyển theo những thay đổi trong ngôn ngữ)

6Y3      % 'spiral' string
i        % input n
QG2\+    % round up to an odd number large enough
YL       % generate spiral matrix of that size: first matrix
t!       % duplicate and transpose: second matrix
G=       % logical index that locates n in the second matrix
)        % use that index into first matrix

0

Brachylog , 20 byte

-1$r$[I*I+I+1=*2-?=.

Điều này sử dụng kỹ thuật tương tự như khá nhiều câu trả lời khác.

Giải trình

-1                   § Build the expression Input - 1
  $r                 § Square root of Input - 1
    $[I              § Unify I with the floor of this square root
       *I+I+1        § Build the expression I * I + I + 1
             =*2-?   § Evaluate the previous expression (say, M) and build the expression
                     § M * 2 - Input
                  =. § Unify the output with the evaluation of M * 2 - Input

Một sự thật thú vị về câu trả lời này là nó dễ sử dụng và ngắn =hơn là dấu ngoặc đơn.

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.