Con đường của linh dương đầu bò


23

Chơi golf một chương trình hoặc chức năng cung cấp vị trí của linh dương đầu bắt đầu tại ô vuông trên bàn cờ vô hạn được đánh số theo hình xoắn ốc ngược chiều kim đồng hồ, nơi linh dương đầu bò luôn ghé thăm ô vuông được đánh số thấp nhất cô ấy có thể đạt được mà cô ấy chưa đến thăm.nthứ1

Cảm hứng: Hiệp sĩ bẫyOEIS A316667 .

Chỉnh sửa: Trình tự này hiện có trên OEIS là A323763 .

Mã có thể tạo ra vị trí , vị trí đầu tiên hoặc tạo chuỗi không có đầu vào.nthứn

Thay vào đó, vui lòng cho vị trí của cô ấy sau (hoặc tối đa) nhảy, nhưng nếu vậy, vui lòng nêu rõ điều này trong câu trả lời của bạn và đảm bảo rằng đầu vào mang lại (hoặc nếu phù hợp).nn= =01[1]

Đây là , vì vậy mục đích là tạo ra mã làm việc với càng ít byte càng tốt trong ngôn ngữ bạn đã chọn.

Lưu ý: linh dương đầu bò bị mắc kẹt (giống như hiệp sĩ làm tại vị trí , hình vuông và con lạc đà ở , hình vuông ) của cô ấy ở số vị trí trên hình vuông . Hành vi của mã của bạn có thể không được xác định cho lớn hơn này. (Cảm ơn Deadcode về mã C ++ đã tìm thấy cái này!)2016thứ20843723lần thứ708112899744968thứ12851850258n

Chi tiết

Bảng trông giống như bên dưới và tiếp tục vô tận:

101 100  99  98  97  96  95  94  93  92  91
102  65  64  63  62  61  60  59  58  57  90
103  66  37  36  35  34  33  32  31  56  89
104  67  38  17  16  15  14  13  30  55  88
105  68  39  18   5   4   3  12  29  54  87
106  69  40  19   6   1   2  11  28  53  86
107  70  41  20   7   8   9  10  27  52  85
108  71  42  21  22  23  24  25  26  51  84
109  72  43  44  45  46  47  48  49  50  83
110  73  74  75  76  77  78  79  80  81  82
111 112 113 114 115 116 117 118 119 120 121

Một wildebeest là một "gnu" cờ cổ tích mảnh - một mảnh cờ phi tiêu chuẩn có thể di chuyển cả hai như là một hiệp sĩ (một (1,2) -leaper) và như một con lạc đà (một (1,3) -leaper).
Vì vậy, cô có thể di chuyển đến bất kỳ vị trí nào trong số này từ vị trí bắt đầu là 1 :

  .   .   .   .   .   .   .   .   .   .   .
  .   .   .   .  35   .  33   .   .   .   .
  .   .   .   .  16   .  14   .   .   .   .
  .   .  39  18   .   .   .  12  29   .   .
  .   .   .   .   .  (1)  .   .   .   .   .
  .   .  41  20   .   .   .  10  27   .   .
  .   .   .   .  22   .  24   .   .   .   .
  .   .   .   .  45   .  47   .   .   .   .
  .   .   .   .   .   .   .   .   .   .   .

Thấp nhất trong số này là 10 và cô chưa đến thăm quảng trường đó, vì vậy 10 là thuật ngữ thứ hai trong chuỗi.

Tiếp theo cô có thể di chuyển từ 10 đến bất kỳ địa điểm nào trong số này:

  .   .   .   .   .   .   .   .   .   .   .
  .   .   .   .   .   .  14   .  30   .   .
  .   .   .   .   .   .   3   .  29   .   .
  .   .   .   .   6   1   .   .   .  53  86
  .   .   .   .   .   .   . (10)  .   .   .
  .   .   .   .  22  23   .   .   .  51  84
  .   .   .   .   .   .  47   .  49   .   .
  .   .   .   .   .   .  78   .  80   .   .
  .   .   .   .   .   .   .   .   .   .   .

