আমি ভেবেছিলাম আমি একটি নতুন রেটিনা বৈশিষ্ট্যটি দেখানোর জন্য এই সুযোগটি ব্যবহার করব: মাল্টি-স্টেজ লুপগুলি। এটি বেশিরভাগ কাজ সংক্ষিপ্ত করা উচিত (বিশেষত শর্তসাপেক্ষে প্রতিস্থাপন)।
ii
-
+`(.)\1|0
(.)-|(\d)(\d)
-$1$3$2
12
i3
23
i1
31
i2
)`(\d)i
i$1
^\D*$
$&0
রেটিনা হ'ল আমার নিজস্ব রেজেক্স-ভিত্তিক প্রোগ্রামিং ভাষা। উত্স কোডটি পর্যায়গুলিতে বিভক্ত করা যেতে পারে: প্রতিটি পর্যায়ে দুটি লাইন থাকে যেখানে প্রথমটিতে রেজেক্স থাকে (এবং সম্ভবত কিছু কনফিগারেশন) এবং দ্বিতীয় লাইনটি প্রতিস্থাপনের স্ট্রিং থাকে। এরপরে স্টেডগুলি যথাযথভাবে STDIN এ প্রয়োগ করা হয় এবং চূড়ান্ত ফলাফলটি STDOUT এ মুদ্রিত হয়।
-s
কমান্ড-লাইন সুইচ সহ আপনি উত্স ফাইল হিসাবে সরাসরি উপরেরটি ব্যবহার করতে পারেন । তবে, আমি স্যুইচটি গণনা করছি না, কারণ আপনি প্রতিটি লাইনকে একটি পৃথক ফাইলে সন্নিবেশ করতে পারেন (তারপরে আপনি নতুন লাইনের জন্য 15 বাইট হারাবেন, তবে অতিরিক্ত ফাইলগুলির জন্য +15 যোগ করুন)।
ব্যাখ্যা
এই সমাধানটি সম্পর্কে নতুন জিনিসটি )
পেনাল্টিমেট পর্যায়ে রয়েছে। এটি একটি বহু-পর্যায়ের লুপ বন্ধ করে দেয়। কোনও মিল নেই (
, যার অর্থ লুপটি স্পষ্টভাবে প্রথম পর্যায়ে শুরু হয়। অতএব, তাদের 7 টির মধ্যে একটি সম্পূর্ণ পাস হওয়া পর্যন্ত ফলাফলটি পরিবর্তন করা বন্ধ না হওয়া পর্যন্ত প্রথম 7 টি পর্যায়ে পুনরাবৃত্তি করা হয়। এই 7 টি ধাপে কেবলমাত্র বিভিন্ন রূপান্তর ঘটে যা ধীরে ধীরে স্ট্রিংয়ে ম্যাট্রিক্সের সংখ্যা হ্রাস করে এবং পর্যায়গুলি একত্রিত করে। একবার আমরা চূড়ান্ত ফলাফলটিতে পৌঁছে গেলে, সাতটি নিদর্শনগুলির কোনওটির সাথে আর মেলে না এবং লুপ শেষ হয়। এর পরে, ফলাফলটিতে এখনও কোনও অঙ্ক না থাকলে আমরা একটি 0 সংযোজন করি (উপরের পর্যায়ে কেবল ফলাফল সহ সমস্ত পরিচয় বাদ দেওয়া হয়)।
পৃথক পর্যায়গুলি এখানে যা করে তা এখানে:
ii
-
পর্যায়ের অক্ষরগুলি হ্রাস করতে সমস্ত জোড়া i
একত্রিত -
করে।
+`(.)\1|0
<empty>
এখন যদি পর পর দু'টি অভিন্ন অক্ষর বাকী থাকে তবে তা হয় --
দু'টি অভিন্ন ম্যাট্রিক। উভয় ক্ষেত্রেই এগুলি গুণ করে পরিচয় দেয়। তবে আমাদের পরিচয়ের দরকার নেই, তাই আমরা কেবল তাদের সমস্তটি এবং স্পষ্টত পরিচয়ও 0
গুলি মুছে ফেলি । +
ফল পরিবর্তন বন্ধ হওয়া অবধি এই পর্যায়ে নিজেই পুনরাবৃত্তি হয় । এটি নিশ্চিত করে যে বিষয়গুলি 123321
সম্পূর্ণরূপে সমাধান করা যায়, যেমন পরবর্তী পদক্ষেপটি ধরে নিতে পারে যে সমস্ত জোড়া অঙ্ক পৃথক পৃথক।
(.)-|(\d)(\d)
-$1$3$2
এটি আসলে একটিতে (দুটি গল্ফিউডের জন্য) দুটি পৃথক রূপান্তরকেন্দ্র। মনে রাখবেন যে প্রথম বিকল্পের ম্যাচগুলি যদি হয়, $2
এবং $3
খালি থাকে এবং দ্বিতীয়টি ম্যাচ $1
খালি থাকে। সুতরাং এই দুটি পদক্ষেপের মধ্যে এটি পচে যেতে পারে:
(\d)(\d)
-$2$1
এটি কেবল সমস্ত সংখ্যার অদলবদল করে এবং একটি বিয়োগ চিহ্ন যোগ করে। যেহেতু আমরা সব মুছে 0
s এবং সব অভিন্ন জোড়া, এই শুধুমাত্র ম্যাচ হবে 12
, 23
, 31
, 21
, 32
, 13
। এই পদক্ষেপটি অদ্ভুত বলে মনে হতে পারে তবে এটি পরে এই ক্ষেত্রেগুলির অর্ধেকের জন্য কেবল আমাকে চেক করার অনুমতি দেয়, কারণ আমি যেগুলি পরে প্রক্রিয়া করতে পারি না তা পরবর্তী পুনরাবৃত্তিতে এখানে অদলবদল করা হবে।
উপরের পর্যায়ের অন্য অংশটি ছিল:
(.)-
-$1
এটি ধীরে ধীরে -
সমস্ত দিকে বাম দিকে চিহ্নগুলি সরিয়ে নিয়ে যায় (পুনরাবৃত্তির জন্য একটি অবস্থান)। আমি এটি এমন করি যা শেষ পর্যন্ত তারা একে অপরের পাশে থাকে এবং পূর্বের পদক্ষেপে সমাধান হয় resolved
12
i3
23
i1
31
i2
এই তিনটি পর্যায়ে এখন কেবল তিন জোড়া পণ্য সমাধান করুন। যেমনটি আমি উপরে বলেছি, এটি কেবলমাত্র প্রাসঙ্গিক অর্ধেকটিই ধরে ফেলবে, তবে পূর্ববর্তী পদক্ষেপটি সমস্ত জোড়া অদলবদল করার পরে, বাকি অংশগুলি পরবর্তী পুনরাবৃত্তিতে যত্ন নেওয়া হবে।
)`(\d)i
i$1
এটি লুপের শেষ পর্যায়ে। এটি -
বাদে যা বাম দিকে সরে যায় তার মতোই i
। মূল পার্থক্য হ'ল এটি i
কেবল অঙ্কগুলির সাথে অদলবদল হয়। আমি যদি (.)i
তখন ব্যবহার করি তবে যেখানে আমি একটি -i
বা i-
দুজন পাই সেগুলি অনির্দিষ্টকালের জন্য অদলবদল করা হবে এবং প্রোগ্রামটি শেষ হবে না। সুতরাং এটি কেবল -
চিহ্নগুলির ডানদিকে অদলবদল করে । এটি যথেষ্ট - যতক্ষণ না সমস্ত কিছু -
এবং i
একসাথে এক পর্যায়ে উপস্থিত হয়, সেগুলি সঠিকভাবে সমাধান করা যেতে পারে।
^\D*$
$&0
চূড়ান্ত পদক্ষেপ (লুপের বাইরে)। মনে রাখবেন যে আমরা সবসময় সমস্ত পরিচয় মুছে দিয়েছি, সুতরাং ফলাফলটি যদি আসলে পরিচয় হয় (একটি পর্বের বার), তবে আউটপুটে আমাদের আর প্রয়োজনীয় অঙ্ক থাকবে না, তাই আমরা এটিকে আবার যুক্ত করব।
উদাহরণস্বরূপ, এখানে সমস্ত মধ্যবর্তী ফর্ম 0223202330203313021301011023230323
(স্কিপিং স্টেজ যা কোনও পরিবর্তন করে না) এখানে রয়েছে:
0223202330203313021301011023230323
321321312 # Remove identities
-23-31-12-132 # Swap all pairs
-23-31-i3-132 # Resolve 12
-i1-31-i3-132 # Resolve 23
-i1-i2-i3-132 # Resolve 31
-i-1i-2i-3-312 # Move - to the left and swap pairs
-i-1i-2i-3-3i3 # Resolve 12
-i-i1-i2-3-i33 # Move i to the left
-i-i1-i2-3-i # Remove identities
--ii-1i-2-3i # Move - to the left
--ii-i1-2-i3 # Move i to the left
----i1-2-i3 # Resolve ii
i1-2-i3 # Remove identities
i-1-2i3 # Move - to the left
i-1-i23 # Move i to the left
-i-1i-32 # Move - to the left and swap pairs
-i-i1-32 # Move i to the left
--ii-1-23 # Move - to the left and swap pairs
--ii-1-i1 # Resolve 23
----1-i1 # Resolve ii
1-i1 # Remove identities
-1i1 # Move - to the left
-i11 # Move i to the left
-i # Remove identities. Now the loop can't change this any longer.
-i0 # Fix the result by adding in the 0.