দ্য উইলডিবেস্টের পথ


23

গল্ফ একটি প্রোগ্রাম বা ফাংশন যা অসীম দাবাবোর্ডের স্কোয়ার 1 এ শুরু হওয়া ওয়াইল্ডবেস্টের nth অবস্থান দেয়1 যা একটি ঘড়ির কাঁটার বিপরীতে বর্গাকার সর্পিল হিসাবে গণনা করা হয়, যেখানে উইলডিবেস্ট সর্বদা সর্বনিম্ন সংখ্যাযুক্ত বর্গক্ষেত্রটি পরিদর্শন করে যা সে পৌঁছাতে পারে না এখনও পরিদর্শন করেছেন।

প্রেরণা: দ্য ট্র্যাপড নাইট এবং ওইআইএস এ 316667

সম্পাদনা করুন: এই ক্রমটি এখন OEIS এ A323763 হিসাবে রয়েছে

কোডটি nth অবস্থান নির্ধারণ করতে পারে , প্রথম n অবস্থান তৈরি করতে পারে বা কোনও ইনপুট না নিয়ে ক্রম তৈরি করতে পারে।

পরিবর্তে (বা অবধি) n লাফিয়ে যাওয়ার পরে তার অবস্থান নির্দ্বিধায় অনুভব করুন, তবে তবে দয়া করে আপনার উত্তরে এটি পরিষ্কারভাবে লিখুন এবং নিশ্চিত করুন যে এন = 0 এর একটি ইনপুটn=0 ফলনের1 (বা[1] উপযুক্ত হলে)।

এটি , সুতরাং লক্ষ্যটি হল আপনার নির্বাচিত ভাষায় যতটা সম্ভব কম বাইটে ওয়ার্কিং কোড তৈরি করা।

দ্রষ্টব্য: উইলডিবিস্ট আটকা পড়ে যায় (অনেকটা নাইট যেমন তার 2016th অবস্থানে, 2084 স্কোয়ারে করে এবং উটটি তার 3723rd , বর্গ 7081 ) তার 12899744968th স্থানে 12851850258 স্কোয়ারে । আপনার কোডের আচরণটি এর চেয়ে বড় n জন্য সংজ্ঞায়িত হতে পারে । ( এটি খুঁজে পাওয়া সি ++ কোডের জন্য ডেডকোডকে ধন্যবাদ !)

বিস্তারিত

বোর্ডটি নীচের মত দেখাচ্ছে এবং অনির্দিষ্টকালের জন্য অব্যাহত রয়েছে:

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" হয় পরী দাবা টুকরা কোনো অ-মানক দাবা টুকরা যা উভয় হিসেবে সরানো পারে - নাইট (ক (1,2) -leaper) এবং একটি হিসাবে উট (ক (1,3) -leaper)।
যেমন সে তার অবস্থান শুরু থেকে এই অবস্থানগুলির কোনো সরাতে পারে 1 :

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

এর মধ্যে সর্বনিম্ন 10 এবং তিনি এখনও সেই বর্গক্ষেত্রটি পরিদর্শন করেন নি, সুতরাং 10 ক্রমের দ্বিতীয় পদ।

এর পরে সে 10 থেকে এই অবস্থানগুলির যে কোনওটিতে যেতে পারে :

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

তবে, তিনি ইতিমধ্যে স্কয়ার 1 দেখেছেন তাই তার তৃতীয় অবস্থান বর্গ 3 , যা এখনও তিনি পরিদর্শন করেননি।


ওয়াইল্ডবেস্টের পথে প্রথম 100 শর্তগুলি হ'ল:

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 লিপগুলি নাইট চালগুলি হয় তাই প্রথম 12 পদ A316667 এর সাথে মিলে যায়


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
মেগো

উত্তর:


21

জাভাস্ক্রিপ্ট (নোড.জেএস) ,  191 ... 166  164 বাইট

@ গ্র্যামি ধন্যবাদ 2 বাইট সংরক্ষণ করা

ফেরত পাঠায় এন পরিভাষা।

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)

