জাভাস্ক্রিপ্ট (ES7), 236 ... 193 185 বাইট
ইনপুট ম্যাট্রিক্স পরিবর্তন করে আউটপুট।
m=>(g=(d,x,y,v,r=m[y],h=_=>++r[x]<9?g(d,x,y,v)||h():r[x]=0)=>r&&1/(n=r[x])?x|y|!v?n?g(d='21100--13203-32-21030321'[n*28+d*3+7&31],x+--d%2,y+--d%2,v+=n<7||.5):h():!m[v**.5|0]:0)(0,0,0,0)
এটি অনলাইন চেষ্টা করুন!
(ফলাফলকে ম্যাট্রিক্স হিসাবে এবং ওপি দ্বারা সরবরাহিত ভিজুয়ালাইজেশন সরঞ্জামের সাথে সামঞ্জস্যপূর্ণ একটি সমতল তালিকা হিসাবে উভয়ই প্রিন্ট করার জন্য কিছু পোস্ট-প্রসেসিং কোড অন্তর্ভুক্ত করা হয়েছে )
ফলাফল
কিভাবে?
ভেরিয়েবল
g হ'ল একটি পুনরাবৃত্ত ফাংশন যা বর্তমান দিক , বর্তমান স্থানাঙ্ক এবং পরিদর্শন করা ঘরের সংখ্যা ।d(x,y)v
নিম্নলিখিত পরিবর্তনশীলগুলিও এর স্কোপে সংজ্ঞায়িত করা হয় :g
r ম্যাট্রিক্সের বর্তমান সারি।
r = m[y]
h একটি সহায়ক ফাংশন যা বর্তমান কক্ষের জন্য থেকে অবধি সমস্ত মান চেষ্টা করে এবং তাদের প্রত্যেকের সাথে আহ্বান করে। এটি হয় সফল হওয়ার সাথে সাথেই বন্ধ হয়ে যায় বা যদি আমাদের ব্যাকট্র্যাকের প্রয়োজন হয় তবে বর্তমান সেলটি ফিরে সেট করে ।18gg0
h = _ => ++r[x] < 9 ? g(d, x, y, v) || h() : r[x] = 0
প্রাথমিক চেক
আমরা প্রথমে আমাদের বর্তমান অবস্থানটি বৈধ কিনা তা নিশ্চিত করি এবং আমরা বর্তমান কক্ষের মান লোড করি :n
r && 1 / (n = r[x]) ? ... ok ... : ... failed ...
আমরা আমাদের প্রথম অবস্থানে ফিরে এসেছি কিনা তা পরীক্ষা করি, যেমন আমরা এ অবস্থিত এবং আমরা কমপক্ষে কয়েকটি ঘর ( ) পরিদর্শন করেছি :(0,0)v>0
x | y | !v ? ... no ... : ... yes ...
আপাতত, ধরে নেওয়া যাক আমরা আরম্ভের বিন্দুতে ফিরে আসছি না।
পথ খুঁজছি
যদি সমান হয় , আমরা এই টাইলটির জন্য সমস্ত সম্ভাব্য মান চেষ্টা করার জন্য কে অনুরোধ করব।n0h
যদি সমান না হয় , আমরা পরবর্তী টাইলে যাওয়ার চেষ্টা করি।n0
টাইল সংযোগগুলি একটি অনুসন্ধানের টেবিলটিতে এনকোড করা হয়েছে, যার সূচকটি এবং সাথে গণনা করা হয়েছে এবং যার বৈধ এন্ট্রিগুলি নতুন মানগুলি উপস্থাপন করে ।ndd
d = '21100--13203-32-21030321'[n * 28 + d * 3 + 7 & 31]
সর্বশেষ 8 টি এন্ট্রি অবৈধ এবং বাদ দেওয়া আছে। অন্যান্য 4 টি অবৈধ এন্ট্রিগুলি হাইফেনের সাথে স্পষ্টভাবে চিহ্নিত করা হয়েছে।
রেফারেন্সের জন্য, নীচে ডিকোডেড টেবিল, চ্যালেঞ্জে প্রদত্ত কম্পাস এবং টাইলসেটটি দেওয়া হয়েছে:
| 1 2 3 4 5 6 7 8
---+-----------------
0 | 0 - - 1 3 - 3 1 1
1 | - 1 - - 2 0 2 0 0 + 2
2 | 2 - 1 - - 3 1 3 3
3 | - 3 0 2 - - 0 2
আমরা নতুন দিক এবং নতুন স্থানাঙ্কগুলি সহ তে পুনরাবৃত্ত কল করি call আমরা যোগ থেকে যদি আমরা ধরনের টালি ছিল বা , অথবা অন্যথায় (পরের প্যারা দেখুন)।g1/2v781
g(d, x + --d % 2, y + --d % 2, v += n < 7 || .5)
যদি অবৈধ হয়, তবে এবং NaN তে সেট করা হবে , পরবর্তী পুনরাবৃত্তিটি অবিলম্বে ব্যর্থ হতে বাধ্য করবে।dxy
পথটি বৈধ করা হচ্ছে
অবশেষে, আমরা যখন দিয়ে ফিরে ফিরে আসি , এর অর্থ অগত্যা এই নয় যে আমরা একটি বৈধ পথ পেয়েছি, কারণ আমরা শর্টকাট নিয়েছি। আমাদের পরীক্ষা করা দরকার যে আমরা কোষের সঠিক সংখ্যাটি দেখেছি কিনা।(0,0)v>0
এবং টাইল বাদে প্রতিটি টাইল একবার অবশ্যই দেখতে হবে যা অবশ্যই দু'বার দেখতে হবে। এই কেন আমরা কেবল যোগ থেকে যখন যেমন একটি টালি পরিদর্শন করা হয়।781/2v
শেষ , আমাদের অবশ্যই । তবে এটিও লক্ষণীয় যে আমরা সম্ভবত । সুতরাং, এটা টেস্ট করার জন্য যথেষ্ট যে, আমরা না , বা যে ম ম্যাট্রিক্সের সারি (0-ইন্ডেক্স) বিদ্যমান নয়, যেখানে ।v=N2v>N2v<N2kk = ⌊ √ √k=⌊v√⌋
সুতরাং জেএস কোড:
!m[v ** .5 | 0]
ফর্ম্যাট উত্স
m => (
g = (
d,
x, y,
v,
r = m[y],
h = _ => ++r[x] < 9 ? g(d, x, y, v) || h() : r[x] = 0
) =>
r && 1 / (n = r[x]) ?
x | y | !v ?
n ?
g(
d = '21100--13203-32-21030321'[n * 28 + d * 3 + 7 & 31],
x + --d % 2,
y + --d % 2,
v += n < 7 || .5
)
:
h()
:
!m[v ** .5 | 0]
:
0
)(0, 0, 0, 0)