কত চাল?


16

দাবা বোর্ডে দুটি পৃথক অবস্থান এবং টুকরোটির ধরণ দেওয়া, সেই টুকরোটিকে এক অবস্থান থেকে অন্য অবস্থানে যেতে সর্বনিম্ন সংখ্যাটি আউটপুট দেয়।

বিধি

প্রদত্ত টুকরাটি কিং, কুইন, রুক, নাইট এবং বিশপ হতে পারে। (এই ইনপুটটি যে কোনও 5 টি অনন্য অক্ষর হিসাবে নেওয়া যেতে পারে)

২ টি অবস্থান যে কোনও সুবিধাজনক বিন্যাসে নেওয়া যেতে পারে,

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
কিংকে 12 থেকে a1-h6 কেন দরকার? কিং কি ডায়াগ যেতে পারে না?
l4m2

@ l4m2, সংশোধন করেছেন
বেদন্ত কান্দোই

1
@ এনজিএন, আপনি অপরিবর্তনীয়তা নির্দেশ করতে 0 ব্যবহার করতে পারেন, 2 পজিশন সর্বদা আলাদা হবে।
বেদন্ত কান্দোই


1
প্রাকৃতিক সংখ্যার কিছু সংজ্ঞা (যেমন আইএসও-80000-2) এর মধ্যে রয়েছে 0 টি "ইতিবাচক পূর্ণসংখ্যা" সহ প্রতিস্থাপনের প্রস্তাব দেওয়া হয়।

উত্তর:


9

জাভাস্ক্রিপ্ট (নোড.জেএস) , 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)

এটি অনলাইন চেষ্টা করুন!

প্রান্তের মামলার জন্য এতক্ষণ, চেক করার জন্য আরনাউল্ডকে ধন্যবাদ জানাই। নাইট পরীক্ষা


@ আরনাউল্ড ওয়েল কর্নারের সত্যিই ব্যয়
l4m2

আমি মনে করি আপনি শেষেরটি maxবার্নিশ দিয়ে প্রতিস্থাপন করে বাইট সংরক্ষণ করতে পারবেন ।
শেগি

170 বাইট (আমি মনে করি। আমি আমার ফোনে আছি))
শেগি

@ শেগি আর্নল্ড সেই ভুলটিকে ইঙ্গিত করেছেন
l4m2

6

এপিএল (ডায়ালগ ক্লাসিক) , 117 107 105 103 98 97 95 92 89 87 বাইট

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

এটি অনলাইন চেষ্টা করুন!

বাম আর্গুম টুকরো টাইপ: 0 = কিং, 1 = রানী, 2 = রোক, 3 = নাইট, 4 = বিশপ; ডান দিকের আর্গ একটি কর্ডের 2x2 ম্যাট্রিক্স, প্রতিটি সারি একটি অবস্থান প্রতিনিধিত্ব করে; অ্যাক্সেসযোগ্যের জন্য 0 প্রদান করে

|-⌿⍵ জোড়াটি গণনা করে [অ্যাবস (∆x), অ্যাবস (∆y)]

(⍎⍺⊃... )⊣"..." তালিকা থেকে একটি অভিব্যক্তি চয়ন করে; যদি এটি কোনও ফাংশন হয় তবে এটি প্রয়োগ করা হয় |-⌿⍵; যদি এটির মান হয় (এটি কেবল একটি নাইটের জন্য ঘটে), এটি পরিবর্তে এটি ফেরত নিশ্চিত করে|-⌿⍵

  • রাজা: সর্বোচ্চ (⌈/ অ্যাবস-এর )

  • রানী: শূন্যগুলি মুছে ফেলুন ( ~∘0) এবং গণনা করুন ( ) অনন্য ( )

  • রোক: সংকেতের যোগফল ( +/একাকী ×; 0 এর জন্য 0, ধনাত্মক হিসাবে 1)

  • নাইট: {⍺∊⍵:0⋄1+⍺∇i/⍨∨⌿2=|×/↑⍵∘.-i←,⍳8 8}/,¨⊂¨↓⍵- প্রাথমিক অবস্থানের সাথে শুরু করুন এবং চূড়ান্ত অবস্থানটি সেটে না আসা পর্যন্ত পুনরাবৃত্তভাবে নাইট চালের প্রজন্মের গণনা করুন; প্রত্যাবর্তন গভীরতা

  • বিশপ: দুটি of-এর অংশ সমান? ( 2=.|⊢, এর সমতুল্য =/2|⊢) গণনা-অনন্য ( ≢∘∪) দ্বারা বুলিয়ান ফলাফল (0 বা 1) গুণন করুন


আমি ভালোবাসি ⍎⍺⊃। খুব চালাক.
জে স্যালা

@ J.Sallé ধন্যবাদ
ngn

2

