Índice de permutación en espiral aplanado


8

Contexto

Considere las matrices cuadradas con ncolumnas y filas que contienen los primeros enteros positivos n^2(es decir, al ncuadrado), donde nes impar. Los elementos de las matrices están dispuestas de tal manera que los números enteros 1a través n^2son colocados secuencialmente en una espiral hacia la izquierda comenzando en el centro y moviendo inicialmente a la izquierda. Llama a estas matricesM(n)

Para n=1esto simplemente da la matriz de un elemento M(1)=[[1]].

M(3) es la matriz

9 8 7
2 1 6
3 4 5

M(5) es la matriz

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

y M(7)es la matriz

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

Ahora considere aplanar esta matriz en una lista / matriz concatenando sus filas comenzando desde la parte superior y bajando. Llama a estas listas L(n). L(3), L(5)y L(7)se representan a continuación, con sus elementos delimitados por espacios.

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)

Podemos encontrar el índice i(n)de L(n)en una lista ordenada lexicográficamente de permutaciones de L(n). En Jelly, el Œ¿átomo da este índice para la lista en la que actúa.

Desafío

Su desafío es tomar un entero impar positivo ncomo entrada y salida del índice i(n).

Los primeros pocos valores son

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

Tenga en cuenta que i(n)~ = (n^2)!. Esto no está en OEIS.

Este es el código de golf por idioma, así que consiga esto en la menor cantidad de bytes posible.

Puesto de sandbox .

Respuestas:


3

Jalea , 21 19 bytes

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

Pruébalo en línea!

Basado en el método de un artículo J sobre volutas .

Explicación

-;,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 gracias a @miles!

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

Antiguo:

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

Tenga en cuenta que el resultado está indexado a 0, así que i(1) = 0yi(5) = 15511208759089364438087640

Explicación (antigua):

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

Hacer la espiral podría ser más rápido, pero la orientación se estropearía.

No sé cómo J está optimizando esto, pero solo toma unos 0.000414segundos calcularlo n=7(en una nueva sesión de consola J).


¿Quizás J hace algo similar a cómo hice que Jelly lo hiciera ( código )?
Jonathan Allan

Golfé tu método a 39 bytes [:A.@,,.@*0&((,~(#\.+{:)@{.)@|:|.)~2*<:. También jugué una versión del método en el artículo de voluta a 38 bytes [:A.@/:_1+/\@|.(2#1+i.)#&}:+:$_1,],1,-.
millas


1

MATL , 16 15 14 bytes

lYL!PletY@wXmf

Falla en casos de prueba mayores que 3debido a imprecisiones de punto flotante y limitaciones de memoria.

Pruébalo en línea!

Explicación

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 tiene incorporados para espirales?
Erik the Outgolfer

@EriktheOutgolfer Puede tener uno
Luis Mendo

Explicación agregada
Luis Mendo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.