পাইথন 1166 বাইট
পাঠযোগ্যতার স্বার্থে যথেষ্ট পরিমাণ শ্বেতস্থান ছেড়ে দেওয়া হয়েছে। ফাইলের আকার এই হোয়াইটস্পেস সরানোর, এবং বিভিন্ন খাঁজ মাত্রা পরিবর্তন করার পর পরিমাপ করা হয় Tab
, Tab
Space
, Tab
Tab
, ইত্যাদি আমি কোন golfing যা খুব আয়তন বহুলাংশে কর্মক্ষমতা প্রভাবিত এড়ানো গেছেন।
T=[]
S=[0]*20,'QTRXadbhEIFJUVZYeijf',0
I='FBRLUD'
G=[(~i%8,i/8-4)for i in map(ord,'ouf|/[bPcU`Dkqbx-Y:(+=P4cyrh=I;-(:R6')]
R=range
def M(o,s,p):
z=~p/2%-3;k=1
for i,j in G[p::6]:i*=k;j*=k;o[i],o[j]=o[j]-z,o[i]+z;s[i],s[j]=s[j],s[i];k=-k
N=lambda p:sum([i<<i for i in R(4)for j in R(i)if p[j]<p[i]])
def H(i,t,s,n=0,d=()):
if i>4:n=N(s[2-i::2]+s[7+i::2])*84+N(s[i&1::2])*6+divmod(N(s[8:]),24)[i&1]
elif i>3:
for j in s:l='UZifVYje'.find(j);t[l]=i;d+=(l-4,)[l<4:];n-=~i<<i;i+=l<4
n+=N([t[j]^t[d[3]]for j in d])
elif i>1:
for j in s:n+=n+[j<'K',j in'QRab'][i&1]
for j in t[13*i:][:11]:n+=j%(2+i)-n*~i
return n
def P(i,m,t,s,l=''):
for j in~-i,i:
if T[j][H(j,t,s)]<m:return
if~m<0:print l;return t,s
for p in R(6):
u=t[:];v=s[:]
for n in 1,2,3:
M(u,v,p);r=p<n%2*i or P(i,m+1,u,v,l+I[p]+`n`)
if r>1:return r
s=raw_input().split()
o=[-(p[-1]in'UD')or p[0]in'RL'or p[1]in'UD'for p in s]
s=[chr(64+sum(1<<I.find(a)for a in x))for x in s]
for i in R(7):
m=0;C={};T+=C,;x=[S]
for j,k,d in x:
h=H(i,j,k)
for p in R(C.get(h,6)):
C[h]=d;u=j[:];v=list(k)
for n in i,0,i:M(u,v,p);x+=[(u[:],v[:],d-1)]*(p|1>n)
if~i&1:
while[]>d:d=P(i,m,o,s);m-=1
o,s=d
নমুনা ব্যবহার:
$ more in.dat
RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU
$ pypy rubiks.py < in.dat
F3R1U3D3B1
F2R1F2R3F2U1R1L1
R2U3F2U3F2U1R2U3R2U1
F2L2B2R2U2L2D2L2F2
এটি প্রতিটি পদক্ষেপের সমাধানের জন্য আইডিএ * অনুসন্ধান ব্যবহার করে থিসলথওয়েটের অ্যালগোরিদমের বাস্তবায়ন। যেহেতু সমস্ত হিউরিস্টিক টেবিলগুলি উড়তে গণনা করা দরকার, বেশ কয়েকটি সমঝোতা করা হয়েছে, সাধারণত একটি হিউরিস্টিককে সাধারণত দুটি বা তার বেশি সমান আকারের অংশে বিভক্ত করে। এটি অনুসন্ধানের পর্বটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায়, তবে এটি প্রাথমিকভাবে কিউব অবস্থার উপর নির্ভর করে তাত্পর্যপূর্ণ হতে পারে।
পরিবর্তনশীল সূচক
T
- প্রধান তাত্পর্য টেবিল।
S
- একটি সমাধান কিউব অবস্থা। প্রতিটি পৃথক টুকরা একটি বিট মাস্ক হিসাবে সংরক্ষণ করা হয়, একটি চরিত্র হিসাবে উপস্থাপন। একটি সমাধান ওরিয়েন্টেশন ভেক্টরকে শূন্য ভেক্টর হিসাবে সংজ্ঞায়িত করা হয়।
I
- বিভিন্ন মোচড়, যাতে অনুসন্ধানের জায়গা থেকে তাদের সরিয়ে দেওয়া হয়।
G
- মোচড়ের অনুমতিগুলির জন্য গোষ্ঠীগুলি, অদলবদলের জন্য জোড়া হিসাবে সঞ্চিত। সংযুক্ত স্ট্রিংয়ের প্রতিটি বাইট এক জোড়া জন্য এনকোড। প্রতিটি টুইস্টের জন্য ছয়টি অদল বদল প্রয়োজন: প্রান্ত চক্রের জন্য তিনটি এবং কোণার চক্রের জন্য তিনটি। সংক্ষিপ্ত স্ট্রিংয়ে কেবল মুদ্রণযোগ্য আসকি (চার্ট 32 থেকে 126) থাকে।
M
- একটি ফাংশন যা একটি পদক্ষেপ সম্পাদন করে, জি দ্বারা প্রদত্ত।
N
- এনকোডিংয়ের উদ্দেশ্যে চারটি অবজেক্টের একটি ক্রমকে সংখ্যায় রূপান্তর করে।
H
- প্রদত্ত কিউব রাষ্ট্রের জন্য হিউরিস্টিক মান গণনা করে, টি থেকে সরানোর গভীরতার সন্ধান করতে ব্যবহৃত used
P
- অ্যালগরিদমের একক পর্বের একক গভীরতায় অনুসন্ধান করুন।
s
- ইনপুট কিউবের ক্রমশক্তি অবস্থা।
o
- ইনপুট কিউবের ওরিয়েন্টেশন ভেক্টর।
কর্মক্ষমতা
টমাস রোকির ডেটা সেট ব্যবহার করে , এই স্ক্রিপ্টটির গড় গড় গড় 16.02 টি টুইস্ট রয়েছে (সর্বোচ্চ 35), গড় গড় গড় 472ms (i5-3330 সিপিইউ @ 3.0 গিগাহাট, পাইপাই 1.9.0) রয়েছে। সর্বনিম্ন সমাধানের সময়টি সর্বাধিক 2.97s, মানক বিচ্যুতি 0.488 সহ 233 মিমি ছিল। প্রতিযোগিতা থেকে স্কোরিং গাইডলাইন ব্যবহার করে (সাদা স্থান গণনা করা হয়নি, কীওয়ার্ডস এবং সনাক্তকারীগুলি 870 দৈর্ঘ্যের জন্য একটি বাইট হিসাবে গণনা করা হয়েছে), সামগ্রিক স্কোরটি 13,549 হত।
সর্বশেষ ৪ cases টি ক্ষেত্রে (এলোমেলো রাজ্যগুলি), এটির গড় প্রতি গড় .২২ মাইল সময় নিয়ে 30.83 টি টুইস্ট রয়েছে tw
থিসলেথওয়েটের অ্যালগোরিদমের নোটস
থিস্টলেথওয়েটের অ্যালগরিদম বাস্তবায়নের চেষ্টা করতে চাইলে যে কেউ তার সুবিধার জন্য , এখানে একটি সংক্ষিপ্ত বিবরণ দেওয়া হল।
অ্যালগরিদম খুব সাধারণ সমাধান স্থান হ্রাস নীতিতে কাজ করে। এটি হল, কিউবটিকে এমন একটি স্থানে হ্রাস করুন যেখানে এটি সমাধানের জন্য কোনও টুইস্টের একটি উপসেট প্রয়োজন হয় না, এটি একটি ছোট সমাধানের জায়গাতে হ্রাস করুন এবং তারপরে বাকী কয়েকটি টুইস্ট ব্যবহার করে অবশিষ্টটিকে সমাধান করুন।
Thistlethwaite মূলত প্রস্তাব <L,R,F,B,U,D>
→ <L,R,F,B,U2,D2>
→ <L,R,F2,B2,U2,D2>
→ <L2,R2,F2,B2,U2,D2>
। যাইহোক, ইনপুট ফর্ম্যাটটি দেওয়া, আমি মনে করি প্রথমে হ্রাস করা সহজ <L,R,F2,B2,U,D>
(কোনও চতুর্থাংশের বাঁক F
বা না B
), এবং তারপরে <L2,R2,F2,B2,U,D>
অবশেষে অর্ধবৃত্তের অবস্থানে পৌঁছানোর আগে। কেন এটি ঠিক তা ব্যাখ্যা করার পরিবর্তে, আমি মনে করি প্রতিটি রাজ্যের মানদণ্ড নির্ধারণের পরে এটি স্পষ্ট হবে।
<L,R,F,B,U,D>
⇒ <L,R,F2,B2,U,D>
অর্ডার নির্মূল করার জন্য F
এবং B
কোয়ার্টার পালাক্রমে, শুধুমাত্র প্রান্ত সঠিকভাবে ভিত্তিক করতে হবে। 'সঠিক' এবং 'ভুল' ওরিয়েন্টেশন কী তা সম্পর্কে তার সাইটে গিলস রক্সের খুব ভাল ব্যাখ্যা রয়েছে, সুতরাং আমি ব্যাখ্যাটি তার কাছে ছেড়ে দেব। কিন্তু মূলত, (এবং এই কেন এই ইনপুট বিন্যাস তাই condusive হয় F
এবং B
বর্জন), একটি প্রান্ত cubie সঠিকভাবে ভিত্তিক হলে নিম্নোক্ত Regex মেলে: [^RL][^UD]
। একটি সঠিক দিকনির্দেশটি সাধারণত একটি দিয়ে স্বাক্ষরিত হয় 0
এবং এর সাথে ভুল হয় 1
। মূলত U
এবং D
স্টিকারগুলি মুখ R
বা L
মুখের উপর, বা কোনও U
বা D
প্রান্তের কিউবিগুলির প্রান্তে উপস্থিত নাও হতে পারে, বা একটি F
বা প্রয়োজনীয়তা ছাড়াই সেগুলিকে স্থানান্তরিত করা যায় না orB
কোয়ার্টার টুইস্ট
<L,R,F2,B2,U,D>
⇒ <L2,R2,F2,B2,U,D>
এখানে দুটি মানদণ্ড। প্রথমত, সব কোণে সঠিকভাবে ওরিয়েন্টেড করা আবশ্যক, এবং দ্বিতীয়, মধ্যম স্তর cubies জন্য প্রতিটি ( FR
, FL
, BR
, BL
) কোথাও মধ্যম স্তর হতে হবে। একটি কোণার অরিয়েন্টেশন খুব সহজভাবে ইনপুট ফর্ম্যাটটি দিয়ে সংজ্ঞায়িত করা হয়: প্রথম U
বা এর অবস্থান D
। উদাহরণস্বরূপ, URB
ওরিয়েন্টেশন 0
(সঠিকভাবে ওরিয়েন্টেড) রয়েছে, LDF
রয়েছে ওরিয়েন্টেশন 1
এবং LFU
ওরিয়েন্টেশন রয়েছে 2
।
<L2,R2,F2,B2,U,D>
⇒ <L2,R2,F2,B2,U2,D2>
মানদণ্ডগুলি এখানে নিম্নরূপ: প্রতিটি মুখের মধ্যে কেবল তার মুখ থেকে সরাসরি মুখের মুখ থেকে সরাসরি স্টিকার থাকে from উদাহরণস্বরূপ, চেহারায় U
কেবল স্টিকার U
এবং D
স্টিকার R
থাকতে পারে , মুখে কেবল স্টিকার R
এবং L
স্টিকার F
থাকতে পারে , মুখে কেবল স্টিকার F
এবং B
স্টিকার ইত্যাদি থাকতে পারে। এটিকে নিশ্চিত করার সহজতম উপায় হ'ল প্রতিটি প্রান্তের অংশটি রয়েছে কিনা তা পরীক্ষা করা to এটির 'স্লাইস', এবং প্রতিটি কোণার অংশটি তার 'কক্ষপথে' থাকে। অধিকন্তু, প্রান্ত-কোণ সমতুল্যে মনোযোগ দেওয়া প্রয়োজন। যদিও, আপনি যদি কেবল কোণার সাম্য জন্য পরীক্ষা করেন তবে এজ প্যারিটিও গ্যারান্টিযুক্ত এবং তদ্বিপরীত।
মোড় কীভাবে ওরিয়েন্টেশনকে প্রভাবিত করে
U
এবং D
মোচড়গুলি প্রান্তের প্রবণতা বা কোণ কোণকে প্রভাবিত করে না। টুকরোটি ওরিয়েন্টেশন ভেক্টর আপডেট না করে সরাসরি অদলবদল করা যেতে পারে।
R
এবং L
মোচড়গুলি প্রান্তের দিকনির্দেশকে প্রভাবিত করে না, তবে তারা কোণার দিকনির্দেশকে প্রভাবিত করে। আপনি কীভাবে আপনার চক্রটিকে সংজ্ঞায়িত করেন তার উপর নির্ভর করে কোণার ওরিয়েন্টেশনের পরিবর্তনটি হয় হবে +1, +2, +1, +2
বা +2, +1, +2, +1
সমস্ত মডুলোর 3
। লক্ষ্য করুন R2
এবং L2
ওঠা পড়ার কোণ অভিযোজন প্রভাবিত করে না, যেমন +1+2
শূন্য মডিউল হয় 3
, যেমন হয় +2+1
।
F
এবং B
প্রান্ত ওরিয়েন্টেশন এবং কোণে উভয় দিককেই প্রভাবিত করে। এজ ওরিয়েন্টেশন হয়ে +1, +1, +1, +1
(গেলিক ভাষার 2), এবং কোণার ওরিয়েন্টেশন জন্য একই R
এবং L
। এটি নোট করুন F2
এবং B2
প্রান্তের দিক বা ত্রুটি-বিচ্যুতিকে প্রভাবিত করবেন না।