জাভা (জেডিকে) , 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 বাইট আর্নল্ডকে ধন্যবাদ জানাতে , পাশাপাশি আমাকে উপলব্ধি করার জন্য যে আমার সমস্ত কর্নার-কেসে আমার সমস্যা ছিল।

1

কাঠকয়লা , 108 বাইট

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

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

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

বোর্ডের সমস্ত 64 স্কোয়ারকে পূর্বনির্ধারিত খালি তালিকা ভেরিয়েবলের তালিকাভুক্ত করুন।

≔⟦⟦η⟧⟧δ

যার প্রথম প্রবেশটি শুরুর অবস্থান সম্বলিত তালিকার একটি তালিকা তৈরি করুন।

W¬№§δ±¹ζ

তালিকার শেষ এন্ট্রি শেষ অবস্থান উপস্থিত না হওয়া পর্যন্ত পুনরাবৃত্তি করুন।

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

সমস্ত বোর্ড পজিশনগুলিকে ফিল্টার করুন যা তালিকার তালিকার তালিকার শেষ প্রবেশের কোনও প্রবেশ থেকে দূরে থাকা নাইটের পদক্ষেপ এবং সেই তালিকাটিকে তালিকার তালিকায় ঠেলাও push এর মধ্যে পূর্বে পরিদর্শন করা অবস্থানগুলি অন্তর্ভুক্ত রয়েছে তবে আমরা সেগুলিতে কোনওভাবেই আগ্রহী ছিলাম না, তাই শেষ পজিশনের জন্য আমরা বোর্ডের প্রস্থের প্রথম তল্লাশীর সাথে শেষ করি।

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

শুরু এবং শেষের অবস্থানের মধ্যে পরম স্থানাঙ্কের পার্থক্য গণনা করুন।

≡θ

ইনপুট টুকরা উপর ভিত্তি করে নির্বাচন করুন।

KI⌈ε

যদি এটি রাজা থাকে তবে সর্বোচ্চ নিখুঁত স্থানাঙ্ক পার্থক্যটি মুদ্রণ করুন।

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

যদি এটি রানী হয় তবে দুটি পার্থক্য সমান না হলে বা একটিটি শূন্য না হলে 2 মুদ্রণ করুন।

RI∨¬⌊ε²

যদি এটি কোনও রুক হয় তবে পার্থক্যগুলির একটির শূন্য না হলে 2 মুদ্রণ করুন।

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

এটি যদি বিশপ হয় তবে স্কোয়ারগুলি বিপরীত প্যারিটির হলে 0 মুদ্রণ করুন অন্যথায় দুটি পার্থক্য সমান না হলে 2 মুদ্রণ করুন।

NI⊖Lδ

যদি এটি নাইট হয় তবে শেষের অবস্থানটি সন্ধান করতে নেওয়া লুপের সংখ্যাটি মুদ্রণ করুন।


1

জাপট , 67 বাইট

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

এটি অনলাইন চেষ্টা করুন!

এটি বেশ অভিজ্ঞতা ছিল। আমি দুর্দান্ত এপিএল উত্তর থেকে প্রচুর অনুপ্রেরণা নিয়েছি । আমার সন্দেহ হয় বিশেষত নাইট কোডে এখনও প্রচুর গল্ফিং সম্ভব।

ফর্মগুলিতে অবস্থানগুলি প্রথম ইনপুট [[x1,x2],[y1,y2]] । এটি ভাল কাজ করা উচিত[[y1,y2],[x1,x2]] পাশাপাশি ভাল । 0 = রাজা, 1 = রানী, 2 = নাইট, 3 = রুক, 4 = বিশপ সহ পিস নির্বাচন দ্বিতীয় ইনপুট। নোট এবং রুক এপিএল উত্তরের তুলনায় অদলবদল করা আছে তা নোট করুন।

ব্যাখ্যা:

®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

@ ইথ প্রডাকশনস ভাল পরামর্শ। আমি এগুলিতে রাখার সময় আমি খুঁজে পেলাম যে এটি যথেষ্ট áসংক্ষিপ্ত করে তোলে [[1,2][2,1]]
কামিল দ্রাকারী

বাহ, কখনও ব্যবহার করার কথা ভাবেনি á, সুন্দর!
ETH প্রোডাকশনস

আরও কয়েকটি প্রস্তাব: Uপরে অন্তর্ভুক্ত @, তাই আপনি নাইট ফাংশনে দুটি বাইট সংরক্ষণ করতে পারেন। আপনি @=ã ü;অন্যটি সংরক্ষণ করতে এটি শুরু করেও দিতে পারেন । (দ্যã
কৌতুকটিও

@ ইথ প্রডাকশনগুলি ভাল সন্ধান করুন, যে সময়গুলি যখন ইউকে বোঝানো হয় তখন এমন একটি বিষয় যা আমি এখনও পুরোপুরি উপলব্ধি করতে পারি নি।
কামিল দ্রাকারী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.