রেটিনা , 353 339 178 175 150 130 129 117 বাইট
R
5$*r
T`aq\we\ds`so`r.+
)`r(.*)
$1
^
:
a
sq
e
wd
+`(.+)q
w$1
+`(.+)d
s$1
+`sw
(.*)(\1w?):
$0$2
+`sw|ws
w+
-$0
\w
1
আউটপুট অখণ্ডে রয়েছে, একটি কোলন দ্বারা পৃথক। এর অর্থ আপনি আউটপুটে সত্যিই শূন্য দেখতে পাবেন না (যদিও কোনও কোলনের উপস্থিতি আপনাকে জানাবে যে দুটি স্থানাঙ্কের মধ্যে কোনটি শূন্য, যদি কেবল একটি থাকে)।
এটি অনলাইন চেষ্টা করুন!
এটি সত্যিই মজাদার ছিল এবং অবাক হওয়ার মতো সংক্ষিপ্ত হওয়া শেষ হয়েছিল। :)
ব্যাখ্যা
প্রথমে কিছু ব্যাকগ্রাউন্ড। ষড়ভুজাকৃতির গ্রিডগুলি বর্ণনা করার জন্য বেশ কয়েকটি সমন্বিত সিস্টেম রয়েছে। এক অফসেট স্থানাঙ্ক ব্যবহারের জন্য বলেছে। এটি মূলত আয়তক্ষেত্রাকার গ্রিড স্থানাঙ্কের মতো, এক অক্ষটি কিছুটা "ডুবে" " বিশেষত, প্রশ্নটি লিঙ্কযুক্ত পৃষ্ঠায় প্রদর্শিত "বিজোড়-কিউ" বিন্যাসের জন্য জিজ্ঞাসা করে। এই সমন্বয় ব্যবস্থাটি কাজ করতে কিছুটা বিরক্তিকর, কারণ স্থাবরক্রমে স্থানাঙ্কগুলি কীভাবে পরিবর্তিত হয় তা কেবল চালের দিকের উপরই নয়, বর্তমান অবস্থার উপরও নির্ভর করে।
অন্য একটি সমন্বিত সিস্টেম অক্ষীয় স্থানাঙ্ক ব্যবহার করে। এটি মূলত হেক্সগ্রিডকে একটি ঘনক্ষেত্রের ভলিউমের মাধ্যমে একটি তির্যক টুকরা হিসাবে কল্পনা করা এবং 2 ডি বিমানে অবস্থান নির্ধারণের জন্য দুটি অক্ষ (উদাহরণস্বরূপ x এবং z) ব্যবহার করে। হেক্স গ্রিডে, এর অর্থ হ'ল দুটি অক্ষ 60 (বা 120) ডিগ্রির কোণ গঠন করে। এই দিকটি কিছুটা স্বজ্ঞাত তবে এর সাথে কাজ করা আরও সহজ, যেহেতু প্রতিটি দিকই একটি নির্দিষ্ট "ব-দ্বীপ" ভেক্টরের সাথে মিল রয়েছে। (এই সমন্বিত সিস্টেমে কীভাবে পৌঁছানো যায় তার আরও ভাল ব্যাখ্যাের জন্য, লিঙ্কটি এবং সেখানে সুন্দর চিত্র এবং অ্যানিমেশনগুলি দেখুন)
সুতরাং আমরা এখানে যা করব: আমরা অক্ষীয় স্থানাঙ্কগুলিতে আন্দোলন গণনা করি (কমান্ডগুলির অর্থ পুনর্নির্মাণের মাধ্যমে চ্যালেঞ্জের পরামর্শ হিসাবে আবর্তনের যত্ন নেওয়া) এবং যখন আমরা সম্পন্ন করি তখন আমরা অক্ষকে বিজোড়-কিউ অফসেটে রূপান্তর করি স্থানাঙ্ক।
ছয়টি স্থানটি (এক্সজেড) অক্ষীয় স্থানাঙ্কে নিম্নলিখিত ব-দ্বীপ ভেক্টরগুলিতে মানচিত্র করে:
q => (-1, 0)
w => ( 0, -1)
e => ( 1, -1)
d => ( 1, 0)
s => ( 0, 1)
a => (-1, 1)
অপেক্ষা করুন, এটি রেটিনা, আমাদের আনারি সংখ্যার সাথে কাজ করতে হবে। আমরা কীভাবে নেতিবাচক আনরি নম্বর দিয়ে কাজ করব? ধারণাটি দুটি ভিন্ন অঙ্ক ব্যবহার করা হয়। একটি প্রতিনিধিত্ব করে +1
এবং অন্যটি উপস্থাপন করে -1
। এর অর্থ আমরা 1
বর্তমান অবস্থান থেকে যুক্ত বা বিয়োগ করতে চাই না কেন , আমরা সর্বদা একটি সংখ্যার যোগ করে এটি করতে পারি। যখন আমরা সম্পন্ন হয়েছি তখন ভারসাম্যপূর্ণ সংখ্যাগুলি বাতিল করে আমরা ফলাফলটিকে তার প্রস্থে (সংশ্লিষ্ট অঙ্কের) ভেঙে ফেলি। তারপরে আমরা বাকী অঙ্কের উপর ভিত্তি করে সাইনটি বের করি এবং সমস্ত অঙ্কগুলি এর সাথে প্রতিস্থাপন করি 1
।
ইনপুটটির সামনে অক্ষরের এক্স এবং জেড উপাদানগুলি বাম এবং ডানে :
(পৃথক হিসাবে) তৈরি করার পরিকল্পনা। w
এবং s
ডানদিকে যোগ করা হবে। q
এবং d
বাম দিকে যোগ করা হবে , এবং e
এবং a
উভয় পক্ষের যোগ হবে। যেহেতু w
এবং s
ইতিমধ্যে :
(যা সামনে যাবে) এর সঠিক দিকে রয়েছে , তাই আমরা যথাক্রমে এগুলি -1
এবং +1
অঙ্ক হিসাবে ব্যবহার করব ।
কোড মাধ্যমে যেতে দিন।
R
5$*r
আমরা প্রতিটি R
পাঁচটি করে r
র মধ্যে শুরু । অবশ্যই, একটি বাম ঘুরিয়ে হেক্স গ্রিডে পাঁচটি ডান মোড়ের সমান, এবং এটি করে আমরা বাকী পদক্ষেপে প্রচুর নকল করতে পারি।
T`aq\we\ds`so`r.+
এটি একটি লিখিত লিখনের স্তর যা ছয়টি আদেশের আবর্তন করে যদি সেগুলি প্রথমটির পরে পাওয়া যায় r
(যার ফলে প্রথমটি প্রক্রিয়াজাত করা হয় r
)। w
এবং d
এগুলি চরিত্রের শ্রেণিতে প্রসারিত হওয়া থেকে রক্ষা করার জন্য পালানো দরকার। o
লক্ষ্য সেট যা এই ঘূর্ণন কাজের জন্য বাইট একটি গুচ্ছ সংরক্ষণ মধ্যে উৎস সেট সন্নিবিষ্ট করে। চরিত্রের ম্যাপিংটি তাই:
aqweds
saqweds
যেখানে s
দ্বিতীয় সারির শেষগুলি সহজেই উপেক্ষা করা যেতে পারে।
)`r(.*)
$1
এটি r
স্ট্রিং থেকে প্রথমটি সরিয়ে দেয় , কারণ এটি প্রক্রিয়া করা হয়েছে (আমি আশা করি আমি ইতিমধ্যে প্রতিস্থাপনের সীমাটি প্রয়োগ করেছি ...)। )
এছাড়াও অক্ষিপট বলে সব পর্যায়ে পর্যন্ত স্ট্রিং পরিবর্তন স্টপ একটি লুপ মধ্যে এই এক আপ চালানোর জন্য। পরবর্তী পুনরাবৃত্তির উপর, প্রথম পর্যায়টি কোনও অপ-বিকল্প হয় কারণ সেখানে আরও R
গুলি নেই এবং দ্বিতীয় পর্যায়ে r
স্ট্রিংয়ের মধ্যে যতক্ষণ না বাকি থাকে ততক্ষণ অন্য ঘূর্ণন প্রয়োগ করা হবে ।
আমাদের হয়ে গেলে, আমরা সমস্ত কমান্ড মেশানো করেছি যেহেতু তারা অনারেটেড গ্রিডের সাথে সম্পর্কিত direction অবশ্যই এই আন্দোলনটি সেই ডেল্টা ভেক্টরগুলির একটি যোগফল এবং সংখ্যাগুলি কমিটিকেভেটিভ, সুতরাং বাস্তবে কোনও বিষয় নেই যে আমরা এখন তাদেরকে যে ক্রমটিতে প্রক্রিয়াকরণ করি তা ঘূর্ণনগুলি হ্রাস হয়ে গেছে।
^
:
সামনের দিকে স্থানাঙ্ক ডিলিমিটার sertোকান।
এখন আমাদের আসলে প্রক্রিয়া করার দরকার নেই s
এবং w
। এগুলি আমাদের +1
এবং -1
অঙ্কগুলি এবং তারা ইতিমধ্যে ঠিক পাশের দিকে রয়েছে :
তাই শেষ পর্যন্ত প্রয়োজনীয় হিসাবে তারা কেবল বাদ পড়বে। আমরা আরেকটি সরলীকরণ করতে পারি: a
সহজ s + q
এবং e
হয় w + d
। আসুন এটি করা যাক:
a
sq
e
wd
আবার, এগুলি s
এবং w
কেবল বাদ পড়বে। আমাদের যা করতে হবে তা হ'ল q
এস এবং d
এসগুলি সামনের দিকে সরানো এবং সেগুলি নিজেরাই w
এস এবং s
এসগুলিতে পরিণত করা । আমরা দুটি পৃথক লুপ দিয়ে এটি করি:
+`(.+)q
w$1
+`(.+)d
s$1
সুতরাং যে সম্পন্ন। অক্ষীয় থেকে অফসেট স্থানাঙ্কে রূপান্তর করার সময় for তার জন্য আমাদের অঙ্কগুলি ধসে পড়তে হবে। যাইহোক, আপাতত আমরা কেবল বাম দিকের বিষয়ে যত্নশীল। যেভাবে আমরা q
গুলি এবং d
গুলিগুলি প্রসেস করেছি, সে কারণে আমরা জানি যে s
বাম দিকের সমস্ত এস যে কোনও w
এস এর সামনে উপস্থিত হবে , সুতরাং সেগুলি ভেঙে ফেলার জন্য আমাদের কেবল একটি জোড়া পরীক্ষা করতে হবে:
+`sw
এখন আসল রূপান্তর। এখানে সিউডোকোড, উপরের লিঙ্ক থেকে নেওয়া:
# convert cube to odd-q offset
col = x
row = z + (x - (x&1)) / 2
ডান, সুতরাং বাম দিকের দিকটি ইতিমধ্যে সঠিক। যদিও ডান হাতের সংশোধন মেয়াদ প্রয়োজন (x - (x&1)) / 2
। গ্রহণটি &1
মডুলো ২ এর সমান This এটি মূলত x/2
বিয়োগফলের দিকে গোলাকার পূর্ণসংখ্যা বিভাগ হিসাবে পার্স করে । সুতরাং ধনাত্মকতার জন্য x
, আমরা সংখ্যার অর্ধেক সংখ্যার যোগ করি (বৃত্তাকার নিচে), এবং নেতিবাচক জন্য x
, আমরা অঙ্কের অর্ধেক সংখ্যাকে বিয়োগ করি (বৃত্তাকার)) এটি আশ্চর্যজনকভাবে রেজিজেসে প্রকাশ করা যেতে পারে:
(.*)(\1w?):
$0$2
লোভের কারণে, এমনকি সমুদ্রের জন্য x
, গ্রুপ 1 সঠিক অর্ধেক অঙ্কের সাথে মিলবে, \1
অন্য অর্ধেক এবং আমরা এটিকে উপেক্ষা করতে পারি w?
। আমরা অর্ধেকটি পরে প্রবেশ করান :
(যা x/2
)। যদি x
সমান হয় তবে আমাদের ইতিবাচক এবং নেতিবাচক পার্থক্য করা দরকার। যদি x
ইতিবাচক হয়, তবে w?
আর কখনও মিলবে না, সুতরাং দুটি গ্রুপকে এখনও একই সংখ্যার অঙ্কটি মেলাতে হবে। প্রথমটি s
যদি এড়িয়ে যায় তবে এটি কোনও সমস্যা নয় , তাই আমরা গোল হয়ে যাই। যদি x
নেতিবাচক এবং বিজোড় হয়, তবে সম্ভাব্য ম্যাচটি \1
(অর্ধবৃত্তাকার অর্ধেক x
) এর সাথে এবং এটি alচ্ছিক w
। যেহেতু এই দু'টিই গ্রুপে যায় 2
, তাই আমরা x/2
প্রসারিত বৃত্তাকার (প্রয়োজনীয় হিসাবে) দিয়ে লিখব ।
+`sw|ws
এখন আমরা ডানদিকের দিকে অঙ্কগুলি ভেঙে ফেলি। এই সময়, আমরা ক্রম জানি না s
এবং w
, তাই আমরা উভয় জোড়া জন্য অ্যাকাউন্ট করতে হবে।
w+
-$0
উভয় অংশই এখন একক পুনরাবৃত্ত অঙ্ক (বা কিছুই নয়) এ হ্রাস পেয়েছে। যদি সেই অঙ্কটি হয় w
, আমরা সামনে একটি বিয়োগ চিহ্ন সন্নিবেশ করব।
\w
1
এবং পরিশেষে আমরা উভয় পরিণত w
এবং s
একটি একক যুক্তিসংগত ইউনারী অঙ্ক মধ্যে। (আমি মনে করি আমি ইউরি ডিজিট ব্যবহার করে w
বা বাইট বাঁচাতে পারতাম s
, তবে এটি কিছুটা প্রসারিত বলে মনে হয়))