ระยะทางอัศวิน


24

ในหมากรุกอัศวินในกริด (x, y) อาจย้ายไปที่ (x-2, y-1), (x-2, y + 1), (x-1, y-2), (x-1, y + 2), (x + 1, y-2), (x + 1, y + 2), (x + 2, y-1), (x + 2, y + 1) ในขั้นตอนเดียว ลองนึกภาพกระดานหมากรุกที่ไม่มีที่สิ้นสุดที่มีเพียงอัศวินใน (0, 0):

จำเป็นต้องมีกี่ขั้นตอนสำหรับการย้ายอัศวินจาก (0, 0) ถึง (t x , t y )

ปัจจัยการผลิต

จำนวนเต็มสองจำนวน: t x , t y ;

-100 <t x <100, -100 <t y <100

เอาท์พุต

ขั้นตอนน้อยที่สุดที่จำเป็นในการย้ายอัศวินจาก (0, 0) ไปยัง (t x , t y )

กฎระเบียบ

  • รหัสกอล์ฟ

Testcases

  x    y -> out
  0,   0 ->  0
  0,   1 ->  3
  0,   2 ->  2
  1,   1 ->  2
  1,   2 ->  1
  3,   3 ->  2
  4,   0 ->  2
 42,  22 -> 22
 84,  73 -> 53
 45,  66 -> 37
 99,  99 -> 66
-45, -91 -> 46
-81,   1 -> 42
 11,  -2 ->  7

document.write('<div>');[..."EFEDEDCDCBCBCBCBCBCBCBCBCBCBCBCBCBCDCDEDEFE;FEDEDCDCBCBABABABABABABABABABABABCBCDCDEDEF;EDEDCDCBCBABABABABABABABABABABABABCBCDCDEDE;DEDCDCBCBABA9A9A9A9A9A9A9A9A9A9ABABCBCDCDED;EDCDCBCBABA9A9A9A9A9A9A9A9A9A9A9ABABCBCDCDE;DCDCBCBABA9A9898989898989898989A9ABABCBCDCD;CDCBCBABA9A989898989898989898989A9ABABCBCDC;DCBCBABA9A98987878787878787878989A9ABABCBCD;CBCBABA9A9898787878787878787878989A9ABABCBC;BCBABA9A989878767676767676767878989A9ABABCB;CBABA9A98987876767676767676767878989A9ABABC;BABA9A9898787676565656565656767878989A9ABAB;CBA9A989878767656565656565656767878989A9ABC;BABA98987876765654545454545656767878989ABAB;CBA9A987876765654545454545456567678789A9ABC;BABA98987676565454343434345456567678989ABAB;CBA9A987876565454343434343454565678789A9ABC;BABA98987676545434323232343454567678989ABAB;CBA9A987876565434323232323434565678789A9ABC;BABA98987676545432341214323454567678989ABAB;CBA9A987876565434321232123434565678789A9ABC;BABA98987676545432323032323454567678989ABAB;CBA9A987876565434321232123434565678789A9ABC;BABA98987676545432341214323454567678989ABAB;CBA9A987876565434323232323434565678789A9ABC;BABA98987676545434323232343454567678989ABAB;CBA9A987876565454343434343454565678789A9ABC;BABA98987676565454343434345456567678989ABAB;CBA9A987876765654545454545456567678789A9ABC;BABA98987876765654545454545656767878989ABAB;CBA9A989878767656565656565656767878989A9ABC;BABA9A9898787676565656565656767878989A9ABAB;CBABA9A98987876767676767676767878989A9ABABC;BCBABA9A989878767676767676767878989A9ABABCB;CBCBABA9A9898787878787878787878989A9ABABCBC;DCBCBABA9A98987878787878787878989A9ABABCBCD;CDCBCBABA9A989898989898989898989A9ABABCBCDC;DCDCBCBABA9A9898989898989898989A9ABABCBCDCD;EDCDCBCBABA9A9A9A9A9A9A9A9A9A9A9ABABCBCDCDE;DEDCDCBCBABA9A9A9A9A9A9A9A9A9A9ABABCBCDCDED;EDEDCDCBCBABABABABABABABABABABABABCBCDCDEDE;FEDEDCDCBCBABABABABABABABABABABABCBCDCDEDEF;EFEDEDCDCBCBCBCBCBCBCBCBCBCBCBCBCBCDCDEDEFE"].forEach(c=>document.write(c==';'?'<br>':`<span class="d-${c}">${c}</span>`));
document.write('<style>body{line-height:16px;color:rgba(255,255,255,0.2);}span{display:inline-block;width:16px;font-size:16px;text-align:center;}div{white-space:pre;}');[...'0123456789ABCDEF'].map((c,i)=>document.write(`.d-${c}{background:hsl(${60-4*i},80%,${65-2*i}%)}`));

