কোথায় নাইট এন চালায় থাকতে পারে?


21

এই গর্ত -3 থেকে শরত টুর্নামেন্ট APL CodeGolf এর । আমি সেখানে সমস্যার মূল লেখক এবং এইভাবে এখানে এটি আবার পোস্ট করার অনুমতি দেওয়া হয়েছে।


প্রদত্ত:

  1. কয়েকটি সংখ্যক টার্ন (দয়া করে কোনও গতিবিধি 0 হয় না দয়া করে তা উল্লেখ করুন, অন্যথায় আমরা ধরে নেব যে এটিকে 1 বলা হয়) এবং

  2. এক বা একাধিক শুরুর অবস্থানের একটি তালিকা (যে কোনও আকারে, যেমন 0 বা 1 সূচী স্থানাঙ্ক বা একটানা 64 নম্বর / অক্ষর বা এ 1 – এইচ 8 - রাজ্য) 8-বাই -8 দাবাবোর্ডে,

রিটার্ন (যে কোনও ক্রমে) অনন্য পজিশনের তালিকা (ইনপুট হিসাবে একই ফর্ম্যাটে) যে নাইট (গুলি) প্রদত্ত সংখ্যার টার্নের পরে থাকতে পারে।

  • প্রতিটি নাইট অবশ্যই প্রতিটি টার্নের সাথে চলাফেরা করতে হবে তবে আপনাকে একই স্কয়ারটি দখল করে একাধিক নাইটের বিষয়ে চিন্তা করতে হবে না।

  • একটি নাইট কেবলমাত্র তার বর্তমান অবস্থানের সাথে X এর সাথে চিহ্নিত positions
    যেখানে একটি নাইট চলে যেতে পারে

উদাহরণ (1-সূচী স্থানাঙ্ক)

1থেকে সরান [[1,1]]: [[2,3],[3,2]]

2থেকে সরানো [[1,1]]: [[1,1],[1,3],[1,5],[2,4],[3,1],[3,5],[4,2],[4,4],[5,1],[5,3]]

1থেকে সরান [[1,1],[5,7]]: [[2,3],[3,2],[3,6],[3,8],[4,5],[6,5],[7,6],[7,8]]

2থেকে সরানো [[1,1],[5,7]]: [[1,1],[1,3],[1,5],[1,7],[2,4],[2,6],[2,8],[3,1],[3,3],[3,5],[3,7],[4,2],[4,4],[4,6],[4,8],[5,1],[5,3],[5,5],[5,7],[6,4],[6,6],[6,8],[7,3],[7,7],[8,4],[8,6],[8,8]]

0থেকে সরানো [[3,4]]: [[3,4]]


দাবা স্পেসগুলি [র‌্যাঙ্ক, ফাইল] এর পরিবর্তে 0-63 নম্বর দিয়ে ইনপুট এবং আউটপুট করা যায়?
ডেভ

@ ডেভ শিওর, কেন নয়? শুধু I / O এর সাথে সামঞ্জস্য থাকুন।
অ্যাডম

8
আমি শপথ করছি আমি এই এইচএনকিউটি "যেখানে নাইটগুলি ন্যা মুভসে থাকি" হিসাবে পড়ি
সিডনি

3
পুন সতর্কতা: নাইটের জন্য স্বরলিপিটি এন।
জোশুয়া

আমরা কী পদক্ষেপের সংখ্যার উপর 1-ভিত্তিক সূচক ব্যবহার করতে পারি? যেমন[[1,1]], 2 -> [[2,3],[3,2]]
Zgarb

উত্তর:


11

ওল্ফ্রাম ভাষা (ম্যাথমেটিকা) , 45 বাইট

কারণ অন্যান্য সমাধানটি ভুল (নীচে মার্টিনের মন্তব্য দেখুন), তাই আমি আমার সমাধান পোস্ট করার সিদ্ধান্ত নিই:

8~KnightTourGraph~8~AdjacencyList~#&~Nest~##&

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

চূড়ান্ত ইনফিক্স স্বরলিপি ...

