ঘূর্ণন ধাঁধাটি সমাধান করুন


14

কিছু পুরানো নোকিয়া ফোনে রোটেশন নামে পনের ধাঁধাটির পার্থক্য ছিল । এই প্রকরণে, একবারে একটি টাইল স্লাইড না করে আপনি একবারে চারটি টাইল একদিকে ঘোরান।

এই গেমটিতে, আপনি এই জাতীয় বোর্ড দিয়ে শুরু করবেন:

4 9 2
3 5 7
8 1 6

এবং নীচের-বাম ব্লকটি একবার ঘড়ির কাঁটার দিকে এবং উপরের-বাম ব্লকটি একবার ঘড়ির কাঁটার দিকে ঘোরানোর মাধ্যমে আপনি এটি পাবেন:

4 9 2
8 3 7
1 5 6

4 9 2
1 8 7
3 5 6

1 4 2
8 9 7
3 5 6

এবং 1টাইলটি উপরের-বাম কোণে হবে যেখানে এটি হওয়ার কথা। অবশেষে, আরও কয়েকটি চালনার পরে, আপনি এখানে শেষ করতে চাই:

1 2 3
4 5 6
7 8 9

যা "আসল" কনফিগারেশন।

আপনার কাজটি এমন একটি প্রোগ্রাম তৈরি করা যা 1 থেকে 9 অবধি ইনপুট হিসাবে 3x3 গ্রিড নেবে (যে কোনও বিন্যাসে আপনি বেছে নেবেন) এবং আউটপুট হিসাবে ফিরে আসবে এমন পদক্ষেপের প্রতিনিধিত্ব করে যাতে বোর্ডকে তার মূলটিতে ফিরে যেতে হবে কনফিগারেশন (আবার আপনার পছন্দ মতো কোনও ফর্ম্যাটে)। আইনী পদক্ষেপগুলি [শীর্ষ / নীচের] - [বাম / ডান] 4 টি টাইলের ব্লক [ঘড়ির কাঁটার দিকের / ঘড়ির কাঁটার দিকের] হিসাবে সংজ্ঞায়িত করা হয়।

আপনার প্রোগ্রামটি অবশ্যই সমস্ত সম্ভাব্য 3x3 গ্রিডগুলি সমাধান করতে সক্ষম হবে (সমস্ত ক্রমাগত দ্রবণযোগ্য)।

এটি করার জন্য সংক্ষিপ্ততম কোড।


...and return as output a sequence of moves representing the moves you must take to return the board back to its originalএর অর্থ কি "পিছনে 1 2 3\n4 5 6\n7 8 9"? আমি কিভাবে এটি পড়তে হবে তা নিশ্চিত নই।
আন্ডারগ্রাউন্ডোমোনাইল

হ্যাঁ, আমি বোঝাতে চাই 1 2 3 4 5 6 7 8 9.
জো জেড।

1
আমি মনে করি আপনার উদাহরণের দ্বিতীয় এবং তৃতীয় বোর্ডের 3 এবং 5 টি অদলবদল করা উচিত।
মার্টিন এন্ডার

@JoeZ। আমি ঘোষণার জন্য এটি সংশোধন করার পরামর্শ দিচ্ছি যে সমাধানটির সীমাবদ্ধ খারাপ পরিস্থিতি রয়েছে।
হোস্টাইলফোর্ক বলেছেন যে এসই

উত্তর:


7

গল্ফস্ক্রিপ্ট, 39/83 বাইট

# Optimized for size:

{.4rand.p.2/+>`{?1420344440`=}+$..$>}do

# Optimized for speed:

