เส้นทางแห่ง Wildebeest


23

เล่นกอล์ฟโปรแกรมหรือฟังก์ชั่นที่ให้ตำแหน่งของwildebeestที่เริ่มต้นที่สแควร์บนกระดานหมากรุกที่ไม่มีที่สิ้นสุดซึ่งมีหมายเลขอยู่ในเกลียวตารางทวนเข็มนาฬิกาที่ซึ่ง wildebeest มักจะไปที่ตารางเลขต่ำสุด เธอสามารถเข้าถึงที่เธอยังไม่ได้เยี่ยมชมnTH1

แรงบันดาลใจ: ติดอัศวินและOEIS A316667

แก้ไข: ลำดับนี้ขณะนี้อยู่ใน OEIS เป็นA323763

รหัสอาจสร้างที่ตั้งตำแหน่งแรกหรือสร้างลำดับโดยไม่มีการป้อนข้อมูลnTHn

รู้สึกอิสระที่จะให้สถานที่ตั้งของเธอหลังจากที่ (หรือขึ้นไป)กระโดดแทน แต่ถ้าดังนั้นโปรดรัฐนี้ได้อย่างชัดเจนในคำตอบของคุณและให้แน่ใจว่าการป้อนข้อมูลของอัตราผลตอบแทน(หรือถ้าเหมาะสม)nn=01[1]

นี่คือดังนั้นจุดมุ่งหมายคือการสร้างโค้ดที่ใช้งานได้ในไม่กี่ไบต์ในภาษาที่คุณเลือก

หมายเหตุ: ครืนติดหนึบ (เหมือนอัศวินไม่ที่เขาสถานที่, ตารางและอูฐไม่ที่เขาสี่เหลี่ยม ) ที่เธอตำแหน่งบนตาราง12851850258พฤติกรรมของรหัสของคุณอาจไม่ได้กำหนดไว้สำหรับใหญ่กว่านี้ (ขอบคุณ Deadcode สำหรับรหัส C ++ที่พบสิ่งนี้!)2016th20843723rd708112899744968th12851850258n

รายละเอียด

กระดานดูเหมือนด้านล่างและดำเนินต่อไปเรื่อย ๆ :

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

ครืนคือ "GNU" ชิ้นนางฟ้าหมากรุก - ชิ้นหมากรุกที่ไม่ได้มาตรฐานซึ่งอาจย้ายทั้งสองเป็นอัศวิน (ก -leaper) และเป็นอูฐ (เป็น -leaper) ด้วยเหตุนี้เธอสามารถย้ายไปยังตำแหน่งใด ๆ เหล่านี้จากตำแหน่งเริ่มต้นที่ :(1,2)(1,3)
1

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

ต่ำสุดของเหล่านี้คือและเธอยังไม่ได้เยี่ยมชมที่จัตุรัสดังนั้นเป็นระยะที่สองในลำดับ1010

ถัดไปเธอสามารถย้ายจาก10ไปยังตำแหน่งเหล่านี้:

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

อย่างไรก็ตามเธอเคยไปที่จตุรัส1ดังนั้นสถานที่ที่สามของเธอคือจตุรัส3ซึ่งต่ำที่สุดที่เธอยังไม่เคยไป


100คำแรกของเส้นทางของ Wildebeest คือ:

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 leaps มีการเคลื่อนไหวเพื่อให้อัศวินแรก12แง่ตรงกับA316667


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Mego

คำตอบ:


21

JavaScript (Node.js) ,  191 ... 166  164 ไบต์

ที่บันทึกไว้ 2 ไบต์ขอบคุณที่@grimy

ส่งคืนคำศัพท์ยังไม่มีข้อความ th

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)

ลองออนไลน์! หรือดูรุ่นที่จัดรูปแบบ

อย่างไร?

ดัชนีเกลียว

ในการแปลงพิกัด(x,Y)เป็นดัชนีเกลียวผมเราจะคำนวณเลเยอร์Lด้วย:

L=สูงสุด(|x|,|Y|)

ซึ่งจะช่วยให้:

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

จากนั้นเราคำนวณตำแหน่งPในเลเยอร์ด้วย:

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

ซึ่งจะช่วยให้:

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

ดัชนีสุดท้ายที่Iได้รับจาก:

I=4L2P

หมายเหตุ: สูตรข้างต้นให้เกลียว 0 ดัชนี

ในรหัส JS เราคำนวณ4L2ทันทีด้วย:

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

แล้วลบPด้วย:

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

การเคลื่อนไหวของ Wildebeest

เมื่อพิจารณาตำแหน่งปัจจุบัน(x,y)สี่เหลี่ยมเป้าหมายที่เป็นไปได้ 16 รายการของ wildebeest จะถูกทดสอบตามลำดับต่อไปนี้:

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

เราเดินผ่านพวกเขาโดยการใช้ 16 คู่ค่าลงนาม(dx,dy) ) แต่ละคู่จะถูกเข้ารหัสเป็นอักขระ ASCII เดียว

 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
การเล่นกอล์ฟมากไม่สามารถรอบทสรุปของเวทมนตร์ทั้งหมดที่ใช้งานได้!
Jonathan Allan

คุณต้องใช้Bufferเพื่อบังคับให้ตัวละครแต่ละตัวถูกตีความว่าเป็นไบต์เดียวหรือไม่?
โยนาห์