2 ইনপুট নেয়, প্রথমটি হ'ল [1,64]নাইটের শুরুর অবস্থানগুলি বর্ণনা করে এমন একটি সংখ্যার তালিকা , দ্বিতীয়টি হল পদক্ষেপের সংখ্যা।

এই সমাধানটি ম্যাথমেটিকা ​​বিল্টিন ফাংশনগুলির চরম সুবিধার উপর নির্ভর করে:

  • AdjacencyListএর ডানদিকে শীর্ষে অবস্থিত একটি তালিকা নিতে পারে এবং ইতিমধ্যে সরানো নকল এবং সাজানো এর মধ্যে যে কোনওটির সাথে সংলগ্ন শীর্ষগুলির একটি তালিকা ফিরে আসতে পারে ।
  • KnightTourGraphএকটি অন্তর্নির্মিত। অবাক হওয়ার কিছু নেই।
  • Nestযথাযথভাবে যুক্তিগুলি গ্রহণ করে Nest[f, expr, n], যা আমরা ##তার ডান দিকের উপরের দিকে ছড়িয়ে দিতে পারি Nest[f, ##]
  • এবং পরিশেষে, গাণিতিক a~b~c~d~eহিসাবে পার্স করুন (a~b~c)~d~e, সুতরাং কোনও বর্গাকার বন্ধনী প্রয়োজন। ইনফিক্স স্বরলিপি এবং ফ্ল্যাট ছাড়াই ##এটি হবে Nest[AdjacencyList[KnightTourGraph[8, 8], #] &, #, #2]&

1
আমি মনে করি না যে বিদ্যমান সমাধানটি আউটগল্ফ করাতে কোনও সমস্যা আছে।
Adám

1
এটি একাধিক শুরুর অবস্থান নিয়ে কাজ করে?
Adám

অ্যামেজিং! এখন আমাকে কীভাবে টি পড়তে হবে তা বুঝতে হবে ...
ডেভ

অনুমানকৃত ম্যাথমেকা গল্ফিং ভাষায় এটি সম্ভবত 17 বাইট হবে।
মাইকেল স্টারন

7

জাভাস্ক্রিপ্ট (ES7), 99 বাইট

ইনপুট / আউটপুট ফর্ম্যাট: বর্গ সূচকগুলি [0 ... 63]

f=(a,n)=>n--?f([...Array(64).keys()].filter(p=>!a.every(P=>(p%8-P%8)**2^((p>>3)-(P>>3))**2^5)),n):a

পরীক্ষার মামলা

এই স্নিপেটে ওপি দ্বারা সরবরাহিত ফর্ম্যাট থেকে এবং অনুবাদ করতে দুটি সহায়ক ফাংশন অন্তর্ভুক্ত।

কিভাবে?

থেকে একটি পদক্ষেপ (X, Y) থেকে (x, y) যদি আমরা পারেন কোনো বৈধ নাইট পদক্ষেপ:

  • | xx | = 1 এবং | yY | | = 2 , বা
  • | xx | = 2 এবং | ওয়াইওয়াই | = 1

পরম মান ব্যবহার না করে স্কোয়ারিং দ্বারা, এটি হিসাবে প্রকাশ করা যেতে পারে:

  • (xX) ² = 1 এবং (yY) ² = 4 , বা
  • (xX) ² = 4 এবং (yY) ² = 1

কারণ 1 এবং 4 হ'ল একমাত্র নিখুঁত স্কোয়ার যা XOR'D একসাথে থাকাকালীন 5 দেয়, আমাদের যদি একটি বৈধ নাইট পদক্ষেপ থাকে তবে:

(xX) ² XOR (yY) ² এক্সওআর 5 = 0

আমরা এই সূত্রটি বোর্ডের প্রতিটি বর্গ p = 8y + x এবং প্রতিটি নাইট স্কয়ার পি = 8 ওয়াস + এক্সে নতুন সম্ভাব্য নাইট টার্গেট স্কোয়ারগুলি কমাতে প্রয়োগ করি এবং পুনরাবৃত্তভাবে এই প্রক্রিয়াটি n বার পুনরাবৃত্তি করি ।


