มีการเคลื่อนไหวกี่ครั้ง?


16

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

กฎระเบียบ

ผลงานชิ้นนี้สามารถเป็นราชา, ราชินี, โกง, อัศวินและบิชอป (อินพุตนี้สามารถใช้เป็นอักขระที่ไม่ซ้ำกัน 5 ตัว)

ตำแหน่งที่ 2 สามารถถ่ายในรูปแบบที่สะดวกใด ๆ

Example:
a8 b8 c8 d8 ... h8
a7 b7 c7 d7 ... h7
...
...
a1 b1 c1 d1 ... h1

ในกรณีที่ชิ้นส่วนไม่สามารถไปถึงที่นั่นได้ให้ส่งสิ่งอื่นนอกเหนือจากจำนวนเต็มบวก

ตัวอย่าง

i/p ---- o/p
King
a1,a4    3
a1,h6    7
b3,h5    6

Queen
a1,a4    1
a1,h6    2
b3,f7    1

Rook
a1,a4    1
a1,h6    2
h2,c7    2

Knight
a1,a4    3
a1,h6    4
b2,d3    1
b2,c3    2
b3,c3    3
a1,b2    4

Bishop
a1,a4    -1
a1,h6    2
b2,d3    -1
e1,h4    1

1
ทำไม King ถึงต้องการ 12 ถึง a1-h6 กษัตริย์ไม่สามารถวินิจฉัยได้
l4m2

@ l4m2 แก้ไขแล้ว
Vedant Kandoi

1
@ngn คุณสามารถใช้ 0 เพื่อระบุถึงการไม่สามารถเข้าถึงได้ 2 ตำแหน่งจะแตกต่างกันเสมอ
Vedant Kandoi


1
คำจำกัดความบางอย่าง (เช่น ISO-80000-2) ของจำนวนธรรมชาติรวมถึง 0 แนะนำให้ทดแทนด้วย "จำนวนเต็มบวก"

คำตอบ:


9

JavaScript (Node.js) , 183 180 179 ไบต์

with(Math)(a,b,c,d,t,x=abs(a-c),y=abs(b-d),v=x<y?y:x,q=0|.9+max(/[18][18]/.test(a+b+9+c+d)-v?x/2:3,y/2,x*y?x*y-4?(x+y)/3:3:2))=>t?t==2&x+y?0:t&1>x*y|t/2&x==y?1:t<4?2:v:q+(q+x+y&1)

ลองออนไลน์!

นานมาแล้วสำหรับกรณีขอบขอบคุณ Arnauld สำหรับการตรวจสอบ ทดสอบอัศวิน


@Arnauld Well corner เสียค่าใช้จ่ายจริงๆ
l4m2

ฉันคิดว่าคุณอาจจะสามารถบันทึก byte โดยแทนที่สุดท้ายmaxด้วย ternary
Shaggy

170 ไบต์ (ฉันคิดว่าฉันอยู่ในโทรศัพท์ของฉัน)
Shaggy

@Shaggy เป็นสิ่งที่ Arnauld ชี้ว่าผิด
l4m2

6

APL (Dyalog Classic) , 117 107 105 103 98 97 95 92 89 87 ไบต์

{(⍎⍺⊃'⌈/' '≢∘∪~∘0' '+/×' '{⍺∊⍵:0⋄1+⍺∇i/⍨∨⌿2=|×/↑⍵∘.-i←,⍳8 8}/,¨⊂¨↓⍵' '≢∘∪×2=.|⊢')⊣|-⌿⍵}

ลองออนไลน์!

ARG ซ้ายเป็นประเภทชิ้นส่วน: 0 = ราชา, 1 = ราชินี, 2 = โกง, 3 = อัศวิน, 4 = บิชอป; arg ขวาคือเมทริกซ์ 2x2 ของ coords แต่ละแถวแทนตำแหน่ง; ส่งคืนค่า 0 สำหรับการเข้าถึงไม่ได้

|-⌿⍵ คำนวณทั้งคู่ [abs (∆x), abs (∆y)]

(⍎⍺⊃... )⊣เลือกนิพจน์จากรายการ "... " ถ้ามันเป็นฟังก์ชั่นมันจะใช้กับ|-⌿⍵; หากเป็นค่า (สิ่งนี้เกิดขึ้นเฉพาะกับอัศวินเท่านั้น) ตรวจสอบให้แน่ใจว่าได้คืนมันแทน|-⌿⍵

  • king: สูงสุด ( ⌈/) ของ abs ∆-s

  • queen: ลบศูนย์ ( ~∘0) และ count ( ) ที่ไม่ซ้ำกัน ( )

  • rook: sum ( +/) of signa (monadic ×; 0 สำหรับ 0, 1 สำหรับค่าบวก)

  • knight: {⍺∊⍵:0⋄1+⍺∇i/⍨∨⌿2=|×/↑⍵∘.-i←,⍳8 8}/,¨⊂¨↓⍵- เริ่มต้นด้วยตำแหน่งเริ่มต้นและคำนวณการเคลื่อนที่ของอัศวินหลาย ๆ ครั้งจนกระทั่งตำแหน่งสุดท้ายอยู่ในเซต กลับความลึกของการเรียกซ้ำ

  • อธิการ: ความเท่าเทียมกันของสองคนนั้นเท่ากันหรือไม่? ( 2=.|⊢เทียบเท่า=/2|⊢) คูณผลลัพธ์บูลีน (0 หรือ 1) ด้วยจำนวนเฉพาะ ( ≢∘∪)