এটি অনলাইন চেষ্টা করুন! অথবা একটি ফর্ম্যাট সংস্করণ দেখুন

কিভাবে?

সর্পিল সূচকগুলি

স্থানাঙ্কগুলি (এক্স,Y) কে সর্পিল সূচক আমি তে রূপান্তর করতে , আমরা প্রথমে এল স্তরটি এর সাথে গণনা করব :

এল=সর্বোচ্চ(|এক্স|,|Y|)

যা দেয়:

-3-2-10+ +1+ +2+ +3-33333333-23222223-1321112303210123+ +13211123+ +23222223+ +33333333

তারপরে আমরা লেয়ারে পি পজিশনটি এর সাথে গণনা করি :

পি={2এল+ +এক্স+ +Yযদি এক্স>Y-(2এল+ +এক্স+ +Y)যদি এক্সY

যা দেয়:

-3-2-10+ +1+ +2+ +3-30123456-2-1012347-1-2-1012580-3-2-10369+ +1-4-3-2-3-4710+ +2-5-4-5-6-7-811+ +3-6-7-8-9-10-11-12

আমি দেওয়া চূড়ান্ত সূচক :

আমি=4এল2-পি

এনবি: উপরের সূত্রটি 0-সূচীযুক্ত সর্পিল দেয়।

জেএস কোডে, আমরা ঠিক এখনই সাথে সাথে 4এল2 গণনা করব :

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

এবং তারপর বিয়োগ পি সঙ্গে

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

উইলডিবেস্টের নড়াচড়া

(এক্স,Y)

-3-2-1এক্স+ +1+ +2+ +3-3911-2810-1761213Y+ +1541415+ +220+ +331

স্বাক্ষরিত মানগুলির 16 জোড়া প্রয়োগ করে আমরা তাদের মধ্য দিয়ে চলি (এক্স,Y)। প্রতিটি জুটি একক 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)

আমরা সর্বনিম্ন সম্মুখীন মানটি ট্র্যাক করি মি এবং এর সাথে সম্পর্কিত সেলটির স্থানাঙ্কগুলির মধ্যে (এইচ,ভী)

একবার সেরা প্রার্থীটি সন্ধান করা হয়ে গেলে, আমরা এটিতে একটি পতাকা সেট করে দেখেছি হিসাবে চিহ্নিত করি যা আমাদের মূল পুনরাবৃত্তির কাজ।

প্রথম পুনরাবৃত্তিতে, আমরা শুরু করি এক্স=1 এবং y=2. This ensures that the first selected cell is (0,0) and that it's the first cell to be marked as visited.


3
So much golfing, can't wait for the rundown of how all the magic works!
Jonathan Allan

did you have to use Buffer to force each character to be interpreted as a single byte?
Jonah

1
@ জোনাঃ যদিও এটি অবহেলা করা হয়েছে তবে নির্মাতা Bufferএখনও একটি স্ট্রিং গ্রহণ করেন। তাই, হ্যাঁ, এই একটি বরং সস্তা উপায় এটা বাইটের একটি তালিকা রূপান্তর হয় - যেমন উল্টোদিকে [..."string"].map(c=>do_something_with(c.charCodeAt()))
আর্নল্ড

1
স্থানাঙ্কীন এনকোডিংয়ে -2 বাইট: টিআইও
গ্রিমি

@ গ্রেমি সুন্দরভাবে সম্পন্ন!
আর্নৌল্ড

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)

মানগুলির একটি জেনারেটর প্রদান করে। সম্ভবত আরও গল্ফ করা যেতে পারে। (বিশেষত পার্থক্য tuples এর ক্রম।) এই গণিত থেকে নেওয়া সর্পিল আলগোরিদিম.এর উত্তর

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