5

অক্টাভা, 69 বাইট

function a=f(a,n,b=~a)for k=1:n;a=b&imdilate(a,de2bi(")0#0)"-31));end

অনলাইন ডেমো!

ইনপুট / আউটপুট হ'ল বাইনারি 8 * 8 ম্যাট্রিক্স হিসাবে শুরু / শেষে বোর্ডের কনফিগারেশন।

ব্যাখ্যা:

জন্য nপদক্ষেপ পুনরাবৃত্তি নিম্নলিখিত মাস্ক বোর্ডের অঙ্গসংস্থান প্রসারণ:

01010
10001
00100
10001
01010

5

রেটিনা , 147 102 বাইট

.$
$*	
¶
 ¶
{s`((?<=N(....|.{11}|.{13})?.{7})|(?=.{8}(....|.{11}|.{13})?N))\S(?=.*	)
n
Ts`	Nn`_:N`.*¶	

এটি অনলাইন চেষ্টা করুন! :S এর সাথে চিহ্নিত নাইটগুলির সাথে একটি 8x8 বোর্ড এর হিসাবে ইনপুট নেয় N, পরবর্তী লাইনে বাঁক সংখ্যার জন্য একটি অঙ্ক সহ (9 টিরও বেশি পালা হওয়া কোনও মানে হয় না, তবে আপনি যদি জেদ করেন তবে আমি এটির জন্য অতিরিক্ত সমর্থন করতে পারি) বাইট)। দ্রষ্টব্য যে আউটপুটটিতে অতিরিক্ত সাদা স্থান রয়েছে। সম্পাদনা করুন: @ মার্টিনইেন্ডারকে ধন্যবাদ 45 টি বাইট সংরক্ষণ করা হয়েছে। ব্যাখ্যা: প্রথম পর্যায়টি টার্নের সংখ্যাটিকে অখণ্ডে রূপান্তরিত করে, তবে ট্যাব অক্ষরগুলি ব্যবহার করে, যাতে তারা পরে দুর্ঘটনার সাথে মিলে না যায়, দ্বিতীয় পর্যায়ে বোর্ডের ডানদিকে কিছু ফাঁক যুক্ত করে রেজিগেসগুলি জুড়ে মোড়ানো থেকে আটকাতে পারে to প্রান্ত. তৃতীয় পর্যায় সব প্রতিস্থাপন Ns এবং :গুলি যে থেকে দূরে একজন নাইট বর্তমান আগ্রাসনকে হয় Nএকটি সঙ্গে nযখন চতুর্থ পর্যায় কোনো অবশিষ্ট মুছে ফেলে Nগুলি, পরিবর্তনns থেকে Ns, এবং সরানো গণনা থেকে 1 টি বিয়োগ করে। সরানো গণনা শূন্য না হওয়া পর্যন্ত এটি পুনরাবৃত্তি করে।


এটি সবচেয়ে চিত্তাকর্ষক। কাজের জন্য অবশ্যই সঠিক সরঞ্জাম নয়!
অ্যাডম

4

জেলি , 29 বাইট