6,(7++:t;~{.(1=.@7=9=+4\-rand+..2/+@.@>:s^[3s=0s=2s=4s=1s=]+s|.)9<\t>|}do.$>30764`*

গতি বনাম আকার

আকার-অপ্টিমাইজড সংস্করণ এলোমেলোভাবে ঘড়ির কাঁটার ঘূর্ণন চয়ন করে যতক্ষণ না কাঙ্ক্ষিত ক্রমানুসরণটি অর্জিত হয়। এটি যথেষ্ট, কারণ একটি ঘড়ির কাঁটার বিপরীত ঘূর্ণন একই বর্গক্ষেত্রের পরপর তিনটি ঘড়ির কাঁটার ঘোরের সমান।

গতি-অনুকূলিত সংস্করণ নিম্নলিখিতটি বাদ দিয়ে একই কাজ করে:

  1. যদি সংখ্যাটি উপরের বাম কোণে থাকে তবে এটি উপরের বাম চৌকোটি আর ঘোরান না।

  2. যদি 9 নম্বরটি নীচের ডানদিকে থাকে তবে এটি নীচের ডান চৌকোটি আর ঘোরান না।

  3. 7 এবং 8 পজিশনের অদলবদলের পদক্ষেপগুলি হার্ডকোডযুক্ত, সুতরাং দুটি পজিশন রয়েছে যা লুপটি ভাঙ্গতে দেয়।

অ্যালগরিদম পরিবর্তন করা ছাড়াও, গতি-অনুকূলিত সংস্করণটি সোজা পদ্ধতিতে আবর্তনটি অর্জন করে, যখন আকার-অনুকূলিত সংস্করণ ম্যাপিংয়ের মাধ্যমে গল্ফস্ক্রিপ্টের অন্তর্নির্মিত ক্রম ব্যবহার করে। এটি প্রতিটি পুনরাবৃত্তিতে রাষ্ট্রকে বাছাইয়ের পরিবর্তে চূড়ান্ত অবস্থা (তুলনার জন্য) হার্ডকোড করে।

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

benchmarks

আমি নীচের কোডগুলি সংখ্যার অবস্থানগুলি এলোমেলো করতে এবং পরীক্ষার রান সঞ্চালনের জন্য ব্যবহার করেছি, যা পরীক্ষার জন্য সংস্করণটির সাথে সম্পর্কিত লাইনটি বিরল করে দিয়েছে:

[{[
    0:c;10,1>{;2 32?rand}$
    #{c):c;.4rand.2/+>`{?1420344440`=}+$..$>}do
    #6,(7++:t;{.(1=.@7=9=+4\-rand+..2/+@.@>:s^[3s=0s=2s=4s=1s=]+s|.)9<\t>|}do.$>30764`*
],c+}\~*]

$.0='Min: '\+puts .-1='Max: '\+puts ..{+}*\,/'Avg: '\+puts .,2/='Med: '\+

আউটপুটটি সংখ্যার অর্ডার করতে যে সর্বনিম্ন এবং সর্বাধিক সংখ্যক পদক্ষেপ নিয়েছে তা দেখায়, সমস্ত রানের গড় এবং গড় এবং সেই সাথে সেকেন্ডে সময় কাটানো:

$ TIME='\n%e s' time golfscript rotation-test-size.gs <<< 100
Min: 4652
Max: 2187030
Avg: 346668
Med: 216888

21500.10 s
$
$ TIME='\n%e s' time golfscript rotation-test-speed.gs <<< 1000
Min: 26
Max: 23963
Avg: 3036
Med: 2150

202.62 s

আমার মেশিনে (ইন্টেল কোর আই -3-707 ,০), আকার-অনুকূলিত সংস্করণটির গড় প্রয়োগের সময়টি ছিল 3.58 মিনিট। গতি-অনুকূলিত সংস্করণটির গড় প্রয়োগের সময়টি ছিল 0.20 সেকেন্ড। সুতরাং, গতি-অনুকূলিত সংস্করণটি প্রায় 1075 গুণ বেশি দ্রুত।

গতির-অনুকূলিত সংস্করণটি 114 গুণ কম আবর্তন দেয়। প্রতিটি ঘূর্ণন সম্পাদন 9.4 গুণ ধীর হয়, যা মূলত রাষ্ট্র আপডেট হওয়ার কারণে হয়।

ইনপুট / আউটপুট

আউটপুট 3-বিট সংখ্যা নিয়ে গঠিত। এমএসবিটি ঘড়ির কাঁটার ঘোরার জন্য সেট করা হয়েছে, মাঝারি বিটটি নিম্ন স্কোয়ারের জন্য সেট করা হয়েছে এবং এলএসবি ডান স্কোয়ারের জন্য সেট করা আছে। সুতরাং, 0 (4) হ'ল উপরের বাম বর্গক্ষেত্র, 1 (5) উপরের ডানদিকে, 2 (6) নীচের বাম এবং 3 (7) নীচের ডানদিকে।