Tuy nhiên, cô ấy đã đến thăm quảng trường 1 nên vị trí thứ ba của cô ấy là hình vuông 3 , thấp nhất cô ấy chưa đến thăm.


100 điều khoản đầu tiên về con đường của linh dương đầu bò là:

1, 10, 3, 6, 9, 4, 7, 2, 5, 8, 11, 14, 18, 15, 12, 16, 19, 22, 41, 17, 33, 30, 34, 13, 27, 23, 20, 24, 44, 40, 21, 39, 36, 60, 31, 53, 26, 46, 25, 28, 32, 29, 51, 47, 75, 42, 45, 71, 74, 70, 38, 35, 59, 56, 86, 50, 78, 49, 52, 80, 83, 79, 115, 73, 107, 67, 64, 68, 37, 61, 93, 55, 58, 54, 84, 48, 76, 43, 69, 103, 63, 66, 62, 94, 57, 87, 125, 82, 118, 77, 113, 72, 106, 148, 65, 97, 137, 91, 129, 85

11 bước nhảy đầu tiên là các động tác hiệp sĩ nên 12 điều khoản đầu tiên trùng với A316667 .


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Mego

Câu trả lời:


21

JavaScript (Node.js) ,  191 ... 166  164 byte

Đã lưu 2 byte nhờ @grimy .

Trả về N thứ hạn.

