Sequência de Cavaleiro Preso

10

Introdução

Inspirado no vídeo muito recente The Trapped Knight - Numberphile , me deparei com um desafio.

A sequência do cavaleiro interceptado é uma sequência inteira finita de comprimento 2016, iniciando em 1 e possui as seguintes regras de construção:

  1. Escreva uma espiral numérica da seguinte maneira:
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 ...
  1. Coloque um cavaleiro em 1.
  2. Mova o cavaleiro para a grade com o menor número possível de visitantes que não tenham sido visitados anteriormente, de acordo com as regras do xadrez (ou seja, 2 unidades na vertical e 1 na horizontal ou vice-versa).
  3. Repita até que o cavaleiro fique preso.

Aqui estão os três primeiros passos:

Passo 1

 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 

Os movimentos possíveis são 10, 12, 14, 16, 18, 20, 22, 24, entre os quais o menor é 10; portanto, o segundo termo é 10.

Passo 2

  4  [ 3]  12  [29]  54
( 1)   2   11   28  [53] 
  8    9  <10>  27   52 
[23]  24   25   26  [51] 
 46  [47]  48  [49]  50 

Os movimentos possíveis são 1 , 3, 23, 29, 47, 49, 51, 53, entre os quais o menor é 3; portanto, o terceiro termo é 3.

etapa 3

 35  [34]  33  [32]  31 
[16]  15   14   13  [30] 
  5    4  < 3>  12   29 
[ 6] ( 1)   2   11  [28] 
  7  [ 8]   9  (10)  27 

Os movimentos possíveis são 6, 8, 10 , 16, 28, 30, 32, 34, entre os quais o menor é 6; portanto, o quarto termo é 6.

A sequência começa com:

1 10 3 6 9 4 7 2 5 8 11 14 ...

e termina com

... 2099 2284 2477 2096 2281 2474 2675 2884 3101 2880 2467 2084

Desafio

Escreva um programa ou função mais curto, recebendo um número inteiro no intervalo [1, 2016](ou [0, 2015]se o índice 0 for usado) como entrada, imprima o número nesse índice na sequência do cavaleiro preso. Você pode optar por indexar a sequência com 0 ou 1, mas você deve especificar qual esquema de indexação você usa.

Casos de teste (indexados 1)

n    | s(n)
-----+-----
   1 |    1
   2 |   10
   3 |    3
   6 |    4
  11 |   11
  21 |   23
  51 |   95
 101 |   65
 201 |  235
 501 |  761
1001 | 1069
2001 | 1925
2016 | 2084

Para todas as saídas possíveis, consulte esta página .

Critérios Vencedores

O código mais curto de cada idioma vence. Aplicam-se restrições nas brechas padrão.

Shieru Asakoto
fonte
11
Muito relacionado
Arnauld
11
@ Arnauld Essa pergunta foi inspirada na minha (como indicado), apenas sendo mais rápida para se tornar principal. Além disso, essa sequência é finita, portanto, alguns aspectos do golfe podem ser diferentes nesse sentido.
Shieru Asakoto 29/01/19
11
A outra sequência também é finita, parando na praça12851850258
Jo King
2
@JoKing Bem, mas porque este pára muito rapidamente, eu gostaria de ver as respostas em esolangs com intervalos de inteiros menores (existem esolangs execução inteiros de 16 bits?)
Shieru Asakoto
11
Bem, se esta pergunta foi publicada primeiro na caixa de areia, isso não significa que o idiota seria a outra pergunta ?
Luis felipe De jesus Munoz

Respostas:

4

JavaScript (ES7),  182  181 bytes

f=(n,[x,y]=[2,1],a=[...Array(4e3)].map((_,n)=>[1,-1].map(s=>(i&1?-s:s)*(i+s*n-(n>0?n:-n)>>1),i=n**.5|0,n-=i*++i)))=>n--?f(n,a.find(([X,Y],j)=>(i=j,(x-X)*(y-Y))**2==4),a,a[i]=[]):i+1