গতি-অনুকূলিত সংস্করণটি একটি একক লাইনে সমস্ত ঘূর্ণন মুদ্রণ করে। আকার-অনুকূলিত সংস্করণ সংখ্যার চূড়ান্ত অবস্থানের পরে প্রতি লাইনে একটি করে আবর্তন প্রিন্ট করে।

গতি-অনুকূলীকরণযোগ্য সংস্করণের জন্য, মূল্যায়নের সময় ইনপুটটিকে 1 থেকে 9 পর্যন্ত সংখ্যাসমৃদ্ধ একটি অ্যারে দিতে হবে। আকার-অনুকূলিত সংস্করণটির জন্য, ইনপুটটি চূড়ান্ত নিউলাইন ছাড়াই একটি স্ট্রিং হতে হবে; এটি মূল্যায়ন করা হয় না।

উদাহরণ রান:

$ echo -n '253169748' | golfscript rotation-size.gs
3
0
123456789
$ golfscript rotation-speed.gs <<< '[5 4 7 1 2 9 3 8 6]'
2210300121312212222212211121122211122221211111122211211222112230764

আকার-অনুকূলিত কোড

{               #
  .             # Duplicate the state.
  4rand         # Push a randomly chosen integers between 0 and 3.
  .p            # Print that integer.
  .2/+          # Add 1 to it if it is grater than one. Possible results: 0, 1, 3, 4
  >`            # Slice the state at the above index.
  {             # Push a code block doing the following:
    ?           # Get the index of the element of the iteration in the sliced state.
    1420344440` # Push the string "14020344440".
    =           # Retrieve the element at the position of the computed index.
  }+            # Concatenate the code block with the sliced state.
  $             # Sort the state according to the above code block. See below.
  ..$>          # Push two copies of the state, sort the second and compare the arrays.
}do             # If the state is not sorted, repeat the loop.

রাষ্ট্র আপডেট করে নিম্নলিখিত ফ্যাশনে অর্জিত হয়:

ঘূর্ণন 2 যোগ করার পরে পূর্ণসংখ্যার 3 দেয় 1.

"$" নির্বাহের ঠিক আগে, স্ট্যাকের শীর্ষতম উপাদানগুলি হ'ল:

[ 1 2 3 4 5 6 7 8 9 ] { [ 4 5 6 7 8 9 ] ? "1420344440" = }

অ্যারের প্রতিটি উপাদান সাজানোর জন্য "$" একবারে ব্লকটি কার্যকর করে, উপাদানটি নিজেই চাপ দেওয়ার পরে।

“[4 5 6 7 8 9]” এর 1 এর সূচকটি -1 (উপস্থিত নেই), সুতরাং "1420344440" এর শেষ উপাদানটি পুশ করা হয়। এইটি 48 টি প্রদান করে, 0 অক্ষরটির সাথে সম্পর্কিত ASCII কোডটি 2 এবং 3 এর জন্য, 48 টি ধাক্কা খায়।

পূর্ণসংখ্যা 4, 5, 6, 7, 8 এবং 9 এর জন্য 49, 52, 50, 48, 51 এবং 52 হয় 52

বাছাইয়ের পরে, রাজ্যের প্রথম উপাদানটি 48 ফলন প্রদানকারী উপাদানগুলির মধ্যে একটি হবে; সর্বশেষ 52২ ফলনকারীদের মধ্যে একটি হবেন The

