Chỉ số hoán vị xoắn ốc phẳng


8

Bối cảnh

Xem xét các ma trận vuông với ncác cột và các hàng chứa các số nguyên dương đầu tiên n^2(tức là nbình phương), trong đó nlà số lẻ. Các phần tử của ma trận được sắp xếp sao cho các số nguyên 1đi qua n^2được đặt tuần tự theo hình xoắn ốc ngược chiều kim đồng hồ bắt đầu từ tâm và ban đầu di chuyển sang trái. Gọi các ma trận nàyM(n)

Đối với n=1điều này chỉ đơn giản là cung cấp cho ma trận một yếu tố M(1)=[[1]].

M(3) là ma trận

9 8 7
2 1 6
3 4 5

M(5) là ma trận

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

M(7)là ma trận

49 48 47 46 45 44 43
26 25 24 23 22 21 42
27 10  9  8  7 20 41
28 11  2  1  6 19 40
29 12  3  4  5 18 39
30 13 14 15 16 17 38
31 32 33 34 35 36 37

Bây giờ hãy xem xét làm phẳng ma trận này thành một danh sách / mảng bằng cách ghép các hàng của nó bắt đầu từ trên xuống và di chuyển xuống. Gọi những danh sách này L(n). L(3), L(5)L(7)được thể hiện dưới đây, với các yếu tố của họ giới hạn bởi không gian.

9 8 7 2 1 6 3 4 5     (n=3)
25 24 23 22 21 10 9 8 7 20 11 2 1 6 19 12 3 4 5 18 13 14 15 16 17    (n=5)  
49 48 47 46 45 44 43 26 25 24 23 22 21 42 27 10 9 8 7 20 41 28 11 2 1 6 19 40 29 12 3 4 5 18 39 30 13 14 15 16 17 38 31 32 33 34 35 36 37    (n=7)

Chúng ta có thể tìm thấy những chỉ số i(n)của L(n)trong một danh sách thứ tự từ điển được sắp xếp hoán vị của L(n). Trong Jelly, Œ¿nguyên tử đưa ra chỉ số này cho danh sách mà nó hoạt động.

Thử thách

Thách thức của bạn là lấy một số nguyên lẻ dương nlàm đầu vào và xuất chỉ mục i(n).

Một vài giá trị đầu tiên là

n  i(n)
-------
1  1
3  362299
5  15511208759089364438087641
7  608281864033718930841258106553056047013696596030153750700912081

Lưu ý rằng i(n)~ = (n^2)!. Đây không phải là trên OEIS.

Đây là mã golf cho mỗi ngôn ngữ, vì vậy hãy đạt được điều này trong vài byte nhất có thể.

Sandbox bài .

Câu trả lời:


3

Thạch , 21 19 byte

-;,N$ṁx"RFḣNṙ-+\ỤŒ¿

Hãy thử trực tuyến!

Dựa trên phương pháp từ một bài báo J trên volutes .

Giải trình

-;,N$ṁx"RFḣNṙ-+\ỤŒ¿  Main link. Input: integer n
-;                   Prepend -1. [-1, n]
  ,N$                Pair with its negated value. [[-1, n], [1, -n]]
     ṁ               Mold it to length n.
        R            Range. [1, 2, ..., n]
      x"             Vectorized copy each value that many times.
         F           Flatten
           N         Negate n
          ḣ          Head. Select all but the last n values.
            ṙ-       Rotate left by -1 (right by 1).
              +\     Cumulative sum.
                Ụ    Grade up.
                 Œ¿  Permutation index.

2

J, 48 38 byte

-10 byte nhờ @miles!

[:A.@/:_1+/\@|.(2#1+i.)#&}:+:$_1,],1,-

Cũ:

3 :'A.,(,~|.@(>:@i.@#+{:)@{.)@|:@|.^:(+:<:y),.1'

Lưu ý rằng kết quả là 0-index, vì vậy i(1) = 0i(5) = 15511208759089364438087640

Giải thích (cũ):

3 :'                                           ' | Explicit verb definition
                                            ,.1  | Make 1 into a 2d array
                                     (+:<:y)     | 4*n, where y = 2*n + 1
                                   ^:            | Repeat 4*n times
                              |:@|.              | Clockwise rotation
       (                    )@                   | Monadic Hook:
             (          )@{.                     | To the first row, apply...
                      {:                         | The last and largest item
                     +                           | Added to...
              >:@i.@#                            | The list 1, 2, ..., n; where n is the row length
          |.@                                    | Reverse
        ,~                                       | Append to the top of the array
      ,                                          | Ravel
    A.                                           | Permutation index

Làm cho hình xoắn ốc có thể nhanh hơn, nhưng định hướng sẽ bị rối tung.

Tôi không biết làm thế nào J tối ưu hóa điều này, nhưng chỉ mất 0.000414vài giây để tính toán n=7(trên phiên giao diện điều khiển J mới).


Có lẽ J làm điều gì đó tương tự như cách tôi tạo ra Jelly làm điều đó ( )?
Jonathan Allan

Tôi đánh gôn phương pháp của bạn tới 39 byte [:A.@,,.@*0&((,~(#\.+{:)@{.)@|:|.)~2*<:. Tôi cũng đã đánh golf một phiên bản của phương thức trong bài viết có giá trị tới 38 byte [:A.@/:_1+/\@|.(2#1+i.)#&}:+:$_1,],1,-.
dặm


1

MATL , 16 15 14 byte

lYL!PletY@wXmf

Thất bại cho các trường hợp thử nghiệm lớn hơn 3do cả hai điểm không chính xác và giới hạn bộ nhớ.

Hãy thử trực tuyến!

Giải trình

lYL    % Implicit input n. Spiral matrix of that side length
!P     % Transpose, flip vertically. This is needed to match the orientation
       % of columns in the spiral with that of rows in the challenge text
le     % Convert to a row, reading in column-major order (down, then across)
t      % Duplicate
Y@     % All permutations, arranged as rows of a matrix, in lexicographical
       % order
w      % Swap
Xm     % Row membership: gives a column vector containing true / false,
       % where true indicates that the corresponding row in the first input 
       % matches a row from the second output. In this case the second input
       % consists of a single row
f      % Find: gives indices of nonzeros. Implicit display

MATL có tích hợp sẵn cho hình xoắn ốc không?
Erik the Outgolfer 8/2/18

@EriktheOutgolfer Nó có thể có một
Luis Mendo

Đã giải thích thêm
Luis Mendo
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.