⍎⍺⊃ฉันรัก ฉลาดมาก.
J. Sallé

@ J.Salléขอบคุณ
ngn

2

Java (JDK) , 229 ไบต์

(p,a,b,c,d)->{c^=a/4*7;a^=a/4*7;d^=b/4*7;b^=b/4*7;int x=c<a?a-c:c-a,y=d<b?b-d:d-b,z=(x^=y^(y=y<x?y:x))-y;return p<1?x:p<2?z*y<1?1:2:p<3?2-z%2:p<4?x+y<2?3:(a<c?a+b:c+d)+x<2|x==2&z<1?4:z+2*Math.ceil((y-z)/(y>z?3:4.)):z<1?1:~z*2&2;}

ลองออนไลน์!

คำอธิบาย

  • กระดานเป็นบอร์ดแบบ 0
  • คืนค่าเป็นจำนวนเต็มแสดงเป็นคู่ จะไม่มีส่วนทศนิยมใด ๆ

รหัส:

(p,a,b,c,d)->{                          // double-returning lambda.
                                        // p is the piece-type (0: king, 1: queen, 2: rook, 3: knight, 4: bishop)
                                        // a is the origin-X
                                        // b is the origin-Y
                                        // c is the destination-X
                                        // d is the destination-Y
 c^=a/4*7;a^=a/4*7;                     // Mirror board if origin is in the top part of the board
 d^=b/4*7;b^=b/4*7;                     // Mirror board if origin is in the left part of the board
 int x=c<a?a-c:c-a,                     // x is the X-distance between a and c
     y=d<b?b-d:d-b,                     // y is the Y-distance between b and d
     z=(x^=y^(y=y<x?y:x))-y;            // z is the delta between x and y
                                        // also, swap x and y if necessary so that x is the greater value.
               //    At this point,
               //     x      cannot be 0 (because the two positions are different)
               //     z<1    means the origin and destination are on the same diagonal
               //     y<1    means the origin and destination are on the same horizontal/vertical line
 return
  p<1?x:                                //  For a king, just take the max distance.
  p<2?z*y<1?1:2:                        //  For a queen, just move once if in direct line, or twice.
  p<3?2-z%2:                            //  For a rook, just move once if on the same horizontal or vertical line, or twice
  p<4?                                  //  For a knight, 
   x+y<2?3:                             //   Hardcode 3 if moving to the next horizontal/vertical square
   (a<c?a+b:c+d)+x<2|x==2&z<1?4:        //   Hardcode 4 if moving 2 cases in diagonal or one case in diagonal in a corner.
   z+2*Math.ceil((y-z)/(y>z?3:4.)):     //   Compute the number of moves necessary for the usual cases
  z<1?1:                                //  For a bishop, hardcode 1 if they are on the same diagonal
   ~z*2&2;                              //   Return 2 if they have the same parity else 0.
}

เครดิต

  • -2 ไบต์ต้องขอบคุณArnauldและทำให้ฉันรู้ว่าฉันมีปัญหากับมุมคดีทั้งหมดของฉัน

1

ถ่าน , 108 ไบต์

F…β⁸F⁸⊞υ⁺ι⊕κ≔⟦⟦η⟧⟧δW¬№§δ±¹ζ⊞δΦυΦ§δ±¹⁼⁵ΣEμX⁻℅ξ℅§κπ²≔Eη↔⁻℅ι℅§ζκε≡θKI⌈εQI∨∨¬⌊ε⁼⊟ε⊟ε²RI∨¬⌊ε²BI∧¬﹪Σε²∨⁼⊟ε⊟ε²NI⊖Lδ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

F…β⁸F⁸⊞υ⁺ι⊕κ

ทำรายการทั้งหมด 64 ช่องของบอร์ดลงในตัวแปรรายการว่างที่กำหนดไว้ล่วงหน้า

≔⟦⟦η⟧⟧δ

ทำรายการของรายการที่มีรายการแรกคือรายการที่มีตำแหน่งเริ่มต้น

W¬№§δ±¹ζ

ทำซ้ำจนกระทั่งรายการสุดท้ายของรายการมีตำแหน่งสิ้นสุด

⊞δΦυΦ§δ±¹⁼⁵ΣEμX⁻℅ξ℅§κπ²

กรองตำแหน่งกระดานทั้งหมดที่เป็นอัศวินย้ายออกจากรายการใด ๆ ในรายการสุดท้ายของรายการของรายการและผลักดันรายการนั้นไปยังรายการของรายการ ซึ่งรวมถึงตำแหน่งที่เคยไปก่อนหน้านี้ แต่เราไม่ได้สนใจในตำแหน่งเหล่านั้นดังนั้นเราจึงจบลงด้วยการค้นหาตำแหน่งบอร์ดครั้งแรกในวงกว้าง

