被困骑士序列


10

介绍

受最近录像带《被困的骑士-菲利普》的启发,我提出了一个挑战。

捕获的骑士序列是长度为2016的有限整数序列,从1开始,具有以下构造规则:

  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 ...
  1. 在1上放置一个骑士。
  2. 根据国际象棋的规则,将骑士移至网格数量最少的网格,该网格以前从未被访问过(即垂直2个单位,水平1个单位,反之亦然)。
  3. 重复直到骑士被卡住。

这是前三个步骤:

步骤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 

可能的移动是10、12、14、16、18、20、22、24,其中最小的是10,因此第二项是10。

第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 

可能的动作是1,3,23,29,47,49,51,53,其中最小的是3,所以第三项是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 

可能的动作是图6,图8,10,16,28,30,32,34,其中最小的是6,所以第四项是6。

该序列以以下内容开头:

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

并以

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

挑战

编写最短的程序或函数,接收范围[1, 2016](或[0, 2015]如果使用0-indexed)范围内的整数作为输入,然后输出被困骑士序列中该索引处的数字。您可以选择使用0索引或1索引对序列进行索引,但是必须指定要使用的索引方案。

测试用例(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

有关所有可能的输出,请参阅此页面

获奖标准

每种语言的最短代码胜出。适用标准漏洞。



1
@Arnauld这个问题是受我的启发的(如图所示),只是更快地成为主流。同样,此顺序是有限的,因此高尔夫运动的某些方面可能会有所不同。
Shieru Asakoto

1
其他序列也是有限的,在方停止12851850258
乔金

2
@JoKing好吧,但是因为这很快停止了,所以我想在整数范围较小的esolang中看到答案(是否有esolang实现16位整数?)
Shieru Asakoto

1
好吧,如果这个问题最先发布在沙箱中,那不是说被骗会是另一个问题吗?
路易斯·费利佩·德·耶稣·穆诺兹

Answers:


4

的JavaScript(ES7), 182个  181字节

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

在线尝试!

怎么样?

我对《牛羚之路》的回答的稍作修改的版本肯定比这短(且快)。但是我想尝试另一种方法。顺便说一句,我认为在某些 esolang中实施此方法可能会更容易。

算法:

  1. 初始化:我们为螺旋的前4000个正方形建立了完整的坐标列表,该列表足以处理骑士被困之前的所有移动(到达的最高正方形为)。3199
  2. 我们寻找第一个正方形使得:(X,Y)

    ((xX)×(yY))2=4

    其中是骑士的当前坐标。(x,y)

    仅当且或且,上述条件才成立,这涵盖了所有可能的骑士动作。|xX|=1|yY|=2|xX|=2|yY|=1

  3. 我们设置并使列表中的条目无效,这样就不会再次选择该条目。(x,y)=(X,Y)

  4. 我们要么在步骤2重新开始,要么返回完成后找到的最后一个索引。


Node.js,155字节

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)

在线尝试!


3

05AB1E,53 个字节

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

我的05AB1E答案与牛羚之路”挑战的确切端口,用3代替,但加上2尾随θ以输出0索引值,而不是前项的整个序列。n+1

在线尝试验证更多测试用例(最大的测试用例超时)。

说明:

请参阅我链接的《牛羚之路》答案中的解释。唯一修改的部分是:

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

和尾随:

θ       # Only leave the last item of the list

编辑:@Arnauld在他的JavaScript(ES7)答案中的方法的端口是(当前):

05AB1E57 56 字节

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

在线尝试验证更多测试用例(最大的测试用例超时)。

说明:

‚%                # 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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.