1
@Jonah แม้ว่าจะถูกเลิกใช้คอนBufferสตรัคเตอร์ยังคงยอมรับสตริง ดังนั้นใช่นี้เป็นวิธีที่ถูกค่อนข้างที่จะแปลงเป็นรายชื่อของไบต์ - [..."string"].map(c=>do_something_with(c.charCodeAt()))เมื่อเทียบกับ
Arnauld

1
-2 ไบต์ในการเข้ารหัสพิกัด: TIO
Grimmy

@Grimy ทำได้ดีมาก!
Arnauld

8

โคโคนัท , 337 276 ไบต์

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)

ส่งคืนกำเนิดของค่า อาจจะเล่นกอล์ฟมากกว่านี้ (โดยเฉพาะอย่างยิ่งลำดับของความแตกต่างของสิ่งอันดับ) อัลกอริธึมแบบหมุนวนที่นำมาจากคำตอบ math.seนี้

ลองออนไลน์!


1
for a,b in (-> for a,b in((บางทีคุณสามารถเล่นกอล์ฟเดลต้าทูเปิลของทูเปิลเองก็ได้)
Jonathan Allan

1
ไม่จำเป็นต้องใช้qและซิปจะสั้นกว่าสำหรับสิ่งอันดับ: 306 ไบต์อาจยังสามารถเล่นกอล์ฟได้แน่นอน
Jonathan Allan

1
... แล้ว 284 ล่ะ? แก้ไข ... สิ่งนี้สำหรับ 278
Jonathan Allan

1
FWIW คำตอบ math.seนั้นมีxและyสลับกันและทั้งสองมีความสัมพันธ์เชิงลบกับระบบพิกัดในการท้าทายนี้ (ที่บวกxถูกต้องและyขึ้นอยู่) ไม่ว่ามันจะสร้างความแตกต่างเนื่องจากสมมาตร แต่ก็ยัง
Deadcode

1
0.5-> .5สำหรับการบันทึกไบต์อื่น A**2-> A*Aอีกหนึ่ง
Jonathan Allan

8

05AB1E , 77 65 58 57 52 ไบต์

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

-6 ไบต์ขอบคุณ@Arnauldโดยใช้พอร์ตของสูตรของเขา

ส่งออกแรก n+1 ค่าเป็นรายการ (ของทศนิยม)

ลองออนไลน์ ( ïส่วนท้ายในจะลบ.0เพื่อให้เอาต์พุตมีขนาดกะทัดรัดมากขึ้น แต่สามารถลบออกเพื่อดูผลลัพธ์ที่แท้จริง)

คำอธิบายรหัส:

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)

คำอธิบายทั่วไป:

เราถือผลลัพธ์ทั้งหมด (และดังนั้นจึงเห็นคุณค่าของเราได้พบแล้ว) ในซึ่งจะเริ่มต้นครั้งแรกเป็นglobal_array เราถือปัจจุบัน[1]
x,Yประสานงานในตัวแปรซึ่งเป็นครั้งแรกX[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]]

รายการที่ฉันพูดถึงในคำอธิบายรหัสข้างต้นถือค่าเหล่านี้เราสามารถข้ามไปหลังจากที่ปัจจุบัน x,Y(เก็บไว้ในตัวแปรX) ถูกเพิ่ม

จากนั้นจะคำนวณค่าเกลียวตามค่าเหล่านี้ x,Y-พิกัด. มันทำได้โดยใช้สูตรต่อไปนี้เพื่อรับx,Yประสานงาน:

T=ม.ax((2* * * *x)2,(2* * * *Y)2)
R=T-(x-Y+T)* * * *sผมก.nยูม.((x+Y)* * * *2-1)+1

ซึ่งเป็นสูตรเดียวกัน@Arnauldใช้ในคำตอบของเขาแต่เขียนแตกต่างกันเพื่อใช้ประโยชน์จากบิวอิน 05AB1E สำหรับ double, square, -1, +1 และอื่น ๆ

(หากคุณต้องการเห็นเพียงส่วนหมุนวนของรหัสที่ใช้งาน : ลองออนไลน์ )

หลังจากที่เราได้รับคุณค่าทั้งหมดที่เราสามารถเข้าถึงได้ x,y- ระดับรองเราจะลบค่าทั้งหมดที่มีอยู่แล้วในglobal_arrayและจากนั้นเราจะได้รับค่าขั้นต่ำ (ที่เหลือ)
ขั้นต่ำนี้จะถูกเพิ่มลงในglobal_arrayและตัวแปรXจะถูกแทนที่ด้วยx,Y- ทำงานร่วมกันของขั้นต่ำนี้

หลังจากเราวนลูปเป็นinputจำนวนครั้งโปรแกรมจะแสดงผลลัพธ์global_arrayเป็นผลลัพธ์


1
FWIW นี่คือพอร์ตของสูตรของฉันเองเพื่อแปลงพิกัดเป็นดัชนีหมุนวน มันสั้นกว่า 5 ไบต์ แต่ให้ผลลอย (ฉันไม่รู้ว่านี่เป็นปัญหาหรือเปล่า)
Arnauld

(โปรดสังเกตว่า Y ในรหัสของคุณคือ -Yในเหมือง.)
Arnauld

@Arnauld ขอบคุณที่บันทึกเพิ่มอีก 5 ไบต์ :) แก้ไข: ที่คุณพูดถึงแล้วในความคิดเห็นแรกของคุณ ; p
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.