+þ1,2Œ!×þ1,-p`¤¤Ẏ¤Ẏ⁼%8$$ÐfQµ¡

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

0-সূচকযুক্ত স্থানাঙ্ক। প্রায় নির্দিষ্ট এটি suboptimal হয়।

-1 বাইট 202029 ব্যবহারকারীকে ধন্যবাদ

ব্যাখ্যা

+þ1,2Œ!×þ1,-p`¤¤Ẏ¤Ẏ⁼%8$$ÐfQµ¡  Main Link
+þ                             Addition Table (all pairs using + as combining function) with
  1,2Œ!×þ1,-p`¤¤Ẏ¤             All knight moves:
  1,2                          [1, 2]
     Œ!                        All permutations ([1, 2], [2, 1])
       ×þ                      Product Table (all pairs using × as combining function) with
         1,-p`¤                [1, 1], [1, -1], [-1, 1], [-1, -1]
         1,-                   [1, -1]
            p`                 Cartestian Product with itself
               ¤               All knight moves (in a nested array) as a nilad
                Ẏ¤             Tighten (flatten once); all knight moves in a (semi-)flat array
                        Ðf     Keep elements where
                   ⁼%8$$       The element equals itself modulo 8 (discard all elements out of the range)
                          Q    Remove Duplicates
                           µ   Start new monadic chain (essentially, terminates previous chain)
                            ¡  Repeat n times; n is implicitly the second input (right argument)

1
0-ইনডেক্সেড জেলি?
Adám

1
@ অ্যাডাম ফিল্টারিং সহজ করে তোলে: পি
হাইপারনিউটারিনো

2
আমি আশা করি জেলি 15 বাইটের নিচে এটি করতে সক্ষম হবেন, এপিএলে বর্তমান রেকর্ডধারক এটি 24 টি অক্ষরে এটি করেছেন।
Adám

আপনার যখন> = 3 $ থাকে, সম্ভবত আপনি এটি আগের লিঙ্কে স্থানান্তর করতে এবং এর সাথে ফিরে উল্লেখ করতে পারেন Ç
ব্যবহারকারী 202729

@ ব্যবহারকারী 202729 ওহ হ্যাঁ সত্য, ধন্যবাদ।
হাইপারনিউট্রিনো

3

05 এ বি 1 ই , 27 25 বাইট

2 বাইট সঞ্চয় করার জন্য এমিগিনার ধন্যবাদ !

1-ইনডেক্সড স্থানাঙ্ক ব্যবহার করে।

কোড:

F•eĆ•SÍü‚Dí«δ+€`Ùʒ{`9‹*0›

05AB1E এনকোডিং ব্যবহার করে । এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা:

F                          # Do the following <input_1> times..
 •eĆ•SÍ                    #   Push [-1, -2, 1, 2, -1]
       ü‚                  #   Pairwise pairing: [[-1, -2], [-2, 1], [1, 2], [2, -1]]
         D                 #   Duplicate the array
          í                #   Reverse each element
           «               #   Concatenate to the previous array

এটি আমাদের নিম্নলিখিত অ্যারে দেয়:

[[-1, -2], [-2, 1], [1, 2], [2, -1], [-2, -1], [1, -2], [2, 1], [-1, 2]]

যেগুলি নাইটের চলাচলের ডেল্টাস।

            δ+             #   Addition vectorized on both sides
              €`           #   Flatten each element
                Ù          #   Uniquify
                 ʒ         #   Keep elements which..
                  {`9‹     #     Has a maximum element smaller than 9
                      *0›  #     And a minimum element larger than 0

আপনি 2 বাইট সংরক্ষণ করার •eĆ•SÍü‚পরিবর্তে ব্যবহার করতে পারেন Ƶ‡4в2ô<D(«
Emigna

@ এমিগনা আহ, চতুর, ধন্যবাদ!
আদনান

2

পাইথন 3, 105 বাইট

p=lambda g,i:i and list(set(p([x+y for x in g for y in[6,10,15,17,-6,-10,-15,-17]if 0<=x+y<64],i-1)))or g

পুনরাবৃত্তির জন্য একটি নামযুক্ত ল্যাম্বদা ব্যবহার করতে হবে। নিশ্চিত নয় যে এটি অযোগ্যতাযুক্ত কিনা। 0-সূচিযুক্ত বর্গ সংখ্যা তালিকা হিসাবে শুরু অবস্থানে পাস করুন। 0 কোন পদক্ষেপ হিসাবে গণনা করা হয়।


2

জাভা (ওপেনজেডিকে 8) , 124 বাইট

(m,p)->{for(;m-->0;)for(long a=p,i=p=0,j;i<64;i++)for(j=64;j-->0;)p|=(p=i%8-j%8)*p+(p=i/8-j/8)*p==5?(a>>i&1)<<j:0;return p;}

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

ইনপুট / আউটপুট ফর্ম্যাট

ইনপুট / আউটপুটটিকে বিট হিসাবে উপস্থাপন করা হয় long(64 বিট): সেট বিট মানে একটি ঘোড়া উপস্থিত থাকে, আনসেট বিট মানে ঘোড়া নেই। উদাহরণ:

// [[0, 0]]
0b00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000001L

ব্যাখ্যা

(m, p) -> {                          // Lambda. No currying because m and p are modified
 for(;m-->0;)                        // For each move
  for(long a=p,i=p=0,j;i<64;i++)     // Declare variables, move p to a, create a new p and loop on bits of a.
   for(j=64;j-->0;)                  // Loop on bits of p.
    p |=                             // Assign to p a value.
     (p=i%8-j%8)*p+(p=i/8-j/8)*p==5  // If i -> j is a valid horse move, see Arnauld's JavaScript answer for full explanations
      ? (a>>i&1)<<j                  // Assign the presence of the horse (i-th bit of a) to the resulting board (j-th bit of p).
      : 0;                           // Else it's not a valid horse move
 return p;
}

ক্রেডিট

  • নেভাকে ধন্যবাদ 19 বাইট!
  • আরনাউল্ডের জাভাস্ক্রিপ্ট উত্তর(X-x)²+(Y-y)²==5 থেকে কৌশলটি পুনরায় ব্যবহার করুন
  • নতুন অ্যালগরিদমে নেভিকে আরও 1 টি বাইট সংরক্ষণ করা হয়েছে!
  • আরও 7 বাইট আবার int[]64-বিট থেকে স্যুইচ করে নেভাকে ধন্যবাদ রক্ষা করেছে long

1
169 বাইট: (m,p)->{for(;m-->0;){int i=64,a[]=p,x,y,u[]={1,3,5,9,15,19,21,23};for(p=new int[i];i-->0;)for(int z:u)if((((x=i/8+z/5-2)|(y=i%8+z%5-2))&-8)==0)p[x*8+y]|=a[i];}return p;}
নেভায়ে

1
-1 বাইট:(m,p)->{for(int i,j,a[],x;m-->0;)for(a=p,p=new int[i=64];i-->0;)for(j=64;j-->0;)p[j]|=(x=i%8-j%8)*x+(x=i/8-j/8)*x==5?a[i]:0;return p;}
নেভায়ে

আপনাকে ধন্যবাদ @ নেভায়ে! বন্ধনী / ব্লকগুলি অপসারণের জন্য কোড যুক্ত করা সর্বদা দুর্দান্ত! ;-)
অলিভিয়ার

1
এর int[]সাথে প্রতিস্থাপন করে -7 বাইট long:(m,p)->{for(long i,j,a;m-->0;)for(a=p,p=i=0;i<64;i++)for(j=64;j-->0;)p|=(p=i%8-j%8)*p+(p=i/8-j/8)*p==5?(a>>i&1)<<j:0;return p;}
নেভায়ে

চিয়ার্স, আমি এমনটা করার কথা ভাবিনি! দুর্দান্ত কাজ, @ নেভায়ে ;-)
অলিভিয়ার

2

জেলি , 29 28 বাইট

8Rp`
“¦Ʋƈ2’D_2ṡ2+€µẎ
ÇƓ¡f1£Q

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

পালা সংখ্যা STDIN এর মাধ্যমে হয় এবং স্কোয়ারগুলি একটি যুক্তি।

এটি হাইপারনিট্রিনোর জেলি সলিউশনটিকে যুক্ত করে তবে ভিন্ন পদ্ধতির সাথে।

এখন @ হাইপার নিউট্রিনোকে 1 টি পুরো বাইট দ্বারা প্রহার করুন!

কিছু বাইট ছোটাছুটি করার জন্য কোনও পরামর্শ চাইছিল!

লিঙ্ক 1 (দাবাবোর্ড)

8Rp`
8R   = The list [1,2,3,4,5,6,7,8]
  p` = cartesian multiplied with itself (this results in the chessboard)

লিঙ্ক 2 (সরানো প্রজন্ম)

“¦Ʋƈ2’D_2ṡ2+€µẎ
“¦Ʋƈ2’          = the number 103414301
      D         = converted into a list of digits
       _2       = subtract two from each element
         ṡ2     = overlapping pairs
           +€   = add to the list of squares
             µ  = Make sure the next part isn't treated as a right argument
              Ẏ = Tighten the list (Reducing the depth by one)

লিঙ্ক 3 (স্কয়ার চেকিং)

ÇƓ¡f1£Q
ÇƓ¡     = Repeat link #2 the requested amount of times
   f1£  = Remove everything not a member of link #1 (not on the chess board)
      Q = Make sure squares don't appear more than once

1

হুশ , 18 বাইট

u!¡ṁö`fΠR2ḣ8=5ṁ□z-

স্কোয়ার এবং পদক্ষেপের 1-ভিত্তিক সূচক ব্যবহার করে। এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

u!¡ṁö`fΠR2ḣ8=5ṁ□z-  Implicit inputs, say P=[[1,1],[5,7]] and n=2
  ¡                 Iterate on P:
   ṁö               Map the following function, then concatenate:
                     Argument is a pair, say p=[5,7].
          ḣ8         The range [1,2,..,8]
       ΠR2           Repeat twice, take cartesian product: [[1,1],[1,2],..,[8,8]]
     `f              Filter with this predicate:
                      Argument is a pair, say q=[3,8].
                z-    Zip p and q with difference: [-2,1]
              ṁ□      Sum of squares: 5
            =5        Is it 5? Yes, so [3,8] is kept.
 !                  Take n'th step of the iteration.
u                   Remove duplicates, implicitly print.

1

আর , 145 183 134 বাইট

এটি আমার প্রাথমিক না-খুব-গল্ফি অ্যালগোতে জিউসেপের দুর্দান্ত গল্ফিংয়ের ফলাফল (নীচে মন্তব্য দেখুন)

function(x,n){x=x%/%8*24+x%%8
t=c(49,47,26,22)
t=c(t,-t)
for(i in 1:n)x=intersect(v<-outer(1:8,0:7*24,"+"),outer(x,t,"+"))
match(x,v)}

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

ইনপুট এবং আউটপুট 1 ... 64 ভিত্তিক। 1 ... 64 স্বরলিপি ব্যবহার করে অবস্থানের ভেক্টর নেয়। এটিকে 1: 576 স্বরলিপিতে মানচিত্র করুন, এটি নয়টি বোর্ডের তৈরি একটি সুপার বোর্ড। এই স্বরলিপিটিতে, প্রতিটি পুনরাবৃত্তিতে, প্রতিটি নাইট +1-২২,২47,47,,49৯ দ্বারা সরানো উচিত, কেন্দ্রীয় বোর্ড থেকে পড়ে এমনগুলি বাদ দিয়ে, ভবিষ্যতের অবস্থানগুলি 1 ... 64 স্বরলিপিতে ফিরে আসুন। টিআইও উদাহরণ একটি 8x8 ম্যাট্রিক্স ব্যবহার করে ফলাফলটি প্রদর্শন করে।


এটি প্রথম পরীক্ষার ক্ষেত্রে ব্যর্থ বলে মনে হচ্ছে (এটি 2 এর পরিবর্তে 4 টি স্থানাঙ্ক প্রদান করে)।
Zgarb

Zgarb এটি দেখানোর জন্য আপনাকে ধন্যবাদ, আমি মনে করি আমি এখনই বিষয়টি ঠিক করেছি
NofP


বা 148 বাইটের[0...63] পরিবর্তে যদি আপনি এটি স্বরলিপিটিতে নেন ।
জিউসেপ

1
134 বাইট , [1..64]ইনপুট এবং আউটপুট জন্য। +1, যদিও এটি একটি দুর্দান্ত উত্তর।
জিউসেপ 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.