রেটিনা , 66 63 45 43 36 বাইট
^()(\1(?<1>.\1))+(\1(.(?(4).\4)))*$
রেটিনা বলে শিরোনাম থাকা সত্ত্বেও, এটি কেবল একটি সরল .NET রেজেক্স যা লোসিয়ান সংখ্যার অবিচ্ছিন্ন উপস্থাপনা গ্রহণ করে ।
999 এবং 1000 ইনপুটগুলি এক সেকেন্ডের অধীনে ভাল লাগে।
এটি অনলাইন চেষ্টা করুন! (প্রথম লাইনটি একটি লাইনফিড-বিচ্ছিন্ন পরীক্ষা স্যুট সক্ষম করে এবং পরবর্তী দুটি সুবিধার জন্য একরেতে রূপান্তরকে যত্ন করে))
ব্যাখ্যা
সমাধানটি শ্রেণিবিন্যাসের ভিত্তিতে তৈরি হয়েছে যে ইনপুটটি i*i + j*(i + j)
ইতিবাচক i
এবং অ-নেতিবাচক হিসাবে লেখা যেতে পারে j
(যেহেতু আমাদের ইনপুট হ্যান্ডেল করতে হবে না 0
), এবং n*n
এটি প্রথম n
বিজোড় পূর্ণসংখ্যার যোগফল । এই গল্ফ করা ফরোয়ার্ড রেফারেন্স একটি আকর্ষণীয় অনুশীলন ছিল।
একটি "ফরোয়ার্ড রেফারেন্স" হ'ল আপনি যখন গ্রুপটিকে উল্লেখ করেছেন তার মধ্যে একটি ব্যাক-রেফারেন্স রাখবেন। গ্রুপটি প্রথমবার ব্যবহার করা হলে অবশ্যই এটি কাজ করে না, যেহেতু এখনও পুনঃসংশ্লিষ্ট হওয়ার মতো কিছুই নেই, তবে আপনি যদি এটি একটি লুপে রাখেন, তবে প্রতিবার পিছনে প্রতিলিপি আগের পুনরাবৃত্তির ক্যাপচারটি পায়। এর পরিবর্তে, আসুন আপনি প্রতিটি পুনরাবৃত্তির সাথে আরও বড় ক্যাপচারটি তৈরি করুন। এটি ত্রিভুজাকার সংখ্যা, স্কোয়ার এবং ফিবোনাচি সংখ্যাগুলির মতো জিনিসের জন্য খুব কমপ্যাক্ট নিদর্শনগুলি তৈরি করতে ব্যবহার করা যেতে পারে।
উদাহরণস্বরূপ, স্কোয়ারগুলি প্রথম n
বিজোড় পূর্ণসংখ্যার যোগফল হিসাবে ব্যবহার করে আমরা এই জাতীয় বর্গাকার ইনপুটটি মেলাতে পারি:
(^.|..\1)+$
প্রথম পুনরাবৃত্তিতে, ..\1
কাজ করতে পারে না, কারণ \1
একটি মান এখনও নেই। তাই আমরা শুরু করি ^.
, একটি একক চরিত্রকে দলে দলে 1
। পরবর্তী পুনরাবৃত্তিতে, ^.
অ্যাঙ্কারের কারণে আর মেলে না, তবে এখন ..\1
বৈধ। এটি পূর্ববর্তী পুনরাবৃত্তির চেয়ে আরও দুটি অক্ষরের সাথে মেলে এবং ক্যাপচারটি আপডেট করে। এইভাবে আমরা ক্রমবর্ধমান বিজোড় সংখ্যাগুলির সাথে মেলে, প্রতিটি পুনরাবৃত্তির পরে একটি বর্গক্ষেত্র পেতে।
এখন দুর্ভাগ্যক্রমে, আমরা এই কৌশলটি যেমন ব্যবহার করতে পারি না। মিলের পরে i*i
, আমাদেরও i
পাশাপাশি পাওয়া দরকার , যাতে আমরা এটির দ্বারা গুণ করতে পারি j
। এটি করার একটি সহজ (তবে দীর্ঘ) উপায় হল ম্যাচটি পুনরাবৃত্তি i*i
গ্রহণ করে i
এমনটি ব্যবহার করা , যাতে আমরা i
জিনিসগুলিকে দলে দলে নিয়েছি 1
। আমরা এখন এটি নিষ্কাশন করতে ব্যালেন্সিং গ্রুপগুলি ব্যবহার করতে i
পারি, তবে আমি যেমন বলেছিলাম যে এটি ব্যয়বহুল।
পরিবর্তে, আমি এই "একটানা বিজোড় পূর্ণসংখ্যার যোগফল" লেখার জন্য একটি ভিন্ন উপায় বের করেছি i
যা শেষে ক্যাপচারিং গ্রুপেও পাওয়া যায় s অবশ্যই i
তম সংখ্যাটি ঠিক 2i-1
। এটি আমাদের প্রতিটি পুনরাবৃত্তিতে 1 দ্বারা ফরওয়ার্ড রেফারেন্স বাড়ানোর একটি উপায় দেয়। এই অংশ:
^()(\1(?<1>.\1))+
এই ()
মাত্র গ্রুপ সম্মুখের একটি খালি ক্যাপচার পাহাড় জমে 1
(initialising i
করতে 0
)। এটি ^.|
উপরের সাধারণ সমাধানটির তুলনায় বেশ সমান , তবে এক্ষেত্রে ব্যবহার |
করা কিছুটা কৌশলযুক্ত হবে।
তারপরে আমাদের মূল লুপ রয়েছে (\1(?<1>.\1))
। \1
আগেরটির সাথে মেলে i
, (?<1>.\1)
তার 1
সাথে গ্রুপ আপডেট করে i+1
। নিরিখে নতুন i
, আমরা শুধু মিলেছে থাকেন 2i-1
অক্ষর। ঠিক আমাদের যা প্রয়োজন।
আমাদের হয়ে গেলে, আমরা কিছু স্কোয়ারের সাথে মিল রেখেছি i*i
এবং গোষ্ঠীতে 1
এখনও i
অক্ষর রয়েছে।
দ্বিতীয় অংশটি আমি উপরে দেখানো সাধারণ বর্গাকার মিলের কাছাকাছি। আপাতত এর পিছনে থাকা বিষয়টিকে অগ্রাহ্য করা যাক 1
:
(.(?(4).\1))*
এটি মূলত একই (^.|..\4)*
, আমরা ব্যবহার করতে পারি না ^
কারণ আমরা স্ট্রিংয়ের শুরুতে নেই। পরিবর্তে আমরা শর্তযুক্ত ব্যবহার করি, .\1
কেবলমাত্র আমরা ইতিমধ্যে গোষ্ঠীটি ব্যবহার করেছি মাত্র তখন অতিরিক্তটির সাথে মেলে 4
। তবে বাস্তবে এটি ঠিক একই রকম। এটি আমাদের দেয় j*j
।
একমাত্র জিনিসটি হ'ল j*i
শব্দটি। আমরা গণনার এখনও পুনরাবৃত্তি লাগে j*j
এই সত্যটি ব্যবহার করে এটির সাথে একত্রিত করি । সুতরাং প্রতিটি পুনরাবৃত্তির জন্য আমরা কার্সারটি দিয়ে এগিয়েও চলেছি । আমাদের কেবল এটি নিশ্চিত করা দরকার যে এটি গ্রুপে লিখবেন না , কারণ এটি ক্রমাগত বিজোড় সংখ্যার সাথে মিলবে। আমরা এখানে পৌঁছেছি:j*j
j
i
\1
4
(\1(.(?(4).\1)))*