রেজেক্স (ইসিএমএসক্রিপ্ট), 276 205 201 193 189 বাইট
ECMAScript রেজেক্সের সাথে সমাধানের জন্য বিভিন্ন প্রাইম ফ্যাক্টরের গুণক (এক্সপোজার) তুলনা করা একটি আকর্ষণীয় সমস্যা - একটি লুপের পুনরাবৃত্তিগুলির দ্বারা অব্যাহত ব্যাকফেরেন্সের অভাব যে কোনও কিছু গণনা করা একটি চ্যালেঞ্জ করে তোলে। এমনকি যদি প্রশ্নের মধ্যে সংখ্যাগত বৈশিষ্ট্য গণনা করা সম্ভব হয় তবে প্রায়শই আরও পরোক্ষ পদ্ধতির মাধ্যমে আরও ভাল গল্ফ তৈরি হয়।
আমার অন্যান্য ইসিএমএ রেজেক্স পোস্টগুলির মতো, আমি একটি স্পয়লার সতর্কতা দেব : ইসমাস্ক্রিপ্ট রেজেক্সে অযৌক্তিক গাণিতিক সমস্যাগুলি কীভাবে সমাধান করা যায় তা শেখার আমি উচ্চতর পরামর্শ দিচ্ছি। এটি আমার কাছে একটি আকর্ষণীয় ভ্রমণ ছিল এবং আমি যে কারও জন্য সম্ভবত এটি চেষ্টা করতে চাইতে পারি তার পক্ষে এটি লুণ্ঠন করতে চাই না, বিশেষত যারা সংখ্যা তত্ত্বের প্রতি আগ্রহী তাদের জন্য। একের পর এক সমাধান করার জন্য পরের বার স্পয়লার-ট্যাগযুক্ত প্রস্তাবিত সমস্যার তালিকার জন্য এই আগের পোস্টটি দেখুন ।
সুতরাং আপনি যদি কিছু উন্নত ইউনারি রেজেক্স যাদু আপনার জন্য নষ্ট না করতে চান তবে আর পড়বেন না । আপনি যদি এই যাদুটি নিজেই বের করে আনতে চান তবে উপরের লিঙ্কযুক্ত পোস্টটিতে বর্ণিত ECMAScript রেজেক্সে কিছু সমস্যা সমাধানের মাধ্যমে আমি সুপারিশ করব।
আমি পূর্বে বিকাশকৃত একটি রেজেক্সের মূল পেইড এই চ্যালেঞ্জের জন্য খুব প্রযোজ্য বলে প্রমাণিত হয়েছিল। এটিই হ'ল রেজেক্স যা সর্বোচ্চ গুণনের মূল (গুলি) খুঁজে বের করে । যে জন্য আমার প্রথম সমাধান খুব দীর্ঘ ছিল, এবং আমি পরে এটা উপায় পর্যায়ে নেমে golfed, প্রথম এটা rewriting আণবিক lookahead ব্যবহার করতে , এবং তারপর এটি ফিরিয়ে প্লেইন এর নাম ECMAScript করার porting একটি উন্নত কৌশল ব্যবহার আণবিক lookahead অভাব প্রায় কাজ , এবং পরবর্তীকালে এটিকে গলফ করা মূল প্লেইন ECMAScript সমাধানের চেয়ে অনেক ছোট হতে হবে।
এই রেজেক্সের অংশটি যা এই সমস্যার জন্য প্রযোজ্য তা হ'ল প্রথম পদক্ষেপ, যা Q এর সন্ধান করে, এটি এন এর ক্ষুদ্রতম ফ্যাক্টর যা তার সমস্ত প্রধান উপাদানকে ভাগ করে দেয়। আমাদের এই সংখ্যাটি একবার হয়ে গেলে, আমাদের দেখতে হবে যে N একটি "ধ্রুবক-বহিঃসংখ্যক সংখ্যা", N দ্বারা Q দ্বারা বিভাজিত হয় যতক্ষণ না আমরা আর পারছি না; যদি ফলাফল 1 হয়, সমস্ত প্রাইমগুলি সমান গুণফলের হয়।
আমার সন্ধানের জন্য পূর্ববর্তী বিকাশযুক্ত অ্যালগরিদম ব্যবহার করে উত্তর জমা দেওয়ার পরে, আমি বুঝতে পেরেছিলাম যে এটি সম্পূর্ণ ভিন্ন উপায়ে গণনা করা যেতে পারে: এন এর বৃহত্তম বর্গমুক্ত ফ্যাক্টরটি আবিষ্কার করুন (আমার কারমাইকেল নম্বর রেজেক্সের মতো একই অ্যালগোরিদম ব্যবহার করে )। দেখা যাচ্ছে যে, আণবিক লুকআহেড এবং ভেরিয়েবল-দৈর্ঘ্যের লুকবিহীন (পূর্বে ব্যবহৃত উন্নত প্রযুক্তিটি টানতে হবে না) ঘাটতির আশেপাশে পদক্ষেপ নেওয়ার ক্ষেত্রে এটি কোনও অসুবিধা দেয় না এবং এটি 64 বাইট সংক্ষিপ্ত! অতিরিক্তভাবে এটি স্কয়ার-ফ্রি এন এবং প্রাইম এনকে বিভিন্ন বিশেষ কেস হিসাবে বিবেচনা করার জটিলতা দূর করে, এই দ্রবণ থেকে আরও 7 টি বাইট বাদ দেয়।
(এখনও অন্যান্য সমস্যা রয়ে গেছে যেগুলি Q এর গণনাটি গল্ফ করার জন্য এখানে আগে ব্যবহৃত উন্নত প্রযুক্তির প্রয়োজন, তবে বর্তমানে সেগুলির কোনওটিই আমার পিপিসিজি পোস্টগুলি উপস্থাপন করে না))
ধারাবাহিক-প্রাইমস পরীক্ষার আগে আমি বহুবৃত্তির পরীক্ষাটি রেখেছি কারণ পরেরটি অনেক ধীর গতির; পরীক্ষাগুলি স্থাপন করা যা আরও দ্রুত ব্যর্থ হতে পারে প্রথমে অভিন্ন বিতরণ করা ইনপুটটির জন্য রেজেক্সকে আরও দ্রুত করে তোলে। এটি প্রথমে রাখার চেয়ে আরও ভাল গল্ফ, কারণ এতে আরও ব্যাক-রেফারেন্স ব্যবহার করা হয় (যেগুলি ডাবল-ডিজিটের হলে আরও বেশি খরচ হত)।
গ্রিমির দ্বারা প্রাপ্ত ট্রিকটি ব্যবহার করে আমি এই রেজেক্স (১৯৩ → ১৮৯) থেকে ৪ টি বাইট ফেলে দিতে সক্ষম হয়েছি যা ভাগফলটি বিভাজকের থেকে বড় বা সমান হওয়ার গ্যারান্টিযুক্ত ক্ষেত্রে এই সংক্ষিপ্ত বিভাগকে আরও সংক্ষিপ্ত করতে পারে।
^(?=(|(x+)\2*(?=\2$))((?=(xx+?)\4*$)(?=(x+)(\5+$))\6(?!\4*$))*x$)(?=.*$\2|((?=((x*)(?=\2\9+$)x)(\8*$))\10)*x$)(?!(((x+)(?=\13+$)(x+))(?!\12+$)(x+))\11*(?=\11$)(?!(\15\14?)?((xx+)\18+|x?)$))
এটি অনলাইন চেষ্টা করুন!
# For the purposes of these comments, the input number = N.
^
# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \2.
# If N is square-free, \2 will be unset.
(?=
# Search through all factors of N, from largest to smallest, searching for one that
# satisfies the desired property. The first factor tried will be N itself, for which
# \2 will be unset.
(|(x+)\2*(?=\2$)) # for factors < N: \2 = factor of N; tail = \2
# Assert that tail is square-free (its prime factors all have single multiplicity)
(
(?=(xx+?)\4*$) # \4 = smallest prime factor of tail
(?=(x+)(\5+$)) # \5 = tail / \4 (implicitly); \6 = tool to make tail = \5
\6 # tail = \5
(?!\4*$) # Assert that tail is no longer divisible by \4, i.e. that that
# prime factor was of exactly single multiplicity.
)*x$
)
# Step 2: Require that either \2 is unset, or that the result of repeatedly
# dividing tail by \2 is 1.
(?=
.*$\2
|
(
# In the following division calculation, we can skip the test for divisibility
# by \2-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
# capture \2-1 above, and can use a better-golfed form of the division.
(?=
( # \8 = tail / \2
(x*) # \9 = \8-1
(?=\2\9+$)
x
)
(\8*$) # \10 = tool to make tail = \8
)
\10 # tail = \8
)*
x$ # Require that the end result is 1
)
# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
( # \11 = a factor of N
( # \12 = a non-factor of N between \11 and \13
(x+)(?=\13+$) # \13 = a factor of N smaller than \11
(x+) # \14 = tool (with \15) to make tail = \13
)
(?!\12+$)
(x+) # \15 = tool to make tail = \12
)
\11*(?=\11$) # tail = \11
# Assert that \11, \12, and \13 are all prime
(?!
(\15\14?)? # tail = either \11, \12, or \13
((xx+)\18+|x?)$
)
)
* এটি আণবিক চেহারা সহ এখনও পরিষ্কার, N এর জন্য বর্গমুক্ত কোনও বিশেষ ক্ষেত্রে নেই। এই 6 বাইট, একটি ফলনশীল ড্রপ 195 187 183 বাইট সমাধান:
^(?=(?*(x+))\1*(?=\1$)((?=(xx+?)\3*$)(?=(x+)(\4+$))\5(?!\3*$))*x$)(?=((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$)(?!(((x+)(?=\12+$)(x+))(?!\11+$)(x+))\10*(?=\10$)(?!(\14\13?)?((xx+)\17+|x?)$))
# For the purposes of these comments, the input number = N.
^
# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
(?*(x+)) # \1 = proposed factor of N
\1*(?=\1$) # Assert that \1 is a factor of N; tail = \1
# Assert that tail is square-free (its prime factors all have single multiplicity)
(
(?=(xx+?)\3*$) # \3 = smallest prime factor of tail
(?=(x+)(\4+$)) # \4 = tail / \3 (implicitly); \5 = tool to make tail = \4
\5 # tail = \4
(?!\3*$) # Assert that tail is no longer divisible by \3, i.e. that that
# prime factor was of exactly single multiplicity.
)*x$
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(?=
(
# In the following division calculation, we can skip the test for divisibility
# by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
# capture \1-1 above, and can use a better-golfed form of the division.
(?=
( # \7 = tail / \1
(x*) # \8 = \7-1
(?=\1\8+$)
x
)
(\7*$) # \9 = tool to make tail = \7
)
\9 # tail = \7
)*
x$ # Require that the end result is 1
)
# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
( # \10 = a factor of N
( # \11 = a non-factor of N between \10 and \12
(x+)(?=\12+$) # \12 = a factor of N smaller than \10
(x+) # \13 = tool (with \14) to make tail = \12
)
(?!\11+$)
(x+) # \14 = tool to make tail = \11
)
\10*(?=\10$) # tail = \10
# Assert that \10, \11, and \12 are all prime
(?!
(\14\13?)? # tail = either \10, \11, or \12
((xx+)\17+|x?)$
)
)
এখানে এটি ভেরিয়েবল-দৈর্ঘ্যের লুকের পিছনে পোর্ট করা হয়েছে:
রেজেক্স (ইসিএমএসক্রিপ্ট 2018), 198 195 194 186 182 বাইট
^(?=(x+)(?=\1*$)(?<=^x((?<!^\5*)\3(?<=(^\4+)(x+))(?<=^\5*(x+?x)))*))((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$(?<!(?!(\14\16?)?((xx+)\12+|x?)$)(?<=^\13+)((x+)(?<!^\15+)((x+)(?<=^\17+)(x+))))
এটি অনলাইন চেষ্টা করুন!
# For the purposes of these comments, the input number = N.
^
# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
(x+)(?=\1*$) # \1 = factor of N; head = \1
(?<= # This is evaluated right-to-left, so please read bottom to top.
^x
(
(?<!^\5*) # Assert that head is no longer divisible by \6, i.e. that
# that prime factor was of exactly single multiplicity.
\3 # head = \4
(?<=(^\4+)(x+)) # \4 = head / \5 (implicitly); \3 = tool to make head = \4
(?<=^\5*(x+?x)) # \5 = smallest prime factor of head
)*
)
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(
# In the following division calculation, we can skip the test for divisibility
# by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
# capture \1-1 above, and can use a better-golfed form of the division.
(?=
( # \7 = tail / \1
(x*) # \8 = \7-1
(?=\1\8+$)
x
)
(\7*$) # \9 = tool to make tail = \7
)
\9 # tail = \7
)*
x$ # Require that the end result is 1
# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
# This is evaluated right-to-left, so please read bottom to top, but switch back to
# reading top to bottom at the negative lookahead.
(?<!
# Assert that \13, \15, and \17 are all prime.
(?!
(\14\16?)? # tail = either \13, \15, or \17
((xx+)\12+|x?)$
)
(?<=^\13+)
( # tail = \13
(x+) # \14 = tool to make tail = \15
(?<!^\15+)
(
(x+) # \16 = tool (with \14) to make tail = \17
(?<=^\17+)(x+) # \17 = a factor of N smaller than \13
) # \15 = a non-factor of N between \13 and \17
) # \13 = a factor of N
)