Índice de Permutação Espiral Achatada


8

Contexto

Considere matrizes quadradas com ncolunas e linhas contendo os primeiros inteiros positivos n^2(isto é, nao quadrado), onde né ímpar. Os elementos das matrizes estão dispostos de tal modo que os números inteiros 1através n^2são colocados sequencialmente num sentido anti-horário em espiral a partir do centro e inicialmente mover-se para a esquerda. Chame essas matrizesM(n)

Pois n=1isso simplesmente fornece a matriz de um elemento M(1)=[[1]].

M(3) é a matriz

9 8 7
2 1 6
3 4 5

M(5) é a 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

e M(7)é a 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

Agora considere achatar essa matriz em uma lista / matriz concatenando suas linhas começando do topo e descendo. Ligue para essas listas L(n). L(3), L(5)e L(7)são representados abaixo, com seus elementos delimitados por espaços.

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 o índice i(n)de L(n)em uma lista lexicograficamente classificada de permutações de L(n). Em Jelly, o Œ¿átomo fornece esse índice para a lista em que atua.

Desafio

Seu desafio é pegar um número inteiro ímpar positivo ncomo entrada e gerar o índice i(n).

Os primeiros valores são

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

Note que i(n)~ = (n^2)!. Isso não está no OEIS.

Esse é o código golf por idioma, portanto, faça isso no menor número de bytes possível.

Postagem na caixa de areia .

Respostas:


3

Geléia , 21 19 bytes

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

Experimente online!

Baseado no método de um artigo em J sobre volutas .

Explicação

-;,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 graças a @miles!

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

Velho:

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

Observe que o resultado é indexado em 0, então i(1) = 0ei(5) = 15511208759089364438087640

Explicação (antiga):

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

Fazer a espiral poderia ser mais rápido, mas a orientação seria confusa.

Não sei como J está otimizando isso, mas leva apenas 0.000414alguns segundos para calcular n=7(em uma nova sessão do console J).


Talvez J faça algo parecido com o que fiz com Jelly ( código )?
Jonathan Allan

Joguei seu método em 39 bytes [:A.@,,.@*0&((,~(#\.+{:)@{.)@|:|.)~2*<:. Também joguei uma versão do método no artigo de voluta para 38 bytes [:A.@/:_1+/\@|.(2#1+i.)#&}:+:$_1,],1,-.
miles


1

MATL , 16 15 14 bytes

lYL!PletY@wXmf

Falha em casos de teste maiores que 3devido a imprecisões de ponto flutuante e limitações de memória.

Experimente online!

Explicação

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

O MATL tem embutidos para espirais?
Erik the Outgolfer

@EriktheOutgolfer Pode ter um #
Luis Mendo

Explanation added
Luis Mendo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.