≔Eη↔⁻℅ι℅§ζκε

คำนวณความแตกต่างของพิกัดร่วมระหว่างตำแหน่งเริ่มต้นและจุดสิ้นสุด

≡θ

เลือกตามชิ้นส่วนอินพุต

KI⌈ε

หากเป็นราชาให้พิมพ์ความแตกต่างของพิกัดสูงสุดแบบสัมบูรณ์

QI∨∨¬⌊ε⁼⊟ε⊟ε²

หากเป็นราชินีให้พิมพ์ 2 เว้นแต่ว่าความแตกต่างทั้งสองจะเท่ากันหรือมีค่าเป็นศูนย์

RI∨¬⌊ε²

ถ้ามันเป็นเกมโกงพิมพ์ 2 เว้นแต่ความแตกต่างอย่างใดอย่างหนึ่งคือศูนย์

BI∧¬﹪Σε²∨⁼⊟ε⊟ε²

ถ้าเป็นบิชอปให้พิมพ์ 0 ถ้ากำลังสองเป็นสี่เหลี่ยมตรงข้ามกันมิฉะนั้นจะพิมพ์ 2 เว้นแต่ความแตกต่างทั้งสองจะเท่ากัน

NI⊖Lδ

หากเป็นอัศวินให้พิมพ์จำนวนลูปที่ถ่ายเพื่อค้นหาตำแหน่งสิ้นสุด


1

Japt , 67 ไบต์

®ra
g[_rw}_â è}@=ã ü;@pUÌïVõ á ÈíaY})Ìde[TT]}a Ä}_è}_ra v *Zâ l}]gV

ลองออนไลน์!

นั่นเป็นประสบการณ์ที่ค่อนข้าง ฉันใช้แรงบันดาลใจมากมายจากคำตอบ APL ที่ยอดเยี่ยมคำตอบฉันสงสัยว่ามีการเล่นกอล์ฟจำนวนมากยังคงเป็นไปได้โดยเฉพาะอย่างยิ่งในรหัสอัศวิน

[[x1,x2],[y1,y2]]ตำแหน่งที่มีการป้อนข้อมูลเป็นครั้งแรกในรูปแบบ มันควรจะทำงานได้ดี[[y1,y2],[x1,x2]]เช่นกัน การเลือกชิ้นส่วนเป็นอินพุตที่สองโดยมี 0 = king, 1 = queen, 2 = knight, 3 = rook, 4 = bishop โปรดทราบว่า Knight and Rook ถูกสลับสับเปลี่ยนเมื่อเปรียบเทียบกับคำตอบ APL

คำอธิบาย:

®ra         :Turn absolute positions into relative movement and store in U
®           : For each of X and Y
 ra         : Get the absolute difference between the start position and the end position

g[...]gV    :Apply the appropriate function
 [...]      : A list of functions
      gV    : Get the one indicated by the second input
g           : Apply it to U

_rw}        :King function
 rw         : Get the maximum of X and Y

_â è}       :Queen function
 â          : Get unique elements
   è        : Count non-zero elements

@=ã ü;@pUÌï2õ á ÈíaY})Ìde[TT]}a Ä}  :Knight function
 =ã ü;                              : Wrap U twice (U -> [[U]])
      @                      }a Ä   : Repeat until True; return number of tries:
        UÌ                          :  Get the previous positions
          ï                         :  Cartesian product with:
           2õ                       :   The range [1,2]
              á                     :   All permutations, i.e. [[1,2],[2,1]]
                ÈíaY})              :  Apply each move to each position
       p                            :  Store the new positions
                      Ìde[TT]       :  True if any are at the destination

_è}         :Rook function
 è          : Count non-zero elements

_ra v *Zâ l}    :Bishop function
 ra             : Absolute difference between X and Y
    v           : Is divisible by 2? (returns 1 or 0)
      *         : Times:
       Zâ       :  Get the unique elements
          l     :  Count them

@ETHproductions คำแนะนำที่ดี ในขณะที่ฉันวางมันลงในฉันพบว่าáทำงานได้สั้นลง[[1,2][2,1]]อย่างมาก
Kamil Drakari

ว้าวคงไม่เคยคิดที่จะใช้áดีอย่างนี้!
ETHproductions

คำแนะนำเพิ่มเติมสองสามข้อ: Uเป็นนัยหลังจาก@คุณสามารถบันทึกสองไบต์ในฟังก์ชันอัศวิน นอกจากนี้คุณยังสามารถเริ่มต้นด้วย@=ã ü;การบันทึกอื่น ( ãเคล็ดลับก็มีความฉลาดเช่นกัน :-))
ETHproductions

@ETHproductions พบว่าดีเวลาที่ U บอกเป็นนัย ๆ คือสิ่งที่ฉันยังไม่เข้าใจอย่างสมบูรณ์
Kamil Drakari
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.