OEIS ที่เกี่ยวข้อง

นี่คือ OEIS บางส่วนสำหรับการอ่านเพิ่มเติม

  • A018837 : จำนวนขั้นตอนสำหรับอัศวินที่จะไปถึง (n, 0) บนกระดานหมากรุกไม่มีที่สิ้นสุด
  • A018838 : จำนวนขั้นตอนสำหรับอัศวินที่จะไปถึง (n, n) บนกระดานหมากรุกไม่มีที่สิ้นสุด
  • A065775 : อาร์เรย์ T อ่านโดยเส้นทแยงมุม: T (i, j) = จำนวนการเคลื่อนที่ของอัศวินน้อยที่สุดบนกระดานหมากรุก (ไม่มีที่สิ้นสุดในทุกทิศทาง) จำเป็นต้องย้ายจาก (0,0) ถึง (i, j)
  • A183041 : จำนวนการเคลื่อนที่ของอัศวินน้อยที่สุดจาก (0,0) ถึง (n, 1) บนกระดานหมากรุกไม่มีที่สิ้นสุด

คุณอาจจะใช้การอ้างอิงของสูตรที่กำหนดในoeis.org/A065775
TSH

2
ฉันสามารถรับอินพุตเป็นจำนวนเชิงซ้อนได้x+yiหรือไม่
Lynn

1
@ ลินน์ฉันคิดว่ามันเป็นที่ยอมรับ
tsh

@ user202729 อัปเดตข้อมูลโค้ดเพื่อแสดงผลลัพธ์
tsh

แผนที่ที่ดีมาก
Willtech

คำตอบ:


11

ภาษา Wolfram (Mathematica) , 64 ไบต์

การใช้งานในKnightTourGraphตัว

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