n=>(g=(x,y)=>n--?g(Buffer('QPNP1O?O@242Q3C3').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)

Hãy thử trực tuyến! hoặc Xem phiên bản được định dạng

Làm sao?

Chỉ số xoắn ốc

Để chuyển đổi tọa độ (x,y) thành chỉ số xoắn ốc tôi , trước tiên chúng ta tính toán lớp L với:

L= =tối đa(|x|,|y|)

Cung cấp cho:

3210+1+2+333333333232222231321112303210123+13211123+23222223+33333333

P

P={2L+x+yif x>y(2L+x+y)if xy

Cung cấp cho:

3210+1+2+330123456210123471210125803210369+143234710+254567811+36789101112

I

I=4L2P

NB: Công thức trên cho hình xoắn ốc có chỉ số 0.

4L2

i = 4 * (x * x > y * y ? x : y) ** 2

P

i -= (x > y || -1) * (i ** 0.5 + x + y)

Di chuyển của linh dương đầu bò

(x,y)

321x+1+2+3391128101761213y+1541415+220+331

(dx,dy)

 ID | char. | ASCII code | c%6-2 | c%7-2 | cumulated
----+-------+------------+-------+-------+-----------
  0 |  'Q'  |     81     |   +1  |   +2  |  (+1,+2)
  1 |  'P'  |     80     |    0  |   +1  |  (+1,+3)
  2 |  'N'  |     78     |   -2  |   -1  |  (-1,+2)
  3 |  'P'  |     80     |    0  |   +1  |  (-1,+3)
  4 |  '1'  |     49     |   -1  |   -2  |  (-2,+1)
  5 |  'O'  |     79     |   -1  |    0  |  (-3,+1)
  6 |  '?'  |     63     |   +1  |   -2  |  (-2,-1)
  7 |  'O'  |     79     |   -1  |    0  |  (-3,-1)
  8 |  '@'  |     64     |   +2  |   -1  |  (-1,-2)
  9 |  '2'  |     50     |    0  |   -1  |  (-1,-3)
 10 |  '4'  |     52     |   +2  |   +1  |  (+1,-2)
 11 |  '2'  |     50     |    0  |   -1  |  (+1,-3)
 12 |  'Q'  |     81     |   +1  |   +2  |  (+2,-1)
 13 |  '3'  |     51     |   +1  |    0  |  (+3,-1)
 14 |  'C'  |     67     |   -1  |   +2  |  (+2,+1)
 15 |  '3'  |     51     |   +1  |    0  |  (+3,+1)

m(H,V)

g

x= =1y= =2(0,0)


3
Chơi golf nhiều như vậy, không thể chờ đợi quá trình hoạt động của tất cả các phép thuật!
Jonathan Allan

bạn có phải sử dụng Bufferđể buộc mỗi ký tự được hiểu là một byte không?
Giô-na

1
@Jonah Mặc dù nó không được dùng nữa, nhưng hàm Buffertạo vẫn chấp nhận một chuỗi. Vì vậy, vâng, đây là một cách khá rẻ để chuyển đổi nó thành một danh sách các byte - trái ngược với [..."string"].map(c=>do_something_with(c.charCodeAt())).
Arnauld

1
-2 byte trên mã hóa tọa độ: TIO
Grimmy

@Grimy Hoàn thành tốt!
Arnauld

8

Dừa , 337 276 byte

import math
def g((x,y))=
 A=abs(abs(x)-abs(y))+abs(x)+abs(y)
 int(A**2+math.copysign(A+x-y,.5-x-y)+1)
def f():
 p=x,y=0,0;s={p};z=[2,3,1,1]*2
 while 1:yield g(p);p=x,y=min(((a+x,b+y)for a,b in zip((1,1,2,-2,-1,-1,3,-3)*2,z+[-v for v in z])if(a+x,b+y)not in s),key=g);s.add(p)

Trả về một bộ tạo các giá trị. Có lẽ có thể được chơi golf nhiều hơn. (Đặc biệt là chuỗi các bộ dữ liệu khác nhau.) Thuật toán xoắn ốc được lấy từ câu trả lời math.se này .

Hãy thử trực tuyến!


1
for a,b in (-> for a,b in((có lẽ bạn cũng có thể đánh gôn bộ đồng bằng của bộ tuple)
Jonathan Allan

1
Không cần qvà một zip ngắn hơn cho các bộ dữ liệu: dĩ nhiên 306 byte vẫn có thể chơi được
Jonathan Allan

1
... làm thế nào về điều này cho 284? EDIT ... cái này cho 278
Jonathan Allan

1
FWIW, câu trả lời math.se đóxy được hoán đổi và cả âm đều liên quan đến hệ tọa độ trong thử thách này (trong đó dương x là đúng và y lên). Không phải là nó sẽ tạo ra bất kỳ sự khác biệt nào do các đối xứng, nhưng vẫn còn.
Deadcode

1
0.5-> .5cho một byte lưu khác; A**2-> A*Ađể biết thêm.
Jonathan Allan

8

05AB1E , 77 65 58 57 52 byte

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

-6 byte nhờ @Arnauld bằng cách sử dụng một cổng công thức của mình.

n+1

Hãy thử trực tuyến (phần ïchân trang sẽ loại bỏ .0để làm cho đầu ra nhỏ gọn hơn, nhưng hãy thoải mái loại bỏ nó để xem kết quả thực tế).

Mã giải thích:

Xˆ             # Put integer 1 in the global_array (global_array is empty by default)
0U             # Set variable `X` to 0 (`X` is 1 by default)
F              # Loop the (implicit) input amount of times:
 3D          #  Push the list in the range [-3,3]: [-3,-2,-1,0,1,2,3]
     0K        #  Remove the 0: [-3,-2,-1,1,2,3]
       ã       #  Cartesian product with itself, creating each possible pair: [[3,3],[3,2],[3,1],[3,-1],[3,-2],[3,-3],[2,3],[2,2],[2,1],[2,-1],[2,-2],[2,-3],[1,3],[1,2],[1,1],[1,-1],[1,-2],[1,-3],[-1,3],[-1,2],[-1,1],[-1,-1],[-1,-2],[-1,-3],[-2,3],[-2,2],[-2,1],[-2,-1],[-2,-2],[-2,-3],[-3,3],[-3,2],[-3,1],[-3,-1],[-3,-2],[-3,-3]]
        ʒ   }  #  Filter this list of pairs by:
         Ä     #   Where the absolute values of the pair
          1¢   #   Contains exactly one 1
               #  (We now have the following pairs left: [[3,1],[3,-1],[2,1],[2,-1],[1,3],[1,2],[1,-2],[1,-3],[-1,3],[-1,2],[-1,-2],[-1,-3],[-2,1],[-2,-1],[-3,1],[-3,-1]])
 εX+}          #  Add the variable `X` (previous coordinate) to each item in the list
 D             #  Duplicate this list of coordinates
  ε            #  Map each `x,y`-coordinate to:
   ·           #   Double both the `x` and `y` in the coordinate
    n          #   Then take the square of each
     à         #   And then pop and push the maximum of the two
   Dt          #   Duplicate this maximum, and take its square-root
     yÆ        #   Calculate `x-y`
       +       #   And add it to the square-root
   yO          #   Calculate `x+y`
     ·         #   Double it
      <        #   Decrease it by 1
             #   And pop and push its signum (-1 if < 0; 0 if 0; 1 if > 0)
   *           #   Multiply these two together
    -          #   And subtract it from the duplicated maximum
   >           #   And finally increase it by 1 to make it 1-based instead of 0-based
  }D           #  After the map: Duplicate that list with values
    ¯K         #  Remove all values that are already present in the global_array
      ß        #  Pop the list of (remaining) values and push the minimum
       Dˆ      #  Duplicate this minimum, and pop and add the copy to the global_array
         k     #  Then get its index in the complete list of values
          è    #  And use that index to get the corresponding coordinate
           U   #  Pop and store this coordinate in variable `X` for the next iteration
             # After the outer loop: push the global_array (which is output implicitly)

Giải thích chung:

global_array[1]
x,yX[0,0]

x,y

[[x+3,y+1], [x+3,y-1], [x+2,y+1], [x+2,y-1], [x+1,y+3], [x+1,y+2], [x+1,y-2], [x+1,y-3], [x-1,y+3], [x-1,y+2], [x-1,y-2], [x-1,y-3], [x-2,y+1], [x-2,y-1], [x-3,y+1], [x-3,y-1]]

Danh sách tôi đề cập trong phần giải thích mã ở trên chứa các giá trị này mà chúng ta có thể chuyển đến, sau đó hiện tạix,y(được lưu trữ trong biến X) được thêm vào.

Sau đó, nó sẽ tính toán các giá trị xoắn ốc dựa trên những x,y-Đối tác. Nó thực hiện điều này bằng cách sử dụng công thức sau đây cho mộtx,y-danh từ: Tọa độ:

T= =mmộtx((2*x)2,(2*y)2)
R= =T-(x-y+T)*Stôignbạnm((x+y)*2-1)+1

Đó là cùng một công thức mà @Arnauld đang sử dụng trong câu trả lời của mình , nhưng được viết khác nhau để sử dụng các nội dung của 05AB1E cho gấp đôi, vuông, -1, +1, v.v.

(Nếu bạn chỉ muốn xem phần xoắn ốc này của mã đang hoạt động: Hãy thử trực tuyến .)

Sau khi chúng tôi có tất cả các giá trị chúng tôi có thể đạt được cho trước x,y- Kết hợp, chúng tôi xóa tất cả các giá trị đã có trong global_arrayvà sau đó chúng tôi nhận được tối thiểu các giá trị (còn lại).
Mức tối thiểu này sau đó được thêm vào global_arrayvà biến Xđược thay thế bằngx,y- Phối hợp tối thiểu này.

Sau khi chúng tôi lặp inputsố lần, chương trình sẽ xuất global_arraykết quả này.


1
FWIW, đây là một cổng công thức của riêng tôi để chuyển đổi tọa độ thành các chỉ số xoắn ốc. Nó ngắn hơn 5 byte nhưng mang lại số float. (Tôi không biết đây có phải là vấn đề hay không.)
Arnauld

(Lưu ý rằng y trong mã của bạn là -ytrong tôi.)
Arnauld

@Arnauld Cảm ơn, tiết kiệm thêm 5 byte. :) EDIT: Mà bạn đã đề cập trong bình luận đầu tiên của bạn. ; p
Kevin Cruijssen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.