Abgeflachter Spiralpermutationsindex


8

Kontext

Betrachten Sie quadratische Matrizen mit nSpalten und Zeilen, die die ersten n^2(dh nquadratischen) positiven ganzen Zahlen enthalten, wobei nungerade ist. Die Elemente der Matrizen sind so angeordnet, dass die 1durchgehenden Ganzzahlen n^2nacheinander in einer Spirale gegen den Uhrzeigersinn angeordnet sind, beginnend in der Mitte und anfänglich nach links bewegend. Nennen Sie diese MatrizenM(n)

Dafür n=1gibt es einfach die Ein-Element-Matrix M(1)=[[1]].

M(3) ist die Matrix

9 8 7
2 1 6
3 4 5

M(5) ist die Matrix

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

und M(7)ist die Matrix

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

Ziehen Sie nun in Betracht, diese Matrix zu einer Liste / einem Array zu reduzieren, indem Sie ihre Zeilen von oben nach unten verketten. Rufen Sie diese Listen auf L(n). L(3), L(5)Und L(7)sind im folgenden dargestellt, wobei ihre Elemente durch Zwischenräume getrennt.

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)

Wir können den Index i(n)von L(n)in einer lexikographisch sortierten Liste von Permutationen von finden L(n). In Jelly gibt das Œ¿Atom diesen Index für die Liste an, auf die es wirkt.

Herausforderung

Ihre Herausforderung besteht darin, eine positive ungerade Ganzzahl nals Eingabe und Ausgabe des Index zu verwenden i(n).

Die ersten Werte sind

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

Beachten Sie, dass i(n)~ = (n^2)!. Dies ist nicht auf OEIS.

Dies ist Code Golf pro Sprache, also erreichen Sie dies in möglichst wenigen Bytes.

Sandkastenpfosten .

Antworten:


3

Gelee , 21 19 Bytes

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

Probieren Sie es online aus!

Basierend auf der Methode aus einem J-Artikel über Voluten .

Erläuterung

-;,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 Bytes

-10 Bytes dank @miles!

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

Alt:

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

Beachten Sie, dass das Ergebnis 0-indiziert ist, also i(1) = 0undi(5) = 15511208759089364438087640

Erklärung (alt):

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

Das Herstellen der Spirale könnte schneller sein, aber die Ausrichtung würde durcheinander geraten.

Ich weiß nicht, wie J dies optimiert, aber 0.000414die Berechnung dauert nur Sekunden n=7(bei einer neuen J-Konsolensitzung).


Vielleicht macht J etwas Ähnliches wie ich Jelly dazu gebracht habe ( Code )?
Jonathan Allan

Ich habe Ihre Methode auf 39 Bytes golfen [:A.@,,.@*0&((,~(#\.+{:)@{.)@|:|.)~2*<:. Ich golfed auch eine Version des Verfahrens in dem Spiral Artikel bis 38 Bytes [:A.@/:_1+/\@|.(2#1+i.)#&}:+:$_1,],1,-.
Meilen


1

MATL , 16 15 14 Bytes

lYL!PletY@wXmf

Schlägt für Testfälle größer als 3 aufgrund von Gleitkomma-Ungenauigkeiten und Speicherbeschränkungen.

Probieren Sie es online aus!

Erläuterung

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

Hat MATL Einbauten für Spiralen?
Erik der Outgolfer

@EriktheOutgolfer Es kann ein
Luis Mendo

Erklärung hinzugefügt
Luis Mendo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.