রেজেক্স (ইসিএমএসক্রিপ্ট), 131 বাইট
কমপক্ষে -12 বাইটস ডেডকোডকে ধন্যবাদ (আড্ডায়)
(?=((xx+)(?=\2+$)|x+)+)(?=((x*?)(?=\1*$)(?=(\4xx+?)(\5*(?!(xx+)\7+$)\5)?$)(?=((x*)(?=\5\9*$)x)(\8*)$)x*(?=(?=\5$)\1|\5\10)x)+)\10|x
এটি অনলাইন চেষ্টা করুন!
আউটপুট ম্যাচের দৈর্ঘ্য।
ECMAScript রেজেক্সগুলি কোনও কিছু গণনা করা অত্যন্ত কঠিন করে তোলে। লুপের বাইরে নির্ধারিত কোনও ব্যাকরিফ লুপ চলাকালীন স্থির থাকবে, লুপের অভ্যন্তরে নির্ধারিত কোনও ব্যাকরেফ লুপ করার সময় পুনরায় সেট করা হবে। সুতরাং, লুপ পুনরাবৃত্তির জুড়ে রাষ্ট্র বহন করার একমাত্র উপায় হ'ল বর্তমান ম্যাচের অবস্থানটি ব্যবহার করা। এটি একটি একক পূর্ণসংখ্যা এবং এটি কেবল হ্রাস করতে পারে (ভাল, অবস্থানটি বৃদ্ধি পায়, তবে লেজের দৈর্ঘ্য হ্রাস পায় এবং আমরা গণিত করতে পারি এটিই)।
এই বিধিনিষেধগুলি দেওয়া, কেবল কপিরাইট সংখ্যা গণনা অসম্ভব বলে মনে হচ্ছে। পরিবর্তে, আমরা সমষ্টিটি গণনা করতে এলারের সূত্র ব্যবহার করি ।
সিউডোকোডে এটি দেখতে কেমন দেখাচ্ছে তা এখানে:
N = input
Z = largest prime factor of N
P = 0
do:
P = smallest number > P that’s a prime factor of N
N = N - (N / P)
while P != Z
return N
এই সম্পর্কে দুটি সন্দেহজনক জিনিস আছে।
প্রথমত, আমরা ইনপুটটি সংরক্ষণ করি না, কেবলমাত্র বর্তমান পণ্য, তাই আমরা কীভাবে ইনপুটটির মূল কারণগুলি পেতে পারি? কৌশলটি হ'ল (এন - (এন / পি)) পি হিসাবে একই মূল উপাদানগুলি> পি হিসাবে রয়েছে It এটি নতুন প্রধান উপাদানগুলি পেতে পারে <পি, তবে আমরা সেগুলি এড়িয়ে চলি। মনে রাখবেন এটি কেবলমাত্র কার্যকর কারণ আমরা ছোট থেকে বড় পর্যন্ত প্রধান কারণগুলির উপর পুনরাবৃত্তি করি, অন্যভাবে যেতে ব্যর্থ হবে।
দ্বিতীয়ত, আমাদের লুপ পুনরাবৃত্তির দুটি সংখ্যা মনে রাখতে হবে (পি এবং এন, জেড এটি ধ্রুবক হওয়ার পরে গণনা করে না), এবং আমি কেবল বলেছিলাম যে এটি অসম্ভব! ধন্যবাদ, আমরা এই দুটি সংখ্যা একটি একক মধ্যে সাঁতার কাটা করতে পারেন। মনে রাখবেন, লুপের শুরুতে, এন সর্বদা জেডের একাধিক হবে, আর পি সর্বদা জেডের চেয়ে কম হবে Thus সুতরাং আমরা কেবল এন + পি মনে রাখতে পারি, এবং একটি মডুলোর সাহায্যে পি বের করতে পারি।
এখানে আরও কিছুটা বিশদ সিডো কোড রয়েছে:
N = input
Z = largest prime factor of N
do:
P = N % Z
N = N - P
P = smallest number > P that’s a prime factor of N
N = N - (N / P) + P
while P != Z
return N - Z
এবং এখানে মন্তব্য করা রেজেক্স:
# \1 = largest prime factor of N
# Computed by repeatedly dividing N by its smallest factor
(?= ( (xx+) (?=\2+$) | x+ )+ )
(?=
# Main loop!
(
# \4 = N % \1, N -= \4
(x*?) (?=\1*$)
# \5 = next prime factor of N
(?= (\4xx+?) (\5* (?!(xx+)\7+$) \5)? $ )
# \8 = N / \5, \9 = \8 - 1, \10 = N - \8
(?= ((x*) (?=\5\9*$) x) (\8*) $ )
x*
(?=
# if \5 = \1, break.
(?=\5$) \1
|
# else, N = (\5 - 1) + (N - B)
\5\10
)
x
)+
) \10
এবং একটি বোনাস হিসাবে ...
রেজেক্স (ECMAScript 2018, ম্যাচের সংখ্যা), 23 বাইট
x(?<!^\1*(?=\1*$)(x+x))
এটি অনলাইন চেষ্টা করুন!
আউটপুট ম্যাচের সংখ্যা। ইসমাস্ক্রিপ্ট 2018 ভেরিয়েবল-দৈর্ঘ্যের লুক-ব্যাক (ডান-থেকে-বামে মূল্যায়ন) উপস্থাপন করেছে, যা ইনপুটটির সাহায্যে সমস্ত সংখ্যাকে সহজেই গণনা করা সম্ভব করে।
দেখা যাচ্ছে এটি স্বতন্ত্রভাবে লিকি নুনের রেটিনা দ্রবণ দ্বারা ব্যবহৃত একই পদ্ধতি এবং রেজেক্স এমনকি একই দৈর্ঘ্য ( এবং বিনিময়যোগ্য )। আমি এটি এখানে রেখে দিচ্ছি কারণ এটি আগ্রহী হতে পারে যে এই পদ্ধতিটি ECMAScript 2018 তে কাজ করে (এবং কেবলমাত্র নেট নয়)।
# Implicitly iterate from the input to 0
x # Don’t match 0
(?<! ) # Match iff there is no...
(x+x) # integer >= 2...
(?=\1*$) # that divides the current number...
^\1* # and also divides the input