1
for a,b in (-> for a,b in((সম্ভবত আপনি নিজেও টিপলস ডেল্টা টিপল গল্ফ করতে পারেন)
জোনাথন অ্যালান

1
প্রয়োজন নেই qএবং টিপলগুলির জন্য একটি জিপ আরও খাটো: 306 বাইট অবশ্যই গল্ফযোগ্য হতে পারে
জোনাথন অ্যালান

1
... 284 এর জন্য এটি কেমন? সম্পাদনা করুন ... এটি 278 এর জন্য
জোনাথন অ্যালান

1
FWIW, যে math.se উত্তর রয়েছে এক্স এবং ওয়াই আনা এবং এই প্রতিদ্বন্দ্বিতায় তুল্য সিস্টেমে উভয় নেতিবাচক আপেক্ষিক (যেখানে ইতিবাচক এক্স অধিকার যাকে Y আপ)। প্রতিসাম্যগুলির কারণে এটি কোনও পার্থক্য করতে চাইবে না, তবে এখনও।
ডেডকোড

1
0.5-> .5অন্য বাইট সংরক্ষণের জন্য; A**2-> A*Aআরও একটি জন্য।
জোনাথন অ্যালান

8

05AB1E , 77 65 58 57 52 বাইট

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

-6 বাইটস তার সূত্রের একটি বন্দর ব্যবহার করে @ আরনাউল্ডকে ধন্যবাদ জানায় ।

প্রথম আউটপুট এন+ +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]
আমরা কারেন্টটি ধরে রাখিএক্স,Y-পরিবর্তনশীল মধ্যে সমন্বয় X, যা প্রাথমিকভাবে [0,0]

বর্তমানের উপর ভিত্তি করে আমরা স্থানাঙ্কগুলির তালিকা পৌঁছাতে পারি এক্স,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]]

উপরের কোড ব্যাখ্যায় আমি যে তালিকাটি উল্লেখ করছি তাতে এই মানগুলি রয়েছে যা আমরা লাফাতে পারি, যার পরে বর্তমান এক্স,Y(পরিবর্তনশীল মধ্যে সঞ্চিত X) যোগ করা হয়।

তারপরে এটি এর উপর ভিত্তি করে সর্পিল মানগুলি গণনা করবে এক্স,Y-coordinates। এটি প্রদত্তের জন্য নিম্নলিখিত সূত্রটি ব্যবহার করে এটি করেএক্স,Y-coordinate:

টি=মিএকটিএক্স((2*এক্স)2,(2*Y)2)
আর=টি-(এক্স-Y+ +টি)*গুলিআমিএনতোমার দর্শন লগ করামি((এক্স+ +Y)*2-1)+ +1

@ ਅਰনাউল্ড তার উত্তরটিতে একই সূত্রটি ব্যবহার করছেন তবে ডাবল, বর্গক্ষেত্র, -1, +1 ইত্যাদির জন্য 05AB1E এর বিল্টিনগুলি ব্যবহার করতে আলাদাভাবে লিখিত হয়েছে

(আপনি যদি কোডটির এই সর্পিল অংশটি কার্যত দেখতে চান তবে: অনলাইনে চেষ্টা করে দেখুন ))

সমস্ত মান পাওয়ার পরে আমরা প্রদত্তদের কাছে পৌঁছাতে পারি এক্স,Yসমন্বয়, আমরা ইতিমধ্যে বিদ্যমান সমস্ত মান মুছে ফেলা global_array, এবং তারপর আমরা সর্বনিম্ন (বাকি) মান পেতে।
এই সর্বনিম্নটি ​​এর পরে যুক্ত করা হবে global_arrayএবং ভেরিয়েবলটি Xপ্রতিস্থাপন করা হবেএক্স,Yএই সর্বনিম্ন সমন্বয়।

আমরা inputসময়ের পরিমাণ লুপ করার পরে প্রোগ্রামটি ফলাফল global_arrayহিসাবে এটি আউটপুট দেয় ।


1
FWIW, স্থানাঙ্কগুলি সর্পিল সূচকগুলিতে রূপান্তর করতে এখানে আমার নিজস্ব সূত্রের একটি বন্দর formula এটি 5 বাইট সংক্ষিপ্ত হলেও ফলস ফলন করে। (আমি জানি না এটি সমস্যা কিনা না।)
আর্নল্ড

(মনে রাখবেন যে Y আপনার কোড হয় -Yআমার মধ্যে।)
আর্নল্ড

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