Experimente online!

Como?

Uma versão ligeiramente modificada da minha resposta ao The Path Of The Wildebeest é definitivamente mais curta (e mais rápida) do que isso. Mas eu queria tentar uma abordagem diferente. Aliás, acho que pode ser mais fácil implementar esse método em alguns esolangs.

Algoritmo:

  1. 3199
  2. (X,Y)

    ((x-X)×(y-Y))2=4

    (x,y)

    |x-X|=1 1|y-Y|=2|x-X|=2|y-Y|=1 1

  3. (x,y)=(X,Y)

  4. Nós reiniciaremos na etapa 2 ou retornaremos o último índice encontrado se estiver pronto.


Node.js , 155 bytes

n=>(g=(x,y)=>n--?g(Buffer('QHUbcdWJ').map(m=c=>g[i=4*((x+=c%6-2)*x>(y+=c%7-2)*y?x:y)**2,i-=(x>y||-1)*(i**.5+x+y)]|i>m||(H=x,V=y,m=i))|H,V,g[m]=1):m+1)(1,2)

Experimente online!

Arnauld
fonte
3

05AB1E , 53 bytes

Xˆ0UF2D(Ÿ0KãʒÄ1¢}εX+}Dε·nàDtyÆ+yO·<.±*->}D¯KßDˆkèU}¯θ

32θn+1 1

Experimente online ou verifique mais alguns casos de teste (o tempo limite para os maiores casos de teste).

Explicação:

Veja a explicação na minha resposta O caminho do gnu . As únicas partes modificadas são:

2D    # Get a list in the range [-2,2]: [-2,-1,0,1,2]

e um rastro:

θ       # Only leave the last item of the list

EDIT: Uma porta da abordagem de @Arnauld em sua resposta JavaScript (ES7) é (atualmente):

05AB1E , 57 56 bytes

0D‚DˆUF64D(ŸãΣ·nàDtyÆ+yO·<.±*->}©ʒX-Pn4Q}¯¡˜2£DˆU}®J¯Jk>θ

Experimente online ou verifique mais alguns casos de teste (o tempo limite para os maiores casos de teste).

Explicação:

‚%                # Create a pair of zeros: [0,0]
                  # (by pairing the (implicit) input with itself,
                  #  and then using modulo (implicit) input)
  DˆU             # Set both variable `X` to this, and add it to the global_array
F                 # Loop the (implicit) input amount of times:
 64D            #  Create a list in the range [-64,64]
      ã           #  Create each possible pair of `x,y`-coordinates
       Σ·nàDtyÆ+yO·<.±*->}
                  #  Sort this list in a spiral
        ©         #  Save it in the register (without popping)
 ʒ      }         #  Filter the list of coordinates by:
  X-              #   Subtract the coordinate of variable `X`
    P             #   Take the product
     n            #   Take the square
      4Q          #   Check if its equal to 4
                  # Since 05AB1E cannot remove inner lists, we use a workaround:
         ¯¡       # Split this list on each coordinate in the global_array
           ˜      # Flatten the entire list
            2£    # Only leave the first two integers as `x,y`-coordinate
                  # (if 05AB1E could remove inner lists, this would've been `¯Kн` instead)
              DˆU # Replace variable `X` with this, and add it to the global_array
                # After the loop: push all coordinates sorted in a spiral from the register
  J               # Join each coordinate together to a string
   ¯J             # Push the global_array, and also join them together to a string
                  # (if 05AB1E could index inner lists, both `J` could have been removed)
     k            # Get the index of each item of the global_array in the spiral list
      >           # Increase the 0-indexed index by 1 to make it 1-based
       θ          # And only leave the last one (which is output implicitly)

Σ·nàDtyÆ+yO·<.±*->}x,y

Kevin Cruijssen
fonte