GraphDistance[KnightTourGraph@@({x,y}=Abs@{##}+4),y+2,(x-2)y-2]&

ลองออนไลน์!

ArrayPlot @ อาร์เรย์ [GraphDistance [KnightTourGraph @@ ({x, y} = Abs @ {##} + 5) 2y + 3 (x-2) Y-2] & {} 65,65, - 32]


14
Mathematica builtins หยุดงานประท้วงอีกครั้ง
qwr

1
สั้นกว่าเล็กน้อย:GraphDistance[KnightTourGraph@@({x,y}=Abs@{##}+5),2y+3,(x-2)y-2]&
Lukas Lang

ภาษานี้มีอะไรบ้าง บิวด์อินทั้งหมดเหล่านี้ถูกโหลดล่วงหน้าอย่างไร การพยายามเติมวลีด้วยแท็บใช้เวลานานหรือไม่?
OganM

@OganM Mathematica ไม่สนับสนุนการเติมข้อความอัตโนมัติในอินเตอร์เฟสบรรทัดคำสั่ง ความสำเร็จในอินเตอร์เฟซอัตโนมัติโน๊ตบุ๊คที่มีลักษณะเช่นนี้
alephalpha

1
@OganM ผู้พัฒนาอาจใช้ Trie (โครงสร้างข้อมูล) หรือค้นหาแบบไบนารี่ในรายการเรียงลำดับบิวด์อิน ใช่ทำไมค้นหาเชิงเส้น? | โปรดทราบว่า Mathematica เป็นภาษาที่ไม่ใช้ภาษาปิดดังนั้นจึงไม่มีใครรู้ว่าตัวทำนายนั้นทำงานอย่างไร | โปรแกรมเมอร์จริงไม่จำเป็นต้องทำการเติมให้อัตโนมัติ : P
user202729

7

JavaScript (ES6), 90 75 72 ไบต์

แรงบันดาลใจจากสูตรที่กำหนดสำหรับA065775 ช้าเหมือนระยะทางไกล (ไม่มาก)

f=(x,y,z=x|y)=>z<0?f(-y,x):z>1?1+Math.min(f(x-1,y-2),f(x-2,y-1)):z*3^x&y

ลองออนไลน์!

อย่างไร?

เรากำหนดZเป็นค่าที่เหมาะสมหรือระหว่างxและy ที่

ขั้นตอนที่ 1

ก่อนอื่นเราต้องแน่ใจว่าเราอยู่ในจตุภาคที่เฉพาะเจาะจงโดยบังคับให้ทั้งxและyเป็นแบบไม่ลบ ตราบใดที่z <0 (ซึ่งหมายความว่าxหรือyเป็นลบ) เราจะประมวลผลการเรียกแบบเรียกซ้ำf (-y, x) :

(+1, -2) --> (+2, +1)
(-1, +2) --> (-2, -1) --> (+1, -2) --> (+2, +1)
(-1, -2) --> (+2, -1) --> (+1, +2)

ขั้นตอนที่ 2

ในขณะที่เรามีz> 1 (ซึ่งหมายความว่าxหรือyมากกว่า1 ) เราลองวนซ้ำสองครั้งที่ทำให้เราเข้าใกล้(0, 0) : f (x-1, y-2)และf ( x-2, y-1) ในที่สุดเราก็รักษาเส้นทางที่สั้นที่สุด

ขั้นตอนที่ # 3

เมื่อzน้อยกว่าหรือเท่ากับ1เราจะเหลือ 3 ความเป็นไปได้ที่จะประมวลผลด้วยz*3^x&y(เราสามารถใช้z*3-x*yแทน):

  • x & y == 1หมายถึงx | Y == 1และวิธีการที่x y = = 1 เราต้องการการเคลื่อนไหวอีกสองครั้งเพื่อให้บรรลุ(0, 0) :

    2 ย้าย

  • x & y == 0และx | Y == 1หมายความว่าเรามีทั้งx = 1 / Y = 0หรือx = 0 / y = 1 เราต้องการการเคลื่อนไหวอีกสามครั้งเพื่อให้ถึง(0, 0) :

    3 ย้าย

  • x & y == 0และx | y == 0หมายความว่าเรามีx = y = 0แล้ว

กราฟิกที่ยืมมาจากchess.com


5

Python 3 , 90 ไบต์

ขอบคุณ tsh สำหรับ -11 ไบต์!

def f(x,y):x=abs(x);y=abs(y);s=x+y;return(.9+max(x/4,y/4,s/6)-s/2+(s==1or x==y==2))//1*2+s

ลองออนไลน์!

(การจัดรูปแบบโค้ดแบบอินไลน์เพื่อหลีกเลี่ยงผู้อ่านต้องเลื่อนขออภัย แต่ฉันต้องตีกอล์ฟโปรแกรมของฉัน)

มีประสิทธิภาพมากมาก


ฉันจะมากับสิ่งนี้ได้อย่างไร!

1. ความเท่าเทียมกัน

สมมติว่าบอร์ดทั้งหมดมีสีในรูปแบบของกระดานหมากรุก (นั่นคือเซลล์ที่มีx+yคี่และx+yสีต่าง ๆ ด้วย)

โปรดทราบว่าแต่ละขั้นตอนจะต้องข้ามไปมาระหว่างเซลล์ที่มีสีต่างกันสองเซลล์ ดังนั้น:

  • x+yเท่าเทียมกันของจำนวนของขั้นตอนที่จะต้องเท่ากับความเท่าเทียมกันของ

2. การประมาณ

ถือว่าอัศวินเริ่มต้นจากการประสานงาน(0,0)และได้ย้ายไปตามขั้นตอนและปัจจุบันอยู่ที่n สำหรับความเรียบง่ายสมมติ, เราสามารถสรุปได้:(x,y)
x ≥ 0y ≥ 0

  • เนื่องจากแต่ละขั้นตอนที่xเพิ่มขึ้นโดยที่มากที่สุด,2 x ≤ 2×nในทำนองเดียวกัน, y ≤ 2×n.
  • เนื่องจากแต่ละขั้นตอนที่x+yเพิ่มขึ้นโดยที่มากที่สุด,3x+y ≤ 3×n

ดังนั้นการที่n ≥ l(x,y) l(x,y) = max(max(x,y)/2, (x+y)/3(หมายเหตุว่าเราไม่จำเป็นต้องมี-xหรือx-yในสูตรเพราะสมมติฐานx ≥ 0 and y ≥ 0ดังนั้นx+y ≥ max(x-y,y-x,-x-y)และx ≥ -x, y ≥ -y)

แต่กลับกลายเป็นว่าเป็นการประมาณการที่ดีในการa(x,y) = round(0.4 + l(x,y))n

  • สมมติว่าa(x,y)เป็นการประมาณที่มีข้อผิดพลาดน้อยกว่า1ค่าที่ถูกต้องจะได้รับจาก

    f(x,y) = round((a(x,y) - (x+y)) / 2) * 2 + (x+y)

    (ปัดเศษภายใต้การลบx+yและหารด้วย 2)

3. กรณีพิเศษที่ล้มเหลวในสูตร

สมมติและx ≥ 0 y ≥ 0มี 2 ​​กรณีพิเศษที่อัลกอริทึมล้มเหลว:

  • x == 1 and y == 0หรือx == 0 and y == 1: ขั้นตอนวิธีการที่ไม่ถูกต้องจะส่งกลับในขณะที่คำตอบที่ถูกต้องคือ13
  • x == y == 2: ขั้นตอนวิธีการที่ไม่ถูกต้องจะส่งกลับในขณะที่คำตอบที่ถูกต้องคือ24

ดังนั้นเป็นกรณีพิเศษ เพิ่มผลลัพธ์โดย2หากมูลค่าของxและyเป็นหนึ่งในนั้น


1
@tsh แต่นั่นก็เป็นความจริงx==y==0เช่นกัน
user202729

ทำไมmax(x+y,x-y,y-x)?
tsh

@tsh: ไม่โปรดดู: x = -5, y = 5. x + y = 0, abs (xy) = 10 ดังนั้น x + y <abs (xy)
โนวา

@ โนวา "สมมติx ≥ 0และy ≥ 0"
user202729


4

TI-Basic, 86 54 ไบต์

อ้างอิงโซลูชันที่เก่ากว่าของ @ user202729

Input :abs(X->C:abs(Y->D:C+Ans
Ans+2int(.9+(S=1 or C=2 and D=2)-.5Ans+max({C/4,D/4,Ans/6

2

MATL , 29 ไบต์

`JEQ2J-htZjht_h@Z^2&sG=~}@Gg*

อินพุตเป็นจำนวนเชิงซ้อนที่มีจำนวนเต็มจริงและส่วนจินตภาพ

รหัสไม่มีประสิทธิภาพมาก ความต้องการหน่วยความจำของมันเพิ่มขึ้นชี้แจงกับเอาท์พุท มันหมดเวลาใน TIO สำหรับกรณีทดสอบที่มีเอาต์พุตเกิน 7

ลองออนไลน์!


2

Haskell, 79 72 ไบต์

p l|elem(0,0)l=0|r<-[-2..2]=1+p[(x+i,y+j)|(x,y)<-l,i<-r,j<-r,(i*j)^2==4]

ลองออนไลน์!

รับอินพุตเป็นรายการคู่ของตัวเลข

แรงเดรัจฉานง่าย ๆ ต้องการเวลาและหน่วยความจำมากสำหรับผลลัพธ์> 8 เริ่มต้นด้วยรายการองค์ประกอบเดียวของพิกัด (อินพุต) ซ้ำ ๆ เพิ่มตำแหน่งทั้งหมดที่สามารถเข้าถึงได้สำหรับทุกองค์ประกอบจนกว่า(0,0)จะอยู่ในรายการนี้ ติดตามระดับการสอบถามซ้ำและส่งกลับเป็นผลลัพธ์

แก้ไข: -7 ไบต์ขอบคุณ @Lynn



1

JavaScript (ES6), 90 78 ไบต์

f=(x,y)=>y<0?f(x,-y):x<y?f(y,x):x+y<3?4-x-y&3:x-3|y-1?x-4|y-3?f(x-2,y-1)+1:3:2

แก้ไข: บันทึกไว้ 12 ไบต์ขอบคุณที่ @supercat ชี้ให้เห็นว่าx<0หมายถึงการอย่างใดอย่างหนึ่งหรือy<0 x<yคำอธิบาย: นี่เป็นโซลูชันแบบเรียกซ้ำ สองเงื่อนไขแรกเพียงแค่ให้แน่ใจว่าควอดเรนท์ที่เหมาะสมสำหรับเงื่อนไขอื่น ๆ เงื่อนไขที่สามสร้างคำตอบสำหรับพิกัดใกล้กำเนิดในขณะที่เงื่อนไขสองข้อสุดท้ายจัดการกับกรณีพิเศษอีกสองกรณี (สั้นกว่าการทดสอบทั้งสองย้าย 1 ไบต์)

0
32
2++
+2++
+++3+
++++++
(etc.)

สี่เหลี่ยมจัตุรัสที่มีเครื่องหมายทั้งหมด+สามารถกำหนดได้โดยเลื่อนไปยังจุดกำเนิดโดยตรงแล้ววนซ้ำ


คุณต้องการการx<0ทดสอบหรือไม่? ให้เช่น -3,6 การx<yทดสอบจะเปลี่ยนเป็น 6, -3 ซึ่งการy<0ทดสอบจะกลายเป็น 6,3 ซึ่งการx<yทดสอบจะกลายเป็น 3,6
supercat

@supercat แน่นอนเช่นเดียวกับ Python ที่จะพูดว่าx>=y>=0...
Neil

1

Kotlin , 148 146 140 bytes

fun s(x:Int,y:Int):Int=if(y<0)s(x,-y)else
if(x<y)s(y,x)else if(x+y<3)4-x-y and 3
else if(x!=3||y!=1)if(x!=4||y!=3)s(x-2,y-1)+1
else 3 else 2

ลองออนไลน์!


:Intค่อนข้างแน่ใจว่าคุณไม่จำเป็นต้องระบุประเภทการคืนสินค้า
กำหนด

ฟังก์ชั่นแบบเรียกซ้ำต้องใช้ชนิดส่งคืนเนื่องจากคอมไพเลอร์ไม่ฉลาดพอที่จะจำแนกประเภทได้
JohnWells

1
โอ้ฉันพลาดสายเรียกซ้ำ อ๊ะโอ้
อังคารที่

1

เยลลี่ , 27 26 25 23 ไบต์

1,-pḤµ;UÆị
¢ṗS€;0i
0ç1#

ลองออนไลน์!

ช้ามาก; หมดเวลากับ TIO สำหรับเอาต์พุตมากกว่า 6 ใช้จำนวนเชิงซ้อนเป็นอินพุต

คำอธิบาย

รหัสใช้ตัวเลขที่ซับซ้อนเพราะมันสั้นกว่าในขั้นตอนกลางและมันก็ดูเร็วขึ้นเช่นกัน คุณสามารถใช้คู่โดยการลบÆiและแทนที่0ด้วย0,0ในบรรทัดที่สอง

1,-pḤµ;UÆị    Helper link. No arguments.
1,-             Get the pair [1,-1].
    Ḥ           Double each to get [2,-2].
   p            Cartesian product: get [[1,2],[1,-2],[-1,2],[-1,-2]].
     µ          Start a new chain with the list of pairs as argument.
       U        Reverse each pair.
      ;         Append the reversed pairs to the list.
        Æi      Convert each pair [real,imag] to a complex number.

¢ṗS€;0i    Helper link. Arguments: iterations, target
¢            Call the previous link to get knight moves as complex numbers.
 ṗ           Get the iterations-th Cartesian power of the list. This will
             yield 8^n tuples containing move sequences.
  S€         Sum each move sequence to get the resulting square.
    ;0       Add the starting square, since the zeroth iteration results
             in no move sequences.
      i      Find the target squares (1-based) index in the results, or 0.

0ç1#    Main link. Argument: target
0         Starting from 0,
   #      find the
  1       first number of iterations where
 ç        calling the previous link results in a nonzero result.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.