ফলাফলটি [[1 2 3 7 4 6 8 5 9] ", যা নীচের বাম বর্গাকার ঘড়ির কাঁটার ঘোরের সাথে মিল রয়েছে।

গতি-অনুকূলীকরণ কোড

6,(7++:t;       # Save [ 1 2 3 4 5 7 ] in variable “t” and discard it.
~               # Interpret the input string.
{               #
  :s            # Duplicate the current state.
  (1=           # Unshift the first element and push 1 if it is equal to 1 and 0 otherwise.
  .@            # Duplicate the boolean and rotate the unshifted array on top of it.
  7=9=          # Push 1 if the eighth element of “s” is equal to 9 and 0 otherwise.
  +4\-          # Add the booleans and subtract their sum from 4.
  rand          # Push a randomly chosen integers between 0 and the result from above.
  +.            # Add this integer to the first boolean and duplicate it for the output.
  .2/+          # Add 1 to the result if it is grater than one. Possible results: 0, 1, 3, 4
  @.            # Rotate the state on top of the stack and duplicate it.
  @>:s          # Slice the state at the integer from above and save the result in “s”.
  ^             # Compute the symmetric difference of state and sliced state.
  [             # Apply a clockwise rotation to the sliced array:
    3s=         # The fourth element becomes the first.
    0s=         # The first element becomes the second.
    2s=         # The third element remains the same.
    4s=         # The fifth element becomes the fourth.
    1s=         # The second element becomes the fifth.
  ]             # Collect the results into an array.
  +             # Concatenate with array of elements preceding the slice.
  s|            # Perform set union to add the remaining elements of “s”.
  .             # Duplicate the updated state.
  )9<           # Pop the last element; push 0 if it is equal to 9 and 1 otherwise.
  \t            # Swap the popped state on top and push [ 1 2 3 4 5 7 ].
  >             # Push 0 if the state begins with [ 1 2 3 4 5 6 ] and 1 otherwise.
  |             # Take the logical OR of the booleans.
}do             # If the resulting boolean is 1, repeat the loop.
.$              # Duplicate the state and sort it.
>30764`*        # If the state was not sorted, 7 and 8 are swapped, so push "30764".

লক্ষ্য করুন যে 3, 0, 7, 6 এবং 4 আবর্তনগুলি সাতটি এবং 8 অবস্থানের উপাদানগুলিকে অদলবদল করে, অবশিষ্ট সাতটি উপাদানের অবস্থান পরিবর্তন না করে।


গতির জন্য অনুকূলিত? এটি গল্ফস্ক্রিপ্ট ...
17uʎs

1
@ সিনথেটিকা: তা সত্ত্বেও, এটি এখন পর্যন্ত পোস্ট করা সবচেয়ে দ্রুত সমাধান।
ডেনিস

4

নম্পি সহ পাইথন - 158

from numpy import*
A=input()
while any(A.flat>range(1,10)):i,j,k=random.randint(0,2,3);A[i:i+2,j:j+2]=rot90(A[i:i+2,j:j+2],1+2*k);print"tb"[i]+"lr"[j]+"wc"[k]

ইনপুট নিম্নলিখিত বিন্যাসে থাকতে হবে:

array([[1,2,5],[4,3,6],[7,8,9]])

প্রতিটি আউটপুট লাইন এমন স্ট্রিংগুলিতে এনকোডযুক্ত একটি পদক্ষেপ যা trwবা নীচে blcপড়তে হয়:

  • t: শীর্ষ
  • b: নীচে
  • l: বাম
  • r: ঠিক
  • c: ঘড়ির কাঁটার দিকে
  • w: ঘড়ির কাঁটার বিপরীতে (উইডারশিনস)

এই প্রোগ্রামটি লক্ষ্য কনফিগারেশন না আসা পর্যন্ত এলোমেলো পদক্ষেপগুলি সম্পাদন করে। আনুমানিক অনুমানের অধীনে যে প্রতিটি পদক্ষেপের 1/9 এর স্বাধীন সম্ভাবনা রয়েছে! লক্ষ্য কনফিগারেশন-এ আঘাত করতে, দ্রষ্টব্য হওয়ার আগে ঘূর্ণনের সংখ্যাটি 9 এর গড় (অর্থাত্ গড়ের গড় সংখ্যা) দিয়ে দ্রুততার সাথে বিতরণ করা হয়! 6 3.6 · 10⁵। এটি একটি সংক্ষিপ্ত পরীক্ষা (20 রান) অনুসারে।

¹ 9! কনফিগারেশন মোট সংখ্যা।


2
সুতরাং এটি সমাধান অর্জন না করা পর্যন্ত মূলত এটি এলোমেলো পদক্ষেপের চেষ্টা করে?
জো জেড।

আমার জন্য কাজ কর. যদিও আমি কোনও সমাধানের আগেই প্রত্যাশিত সংখ্যক ঘূর্ণনের বিষয়ে আগ্রহী in
জো জেড।

@ জোজ: আমার পোস্টে সম্পাদনা দেখুন।
Wrzlprmft

সেটা খুবই ভালো.
কাইল কানোজ

4

সি ++ সর্বাধিক মুভ সমাধান - প্রস্থের প্রথম (1847 টি অক্ষর)

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

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

এখন, এটি বোর্ডের বিভিন্ন রাজ্যে প্রথমে একটি সাধারণ প্রস্থের অনুসন্ধান। প্লাস, এটি সক্রিয় হিসাবে, আমার কী সেটটি (বর্তমানে বেস -9 এ সংখ্যার সেট হিসাবে সঞ্চিত রয়েছে, যার প্রতিটি বিএস :: কী বোর্ডের বেস -9 প্রতিনিধিত্ব হিসাবে গণনা করেছেন) একটি বিটসেটে পরিবর্তন করতে চাই 9 হচ্ছে! বিট অপ্রয়োজনীয় বলে মনে হয়; যদিও আমি কীভাবে "ফ্যাক্টরিয়াল সংখ্যা সিস্টেম" এর একটি কী গণনা করতে পারি তা যা পরীক্ষার / টগল করার জন্য বিটসেটের বিটটি গণনা করতে ব্যবহৃত হতে পারে।

সুতরাং, নতুন সমাধানটি হ'ল:

#include <iostream>
#include <list>
#include <set>
#include <vector>
using namespace std;
struct BS{
#define LPB(i) for(int*i=b;i-b<9;i++)
struct ROP{int t, d;};
typedef vector<ROP> SV;
typedef unsigned int KEY;
typedef set<KEY> KH;
BS(const int*d){const int*x=d;int*y=b;for(;x-d<9;x++,y++)*y=*x;}
BS(){LPB(i)*i=i-b+1;}
bool solved(){LPB(i)if(i-b+1!=*i)return 0;return 1;}
void rot(int t, int d){return rot((ROP){t,d});}
void rot(ROP r){rotb(r);s.push_back(r);}
bool undo(){if (s.empty())return false;ROP &u=s.back();u.d*=-1;rotb(u);s.pop_back();return true;}
SV &sol(){return s;}
KEY key(){KEY rv=0;LPB(i){rv*=9;rv+=*i-1;}return rv;}
int b[9];
SV s;
void rotb(ROP r){int c=r.t<2?r.t:r.t+1;int bi=(r.d>0?3:4)+c;const int*ri=r.d>0?(const int[]){0,1,4}:(const int[]){1,0,3};for(int i=0;i<3;i++)swap(b[bi],b[c+ri[i]]);}
};
ostream &operator<<(ostream &o, BS::ROP r){static const char *s[]={"tl","tr","bl","br"};o<<s[r.t]<<(r.d<0?"w":"c");return o;}
struct DKH{
~DKH(){for(HV::iterator i=h.begin();i<h.end();++i)if(*i!=NULL)delete *i;}
void add(int d,BS b){h.resize(d+1);if(h[d]==NULL)h[d]=new BS::KH();h[d]->insert(b.key());}
bool exists(BS &b){BS::KEY k=b.key();size_t d=min(b.sol().size(),h.size()-1);do if (h[d]->find(k)!=h[d]->end())return true;while(d--!=0);return false;}
typedef vector<BS::KH *> HV;HV h;
};
static bool solve(BS &b)
{
const BS::ROP v[8]={{0,-1},{0,1},{1,-1},{1,1},{2,-1},{2,1},{3,-1},{3,1}};
DKH h;h.add(0,b);
list<BS> q;q.push_back(b);
while (!q.empty())
{
BS qb=q.front();q.pop_front();
if (qb.solved()){b=qb;return true;}
int d=qb.sol().size()+1;
for (int m=0;m<8;++m){qb.rot(v[m]);if (!h.exists(qb)){h.add(d,qb);q.push_back(qb);}qb.undo();}
}
return false;
}
int main()
{
BS b((const int[]){4,9,2,3,5,7,8,1,6});
if (solve(b)){BS::SV s=b.sol();for(BS::SV::iterator i=s.begin();i!=s.end();++i)cout<<*i<<" ";cout<<endl;}
}

1
আপনার কোডটি সি এর পরিবর্তে সি ++ এর মতো দেখাচ্ছে
ব্যবহারকারী 12205

@ অন্যথায়, এটি সংশোধন করা হয়েছে।
ড্রিম ওয়ারিয়র

অন্য কারও কাছে g ++ দিয়ে এটি সংকলন করতে সমস্যা দেখা দিলে আমাকে সমস্ত দৃষ্টান্ত পরিবর্তন int[]করতে হবে const int[]এবং পতাকাটি সেট করতে হয়েছিল -fpermissive
ডেনিস

@ ডেনিস, এর জন্য দুঃখিত, আমি এটিকে দুটি স্বতন্ত্র জি ++ সংকলক দিয়ে সংকলন করেছি এবং মনে হয় নি। তবে, আমি দেখতে পাচ্ছি কীভাবে নতুন, কঠোর, সংস্করণটি ঝকঝকে করবে। ধন্যবাদ।
ড্রিম ওয়ারিয়র

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

1

সিজেম - 39

l{4mr_o_1>+_@m<_[Z0Y4X]\f=\5>+m>__$>}g;

অন্য এলোমেলো সমাধানকারী :)
এটি একটি স্ট্রিং লাগে যেমন 492357816 এবং 0 থেকে 3 পর্যন্ত একটি দীর্ঘ (দীর্ঘ) সিরিজ অঙ্ক করে, প্রতিটি একটি ব্লকের ঘড়ির কাঁটার ঘোরার প্রতিনিধিত্ব করে: 0 = শীর্ষ-বাম, 1 = শীর্ষ-ডান, 2 = নীচে -বাম, 3 = নীচে-ডান।

সংক্ষিপ্ত বর্ণনা:

4mr
_1>+এটি 1 এর চেয়ে বেশি হলে 0 থেকে 3 বৃদ্ধি করে একটি এলোমেলো সংখ্যা তৈরি করে (সুতরাং আমরা 0, 1, 3 বা 4 দিয়ে শেষ করি - 4 টি ব্লকের সূচনা সূচকগুলি)
m<স্ট্রিংটি বামদিকে ঘোরায় (যেমন 492357816 -> 923578164, ব্লক রোটেশন নয়) ব্লকটিকে প্রথম অবস্থানে
[Z0Y4X]\f=ঘোরানোর জন্য ব্লক রোটেশনটি প্রথম 5 টি অক্ষরকে প্রভাবিত করে যেমন 12345 -> 41352;
এক্স = 1, ওয়াই = 2, জেড = 3 সুতরাং [জেড 0ওয়াই 4 এক্স] আসলে [3 0 2 4 1] এবং সেগুলি 0 টি ভিত্তিক সূচকগুলি ঘোরানো টাইলগুলি
5>অনুলিপি করে স্ট্রিংয়ের বাকী স্ট্রিংগুলি
m>(পরিবর্তিত) স্ট্রিংটি ফিরে আসে
__$>স্ট্রিংটি সাজানো হয়েছে কিনা তা সঠিক পরীক্ষা করে (এটি স্টপিং শর্ত)


1

গণিত, 104 অক্ষর

আমরা কাজটি অনুমান গ্রুপগুলির ভাষায় ব্যাখ্যা করতে পারি। চারটি ঘূর্ণন হ'ল চারটি অনুক্রম যা প্রতিসম গ্রুপ এস 9 জেনারেট করে এবং কাজটি কেবল জেনারেটরগুলির একটি পণ্য হিসাবে একটি আদেশ লেখার জন্য। এটি করার জন্য গণিতের একটি অন্তর্নির্মিত ফাংশন রয়েছে।

i={1,2,5,4};GroupElementToWord[PermutationGroup[Cycles/@({i}+#&/@i-1)],Input[]~FindPermutation~Range@9]

উদাহরণ:

ইনপুট:

{4, 9, 2, 8, 3, 7, 1, 5, 6}

আউটপুট:

{-2, -3, -4, 2, 4, 1, 4, -1, -2, 3, 2, -4, 3, 4, -3, -3, -4, -4, -2, -2, -3, -2, 3, -1}
  • 1: উপরের-বাম দিকে ঘড়ি
  • 2: উপরে-ডান ঘড়ির কাঁটার দিকে
  • 3: নীচে-ডান ঘড়ির কাঁটার দিকে
  • 4: নীচে-বাম দিকে ঘড়ির কাঁটার দিকে
  • -1: উপরের-বাম দিকে ঘড়ির কাঁটার দিকে
  • -2: উপরের-ডানদিকে ঘড়ির কাঁটার দিকে
  • -3: নীচে থেকে ডানদিকে ঘড়ির কাঁটার দিকে
  • -4: নীচে-বাম দিকে ঘড়ির কাঁটার দিকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.