রেজেক্স গল্ফ: একটি সুডোকু সমাধান যাচাই করুন


65

কোনও বৈধ সুডোকু সমাধানের সাথে মেলে এবং কোনও অবৈধ সুডোকু সমাধানের সাথে মেলে না এমন একটি রেজেক্স লিখুন । ইনপুটটি সুডোকুর একটি অনিবন্ধিত সংস্করণ, অর্থাত কোনও লাইন ডিলিমিটার নেই। যেমন নীচের বোর্ড:

7 2 5 8 9 3 4 6 1
8 4 1 6 5 7 3 9 2
3 9 6 1 4 2 7 5 8
4 7 3 5 1 6 8 2 9
1 6 8 4 2 9 5 3 7
9 5 2 3 7 8 1 4 6
2 3 4 7 6 1 9 8 5
6 8 7 9 3 5 2 1 4
5 1 9 2 8 4 6 7 3

হিসাবে দেওয়া হবে:

725893461841657392396142758473516829168429537952378146234761985687935214519284673

নিয়মগুলি সম্ভবত এখন অবধি সাধারণ জ্ঞান, তবে কেবল যদি ... একটি সুডোকু বোর্ড বৈধ হয় যদি কেবলমাত্র যদি:

  • প্রতিটি সারিতে থেকে ডিজিটের রয়েছে 1করার 9ঠিক একবার।
  • প্রতিটি কলাম থেকে ডিজিটের রয়েছে 1করার 9ঠিক একবার।
  • নয়টি 3x3 subgrids প্রত্যেকটি থেকে ডিজিটের রয়েছে 1করার 9ঠিক একবার।

বিধি

আপনার উত্তরটিতে কোনও অতিরিক্ত কোড ছাড়াই একটি একক রেজেক্স সমন্বিত হওয়া উচিত (solutionচ্ছিকভাবে, আপনার সমাধানের কাজটি করার জন্য প্রয়োজনীয় রেজেেক্স সংশোধকগুলির একটি তালিকা)। আপনাকে অবশ্যই আপনার ভাষার রেজেেক্স গন্ধের বৈশিষ্ট্যগুলি ব্যবহার করবেন না যা আপনাকে হোস্টিং ভাষায় কোড উদ্বোধন করতে দেয় (যেমন পার্লের eসংশোধক)।

আপনি এই চ্যালেঞ্জের আগে বিদ্যমান যে কোনও রেগেক্স স্বাদ ব্যবহার করতে পারেন তবে দয়া করে স্বাদটি নির্দিষ্ট করুন।

ধরে নিবেন না যে রেজেক্স অন্তর্নিহিতভাবে নোঙ্গর করেছে। উদাহরণস্বরূপ আপনি যদি পাইথন ব্যবহার করছেন তবে ধরে নিন যে আপনার রেজেক্সটি ব্যবহার করেছেন re.searchএবং সাথে নেই re.match। আপনার রেজেক্সের পুরো স্ট্রিংয়ের সাথে মিলের প্রয়োজন নেই। বৈধ সমাধানের জন্য এটি কেবল কমপক্ষে একটি স্ট্রিংয়ের (যা খালি হতে পারে) সাথে মিলিত হওয়া এবং অবৈধ সমাধানের জন্য কোনও মিল নেই।

আপনি ধরে নিতে পারেন যে ইনপুটটি সর্বদা 81 পজেটিভ ডিজিটের স্ট্রিং থাকবে।

এটি রিজেেক্স গল্ফ, তাই বাইটের মধ্যে সংক্ষিপ্ততম রেজেক্স। আপনার ভাষার যদি /.../নিয়মিত অভিব্যক্তি বোঝাতে ডিলিমিটারদের (সাধারণত ) প্রয়োজন হয়, তবে নিজেরাই সীমানা গণনা করবেন না। আপনার সমাধানের যদি সংশোধকগুলির প্রয়োজন হয় তবে প্রতি বর্ধক প্রতি বাইট যুক্ত করুন।

পরীক্ষার মামলা

বৈধ বোর্ড:

123456789456789123789123456231564897564897231897231564312645978645978312978312645
725893461841657392396142758473516829168429537952378146234761985687935214519284673
395412678824376591671589243156928437249735186738641925983164752412857369567293814
679543182158926473432817659567381294914265738283479561345792816896154327721638945
867539142324167859159482736275398614936241587481756923592873461743615298618924375
954217683861453729372968145516832497249675318783149256437581962695324871128796534
271459386435168927986273541518734269769821435342596178194387652657942813823615794
237541896186927345495386721743269158569178432812435679378652914924813567651794283
168279435459863271273415986821354769734692518596781342615947823387526194942138657
863459712415273869279168354526387941947615238138942576781596423354821697692734185
768593142423176859951428736184765923572389614639214587816942375295837461347651298
243561789819327456657489132374192865926845317581673294162758943735914628498236571
243156789519847326687392145361475892724918653895263471152684937436729518978531264
498236571735914628162758943581673294926845317374192865657489132819327456243561789
978531264436729518152684937895263471724918653361475892687392145519847326243156789
341572689257698143986413275862341957495726831173985426519234768734869512628157394

অবৈধ বোর্ড:

519284673725893461841657392396142758473516829168429537952378146234761985687935214
839541267182437659367158924715692843624973518573864192298316475941285736456729381
679543182158926473432817659567381294914256738283479561345792816896154327721638945
867539142324167859159482736275398684936241517481756923592873461743615298618924375
754219683861453729372968145516832497249675318983147256437581962695324871128796534
271459386435168927986273541518734269769828435342596178194387652657942813823615794
237541896186927345378652914743269158569178432812435679495386721924813567651794283
168759432459613278273165984821594763734982516596821347615437829387246195942378651
869887283619214453457338664548525781275424668379969727517385163319223917621449519
894158578962859187461322315913849812241742157275462973384219294849882291119423759
123456789456789123564897231231564897789123456897231564312645978645978312978312645
145278369256389147364197258478512693589623471697431582712845936823956714931764825
243561789829317456657489132374192865916845327581673294162758943735924618498236571
243156789529847316687392145361475892714928653895263471152684937436719528978531264
498236571735924618162758943581673294916845327374192865657489132829317456243561789
978531264436719528152684937895263471714928653361475892687392145529847316243156789
342571689257698143986413275861342957495726831173985426519234768734869512628157394
345678192627319458892451673468793521713524986951862347179246835534187269286935714
341572689257698143986413275862341957495726831173985426519234768734869512628517394

পরবর্তী পরীক্ষার ক্ষেত্রে, আপনি এই সিজেএম স্ক্রিপ্টটি ব্যবহার করতে পারেন যা একটি বৈধ বোর্ডকে ইনপুট হিসাবে গ্রহণ করে এবং এলোমেলোভাবে একটি নতুন বৈধ বোর্ড দেওয়ার জন্য এটিকে এলোমেলো করে দেয় (ইনপুট ফর্ম্যাটটি যতক্ষণ না কেবলমাত্র এটিতে অঙ্ক এবং allyচ্ছিকভাবে সাদা স্থান থাকে অপ্রাসঙ্গিক)।

যদি আপনার রেজেক্স .NET গন্ধের সাথে সামঞ্জস্য করে তবে আপনি রেটিনা ব্যবহার করে অনলাইনে এটি পরীক্ষা করতে পারেন । একটি বৈধ সমাধান 0অবৈধ বোর্ডগুলির জন্য এবং বৈধ বোর্ডগুলির জন্য কিছু ইতিবাচক পূর্ণসংখ্যা মুদ্রণ করা উচিত । সমস্ত পরীক্ষার কেস একবারে চালানোর জন্য, এই টেম্পলেটটি ব্যবহার করুন এবং দ্বিতীয় লাইনে রেজেক্স sertোকান। আপনার যদি রিজেক্স মডিফায়ারগুলির প্রয়োজন `হয় তবে একটি রেগেক্সে প্রিপেন্ড করুন এবং মানক সংশোধক অক্ষরটিকে সামনে রাখুন।



1
যদি কেবল এটিই ছিল [কোড-বোলিং], হ'ল।
mbomb007

অপেক্ষা করুন ... আমরা যদি পাইথন ব্যবহার করি, আমরা কেবল নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারি , আর কিছুই না? এছাড়াও, প্রতিটি বোর্ড কত বড়? একটি নির্দিষ্ট আকার আছে? যদি তা না হয় তবে কীভাবে আমরা প্রতিটি বোর্ডের নীচে অঙ্কের গোছা থেকে বের করতে পারি valid boards?
আর কাপ,

@ আর.ক্যাপ আপনি যে স্বাদটি ব্যবহার করছেন তা বিবেচনা না করেই আপনার কেবলমাত্র রেজেক্স (এবং সম্ভবত কিছু সংশোধক) জমা দেওয়া উচিত, হ্যাঁ। প্রতিটি ইনপুট হ'ল 81 অঙ্কের এবং একটি সম্পূর্ণ বোর্ডের প্রতিনিধিত্ব করে। (পরীক্ষার ক্ষেত্রে প্রতিটি লাইন একটি পৃথক বোর্ড))
মার্টিন এেন্ডার

আমি এসকিউএলে সহজ সুডোকু সমাধান করার জন্য একটি স্ক্রিপ্ট লিখেছিলাম। আমি নিশ্চিত যে এটি এই প্রশ্নের জন্য আবার লেখা যেতে পারে। তবে এসকিউএল-তে খুব বেশি আরইজিইএক্স নেই। এটি কি উত্তরটিকে অযোগ্য ঘোষণা করে? (স্ক্রিপ্ট সম্ভবত 400
টির

উত্তর:


40

রুবি রেজেেক্স, 71 78 73 বাইট

^(?!.*(?=(.))(.{9}+|(.(?!.{9}*$))+|(?>.(?!.{3}*$)|(.(?!.{27}*$)){7})+)\1)

আমি রুবিকে সত্যিই জানি না তবে দৃশ্যত এটি ক্যাসকেড কোয়ানটিফায়ার সম্পর্কে অভিযোগ করে না।

এখানে চেষ্টা করুন।

.এনইটি রেজেক্স, 79 78 75 বা 77 বাইট

কারণ মার্টিন মনে করেন এটি সম্ভব! ... তবে আমার ধারণা, তিনিও এই পরিবর্তনগুলি সংহত করবেন।

^(?!(.)+((.{9})+|(?>(.{9})+
|.)+|(?((...)*
)(?>(.{27})+
|.){7}|.)+)(?<=\1))

কাজ করার জন্য ইনপুটটিতে একটি ট্রিলিং নিউলাইন দরকার। আমি নিশ্চিত না যে আমাকে এটি করার অনুমতি দেওয়া হয়েছে (সম্ভবত না)।

এখানে চেষ্টা করুন।

77 বাইট বুদ্ধিমান সংস্করণ:

^(?!(.)+((.{9})+|((?!(.{9})*$).)+|(?((...)*$)((?!(.{27})*$).){7}|.)+)(?<=\1))

আমার পূর্ববর্তী সংস্করণে ত্রুটিটি নির্দেশ করার জন্য এবং 1 বাইট (গানের জন্য (...)*) গল্ফ করার জন্য নীলকে ধন্যবাদ জানাই ।

এখানে চেষ্টা করুন।

পিসিআরই, 77 78 বাইট

^(?!.*(?=(.))((.{9})+|(.(?!(?3)*$))+|(?(?=.(...)*$)(.(?!(.{27})*$)){7}|.)+)\1)

শুধু সম্পূর্ণতার জন্য।

এখানে চেষ্টা করুন।

অন্য সংস্করণ, এছাড়াও 78 বাইট:

^(?!.*(?=(.))((.{9})+|(.(?!(?3)*$))+|(?>.(?!(...)*$)|(.(?!(.{27})*$)){7})+)\1)

এখানে চেষ্টা করুন।

ব্যাখ্যা

^(?!.*                    # Match a string that doesn't contain the pattern,
                          # at any position.
  (?=(.))                 # Capture the next character.
  (
    (.{9})+               # Any 9*n characters. The next character is in
                          # the same column as the captured one.
  |
    (.(?!(.{9})*$))+      # Any n characters not followed by a positions 9*m
                          # to the end. The next character is in the same row
                          # as the captured one.
  |
    (                     # Any n occasions of...
    ?(.(...)*$)           # If it is at a position 3*k+1 to the end:
      (.(?!(.{27})*$)){7} # Then count 7*m characters that are not followed
                          # by a position 27*j to the end,
    |
      .                   # Else count any character.
    )+                    # The next character is in the same block as the
                          # captured one.
  )
  \1                      # Fail if the next character is the captured character.
)

বাহ ভাল কাজ। আমি এটি নেট .NET এ মাত্র 83 এ পেয়েছি এবং 78 for এর জন্য পিসিআরইতে যেতে হয়েছিল I আমারও সন্দেহ নেই যে আপনিও তা মারবেন। :)
মার্টিন এন্ডার

@ মার্টিনব্যাটনার ইয়েপ
নিক হার্টলি

আমি ভেবেছিলাম আমার মার্টিনব্যাটনারকে (সেই সময়ে) 4 বাইটের কাছে মারতে লুকেহেডের ব্যবহারটি পরিষ্কার ছিল তবে আপনি এটি পরবর্তী স্তরে নিয়ে গিয়েছেন।
নীল

দুঃখিত, তবে এটি সনাক্ত করে না যে (1, 2) এবং (2, 1) এর ঘরগুলি একই এবং একইভাবে স্কয়ারের অন্যান্য কক্ষগুলির জন্য যেখানে নকলটি নীচে এবং বামে রয়েছে।
নীল

1
@ মার্টিনবাটনার আমি ঠিক বুঝতে পেরেছি যে আমি আমার দ্বিতীয় পিসিআরই সংস্করণটি রুবিতে অনুবাদ করতে পারি ... আমার ধারণা আপনি এখনই উত্তরটি পোস্ট করতে পারবেন ...
জিমি ২৩০১৩

34

পিসিআরই, 117 119 130 133 147 বাইট

^(?!(.{27})*(...){0,2}(.{9})?.?.?(.).?.?(?=(?2)*$).{6,8}(?3)?\4.{0,17}(?1)*$|.*(.)(.{8}(?3)*|((?!(?3)*$)(|.(?7))))\5)

পাইথন, জাভা ইত্যাদি স্বাদেও কাজ করা উচিত। এখন পুনরাবৃত্তি! এবং "পুনরাবৃত্তি" বৈশিষ্ট্যটি "সাব্রুটাইনস" এর জন্য অ-পুনরাবৃত্তভাবে ব্যবহৃত হয়েছিল, যা আমাকে আসল পুনরাবৃত্তি ব্যবহার না করা পর্যন্ত আমি সম্পূর্ণরূপে ভুলে গিয়েছিলাম।


দুর্দান্ত ধারণা - নোরপিটগুলির সাথে মিলের পরিবর্তে পুনরাবৃত্তিগুলি এড়িয়ে চলুন!
কিওয়ারটি

1
আপনি লিখতে পারবেন না এটা লজ্জাজনক .{27}*
নীল

বাহ, আমি আপনার 133 বাইট সমাধানটি কেবল 121 বাইটে গল্ফ করেছিলাম কেবল এটির জন্য আপনি এটি আবার লিখে ফেলতে পারেন তবে এখানে তা যাইহোক:^(?!(.{27})*(.{9})?(...){0,2}.?.?(.).?.?(?=(...)*$)(.{9})?.{6,8}\4.{0,17}(.{27})*$|.*(.)((.{9})+|((?!(.{9})*$).)+)(<=\8))
নিল

@ নীল এটি কি স্বাদ? আমার কাছে পরিচিত পিসিআরআই বা অন্যরা কোনও চেহারাটির পিছনে পিছনে থাকার অনুমতি দেয় না।
feersum

@ নীল (<=\8)বৈধ সিনট্যাক্সের মতো দেখাচ্ছে না (এটি একটি মিস করছে ?)। এছাড়াও, আমি জানি যে একমাত্র গন্ধটি লুকবাইন্ডসে ব্যাক-রেফারেন্সগুলিকে সমর্থন করে is নেট।
মার্টিন এন্ডার

15

.NET রেজেক্স, 8339 বাইট

হ্যাঁ, আমি জানি আমার সমাধানটি খুব নির্বোধ, যেহেতু মার্টিন আমাকে বলেছিলেন যে তিনি এটি 130 বাইটের মতো করেছিলেন। প্রকৃতপক্ষে, অনলাইনে এটি চেষ্টা করার URL টি এত দীর্ঘ যে আমি কোনও ইউআরএল শর্টনার খুঁজে পাইনি যা এটি গ্রহণ করবে।

(code removed, since it's so long nobody will read it here, 
and it made the post take forever to load. Just use the "Try it online" link.)

নীচের লিঙ্কটি আইই তে কাজ করে না তবে ক্রোম এবং ফায়ারফক্সে কাজ করে।

এটি অনলাইনে চেষ্টা করে দেখুন -!`শুরুতেসহায়তার সাথে সমস্ত পরীক্ষার কেস একবারেবাইট গণনায় অন্তর্ভুক্ত থাকে না।


এখানে পাইথন স্ক্রিপ্ট আমি এটা (কোড নীচে) জেনারেট করতে ব্যবহৃত:

R=range(0,9)
S=range(1,10)

o = ""

# validate rows
T = "(?=.{%s,%s}%s)"
for j in R:
    for i in S:
        o += T % (9*j,9*(j+1)-1, i)

# validate columns
# "(?=(.{%s}|.{%s}|.{%s}|.{%s}|.{%s}|.{%s}|.{%s}|.{%s}|.{%s})%s)"
T = "(?=("+"|".join([".{%s}"]*9)+")%s)"
for j in R:
    for i in S:
        o += T % (j,j+9,j+18,j+27,j+36,j+45,j+54,j+63,j+72, i)

# validate boxes
# (?=.{0,2}1|.{9,11}1|.{18,20}1)(?=.{3,5}1|.{12,14}1|.{21,23}1)
# (?=.{27,29}1|.{36,38}1|.{45,47}1)
T = ".{%s,%s}%s"
for i in S:
    for x in (0,27,54):
        for y in (0,3,6):
            o += "(?="+"|".join(T % (x+y+z,x+y+z+2, i) for z in (0,9,18))+")"

o += ".{81}"

o = o.replace(".{0}","").replace(",80}",",}")
print(o)

1
আমি আপনার জন্য রুট করছি
মার্টিজন

4
মজার কি জানো? অনলাইন লিঙ্কটি চেষ্টা করে IE ক্রাশ হয়ে যাবে কারণ এটি অনেক দীর্ঘ: পি
বিড়াল

15
@ কেট এই কারণেই আইইয়ের একমাত্র আসল উদ্দেশ্য ব্যবহারকারীকে ফায়ারফক্স (বা ক্রোমিয়াম) ডাউনলোড করার অনুমতি দিচ্ছে।
বাইট কমান্ডার

2
@ ক্যাট এটি উইন্ডোজ ৮.১ এ আইই ১১ কে ক্র্যাশ করে না যদিও রিজেক্স সঠিকভাবে প্রক্রিয়াজাত করে না।
Nzall

2
@ কেট এটি উইন্ডোজ on এ আমার আইই ১১ টি ক্রাশ করে না It এটি কেবল ইউআরএল কেটে দেয়।
mbomb007

14

.এনইটি রেজেক্স, 121 বাইট

^(?!(.{27})*(.{9})?(...){0,2}.?.?(.).?.?(?=(...)*$)(.{9})?.{6,8}\4.{0,17}(.{27})*$|.*(?=(.))((.{9})+|(.(?!(.{9})*$))+)\8)

ব্যাখ্যা:

^(?!                     Invert match (because we're excluding duplicates)
 (.{27})*                Skip 0, 3 or 6 rows
 (.{9})?                 Optionally skip another row
 (...){0,2}              Skip 0, 3 or 6 columns
 .?.?(.).?.?(?=(...)*$)  Choose any of the next three cells
 (.{9})?                 Optionally skip another row
 .{6,8}\4                Match any of the three cells below
 .{0,17}(.{27})*$        As long as they're from the same square
|                        OR
 .*(?=(.))(              Choose any cell
  (.{9})+                Skip at least one row
 |                       or
  (.                     Skip cells
   (?!(.{9})*$)          Without reaching the end of the row
  )+                     For at least one cell (i.e. the cell chosen above)
 )\8)                    Match the chosen cell to the next cell
)

সুন্দর, সারি এবং কলামগুলির আপনার সংমিশ্রণটি বেশ চালাক। এটি আমার নিজের সমাধানে 4 বাইট সঞ্চয় করে। :)
মার্টিন এন্ডার

8

পিসিআরই, 3579 বাইট

একটি একেবারে ভয়ানক হিংস্র শক্তি সমাধান। নেতিবাচক চেহারা আহে!

আমি এটিকে পরিত্যাগ করার জন্য অনেক বেশি সময় ব্যয় করেছি, সুতরাং এটি এখানে রয়েছে উত্তরসূরির জন্য।

উজ্জ্বল দিকে, যদি সুডোকু হঠাৎ করে 9 টি চরিত্রের আলাদা সেট ব্যবহার শুরু করে, এটি এখনও কাজ করবে, আমার ধারণা ...

http://pastebin.com/raw/CwtviGkC

কীভাবে রেটিনা পরিচালনা করতে হয় তা আমি জানি না তবে আপনি এটি https://regex101.com বা অনুরূপতেও পেস্ট করতে পারেন এবং এটি মিলবে।

রেজিেক্স উত্পন্ন করতে ব্যবহৃত রুবি কোড:

# Calculate the block you're in
def block(x)
    x /= 3
    x + x%3 - x%9
end

81.times do |i|
    row, col = i.divmod(9)
    neg = []
    neg += (0...col).map {|e| 9*row + e + 1}
    neg += (0...row).map {|e| 9*e + col + 1}
    neg += (0...i).map {|e| e + 1 if block(e) == block(i)}.compact
    neg = neg.uniq.sort.map {|e| "\\#{e}"}
    if neg.size > 0
        print "(?!#{neg.join '|'})"
    end
    print "(.)"
end

8

রুবি গন্ধ, 75 74 বাইট

1 বাইট সংরক্ষণের জন্য জিমি 23013 কে ধন্যবাদ।

^(?!(.{9}*(.|(.)){,8}|.*(\g<2>.{8})*|.{27}?.{3}?(\g<2>{3}.{6}){,2}.?.?)\3).

এটি এখানে পরীক্ষা করুন।

এখন এটি শেষ পর্যন্ত মারধর করার পরে, আমি নিজের সমাধানটি ভাগ করতে পারি। :) আমি প্রক্রিয়াটিতে একটি আকর্ষণীয় (সম্ভবত নতুন?) রেজেক্স কৌশল আবিষ্কার করেছি (যা (.|(.)){,8}\3অংশটি) সম্ভবত এই ক্ষেত্রে অপ্রতিদ্বন্দ্বী হতে পারে যেখানে রেজেক্সের অন্যান্য অংশগুলির সাথে এটি একত্রিত করা যায় না (যেমন জিমি 23013 এর উত্তরে ছিল) ।

ব্যাখ্যা

অন্যান্য সংক্ষিপ্ত উত্তরগুলির মতো আমিও নেতিবাচক চেহারা ব্যবহার করছি যা সারি, কলাম বা ব্লকগুলিতে সদৃশ অনুসন্ধান করে। সমাধানের প্রাথমিক বিল্ডিং ব্লকটি হ'ল:

(.|(.))...\3

নোট করুন যে \3তিনটি পৃথক বিকল্পের মধ্যে পুনরায় ব্যবহার করা হয়েছে (যা সমস্ত 3সদৃশ সনাক্তকরণের জন্য গ্রুপ ব্যবহার করে)।

বাম দিকের সেই গোষ্ঠীটি (যা গোষ্ঠী 2সহ গোষ্ঠী সমেত 3) এমন কোনও অবস্থানের জন্য ব্যবহৃত হয় যা সদৃশ অঙ্কের প্রথমার্ধ থাকতে পারে (এমন একটি গোষ্ঠীর মধ্যে যাতে সদৃশ অঙ্কগুলি থাকা উচিত নয়)। তারপরে ...এমন একটি জিনিস যা আমাদের পরবর্তী অবস্থান পায় যেখানে এই জাতীয় একটি সংখ্যার উপস্থিতি ঘটে (যদি প্রয়োজন হয়) এবং \3ব্যাকরেন্সের মাধ্যমে নকলটির দ্বিতীয়ার্ধটি সন্ধান করার চেষ্টা করে। যে কারণে এটি কাজ করে তা ব্যাকট্র্যাকিং। ইঞ্জিনটি প্রথম মিললে (.|(.))এটি .প্রতিটি সময় কেবল ব্যবহার করবে এবং কোনও কিছুই ক্যাপচার করবে না। এখন \3শেষে ব্যর্থ। তবে এখন ইঞ্জিনটি ধীরে ধীরে পৃথক ম্যাচের (.)পরিবর্তে ব্যবহারের চেষ্টা করবে .। শেষ পর্যন্ত, যদি কোনও সদৃশ থাকে তবে এটি মিলবে যেখানে(.).সদৃশটির প্রথম অঙ্কে সর্বশেষ ব্যবহার করা হয়েছিল (যেমন ক্যাপচারটি পরে ওভাররাইট করা হয় না), এবং তারপরে পিছনের দিকের ব্যবধানটি সরিয়ে দিতে আরও কিছু ব্যবহার করে। যদি কোনও সদৃশ থাকে তবে ব্যাকট্র্যাকিং সর্বদা এটি খুঁজে পাবেন।

তিনটি পৃথক অংশ যেখানে এটি ব্যবহার করা হয় তা দেখুন:

.{9}*(.|(.)){,8}

এটি কয়েকটি সারিতে নকলের জন্য পরীক্ষা করে। প্রথমে আমরা যে কোনও সারিতে চলে যাই .{9}*। তারপরে আমরা 8চ্ছিক ডুপ্লিকেট ক্যাপচারটি ব্যবহার করে 8 টি অক্ষর (অর্থাত্ শেষ পয়েন্ট ব্যতীত সেই সারিটির কিছু) মিলাব এবং এর \3পরে এটির সন্ধান করার চেষ্টা করব ।

.*(\g<2>.{8})*

এটি কোনও কলামে সদৃশগুলির সন্ধান করে। প্রথমত, দ্রষ্টব্য যে \g<2>এটি একটি সাবরুটাইন কল, তাই এটি এর মতো:

.*((.|(.)).{8})*

যেখানে দুই দলের আমরা শুধু সন্নিবেশিত করেছেন তা এখনো হিসেবে উল্লেখ করা হয় 2এবং 3

এখানে, .*কেবল প্রয়োজন হিসাবে যথাসম্ভব এড়িয়ে চলে (এটি এখানে 8 টি অক্ষরের সাথে মেলে যথেষ্ট হবে, তবে এটির জন্য আরও বাইট খরচ হয়)। তারপরে বাইরের গোষ্ঠীটি একযোগে একটি সম্পূর্ণ সারি (যা দুটি শারীরিক সারি জুড়ে দিতে পারে) এর সাথে মেলে, allyচ্ছিকভাবে প্রথম অক্ষর ক্যাপচার করে। এর \3ঠিক পরে অনুসন্ধান করা হবে, যা ক্যাপচার এবং ব্যাকেরফেরেন্সের মধ্যে উল্লম্ব সারিবদ্ধতা নিশ্চিত করে।

অবশেষে, ব্লকগুলি পরীক্ষা করা:

.{27}?.{3}?(\g<2>{3}.{6}){,2}.?.?

আবার, এটি \g<2>একটি সাবরুটিন কল, সুতরাং এটি একই:

.{27}?.{3}?((.|(.)){3}.{6}){,2}.?.?

ব্লকগুলি যাচাই করতে, নোট করুন যেহেতু আমরা ইতিমধ্যে সমস্ত সারি এবং কলামগুলি পরীক্ষা করেছি তাই আমাদের কেবলমাত্র 3x3 টি ব্লক পরীক্ষা করতে হবে। যখন আমরা জানি যে সমস্ত সারি এবং কলাম পাশাপাশি এই 3x3 টি ব্লকটি সঠিক:

XX.
XX.
...

তারপরে আমরা জানি যে বাকী ব্লকগুলিতে সম্ভবত নকল থাকতে পারে না। তাই আমি কেবল এই চারটি ব্লক পরীক্ষা করছি। তদ্ব্যতীত, নোট করুন যে আমাদের 3x3 ব্লকের একই সারিতে ডুপ্লিকেট সন্ধান করতে হবে না। এক সারিতে সদৃশটির প্রথম অর্ধেক সন্ধান করার জন্য এবং আরও নীচে এক সারিতে দ্বিতীয়ার্ধের জন্য অনুসন্ধান করা যথেষ্ট।

কোডটি নিজেই জন্য, আমরা প্রথমে চারটি ব্লকের একটিতে শুরুতে এলো .{27}?.{3}?(allyচ্ছিকভাবে তিনটি সারি বাদ দিন, তিনটি কলাম বাদ দিতে পারেন)। তারপরে আমরা 3x3 ব্লকের সারিগুলির দুটির সাথে একই কৌতুকের সাথে আগে সারিগুলির জন্য ব্যবহার করার চেষ্টা করেছি:

(.|(.)){3}.{6}

আমরা 3x3 ব্লকের বর্তমান সারিতে 3 টির কোনওরও ক্যাপচার করার অনুমতি দিচ্ছি না এবং তারপরে পরবর্তী সারিতে চলে যান .{6}। পরিশেষে, আমরা যে সারির শেষটি পাই তার 3 টির মধ্যে একটির মধ্যে নকল খুঁজতে চেষ্টা করি:

.?.?

এবং এটাই.


74: ^(?!(.*((.|(.)).{8})*|.{9}*\g<3>{,8}|.{27}?.{3}?(\g<3>{3}.{6}){,2}.?.?)\4); 73: ^(?!(.*((.|(.)|\4()).{8})*|.{9}*\g<3>{9}|.{27}?.{3}?(\g<3>{3}.{6}){3})\5)
jimmy23013

@ jimmy23013 আমি \4()3x3 ব্লকের জন্য পূর্ববর্তী সংস্করণে ট্রিকটি ব্যবহার করছি, তবে এটি থেকে মুক্তি পেয়েছি , কারণ এটি দীর্ঘ ছিল। : ডি
মার্টিন এন্ডার

@ জিমি ২৩০১৩৩ 73৩ জন যদিও সর্বশেষ সারিটি যাচাই করে না:341572689257698143986413275862341957495726831173985426519234768734869512628517394
মার্টিন এন্ডার

6

জাভাস্ক্রিপ্ট রিজেক্স, 532 530 481 463 অক্ষর

সারিগুলি বৈধ করুন:

/^((?=.{0,8}1)(?=.{0,8}2)(?=.{0,8}3)(?=.{0,8}4)(?=.{0,8}5)(?=.{0,8}6)(?=.{0,8}7)(?=.{0,8}8)(?=.{0,8}9).{9})+$/

কলামগুলি বৈধ করুন:

/^((?=(.{9}){0,8}1)(?=(.{9}){0,8}2)(?=(.{9}){0,8}3)(?=(.{9}){0,8}4)(?=(.{9}){0,8}5)(?=(.{9}){0,8}6)(?=(.{9}){0,8}7)(?=(.{9}){0,8}8)(?=(.{9}){0,8}9).){9}/

এর প্রথম চর থেকে স্কোয়ারটি বৈধ করুন:

/(?=.?.?(.{9}){0,2}1)(?=.?.?(.{9}){0,2}2)(?=.?.?(.{9}){0,2}3)(?=.?.?(.{9}){0,2}4)(?=.?.?(.{9}){0,2}5)(?=.?.?(.{9}){0,2}6)(?=.?.?(.{9}){0,2}7)(?=.?.?(.{9}){0,2}8)(?=.?.?(.{9}){0,2}9)/

স্কোয়ার শুরু করতে পূর্বরূপ সেট করুন:

/^(((?=)...){3}.{18})+$/

এবং পুরো প্রকাশ:

/^(?=((?=.{0,8}1)(?=.{0,8}2)(?=.{0,8}3)(?=.{0,8}4)(?=.{0,8}5)(?=.{0,8}6)(?=.{0,8}7)(?=.{0,8}8)(?=.{0,8}9).{9})+$)(?=((?=(.{9}){0,8}1)(?=(.{9}){0,8}2)(?=(.{9}){0,8}3)(?=(.{9}){0,8}4)(?=(.{9}){0,8}5)(?=(.{9}){0,8}6)(?=(.{9}){0,8}7)(?=(.{9}){0,8}8)(?=(.{9}){0,8}9).){9})(((?=.?.?(.{9}){0,2}1)(?=.?.?(.{9}){0,2}2)(?=.?.?(.{9}){0,2}3)(?=.?.?(.{9}){0,2}4)(?=.?.?(.{9}){0,2}5)(?=.?.?(.{9}){0,2}6)(?=.?.?(.{9}){0,2}7)(?=.?.?(.{9}){0,2}8)(?=.?.?(.{9}){0,2}9)...){3}.{18})+$/

পুরো স্ট্রিংয়ের সাথে মেলে।


জাভাস্ক্রিপ্ট ES6 এ পরীক্ষা করুন:

r = /^(?=((?=.{0,8}1)(?=.{0,8}2)(?=.{0,8}3)(?=.{0,8}4)(?=.{0,8}5)(?=.{0,8}6)(?=.{0,8}7)(?=.{0,8}8)(?=.{0,8}9).{9})+$)(?=((?=(.{9}){0,8}1)(?=(.{9}){0,8}2)(?=(.{9}){0,8}3)(?=(.{9}){0,8}4)(?=(.{9}){0,8}5)(?=(.{9}){0,8}6)(?=(.{9}){0,8}7)(?=(.{9}){0,8}8)(?=(.{9}){0,8}9).){9})(((?=.?.?(.{9}){0,2}1)(?=.?.?(.{9}){0,2}2)(?=.?.?(.{9}){0,2}3)(?=.?.?(.{9}){0,2}4)(?=.?.?(.{9}){0,2}5)(?=.?.?(.{9}){0,2}6)(?=.?.?(.{9}){0,2}7)(?=.?.?(.{9}){0,2}8)(?=.?.?(.{9}){0,2}9)...){3}.{18})+$/
;`123456789456789123789123456231564897564897231897231564312645978645978312978312645
725893461841657392396142758473516829168429537952378146234761985687935214519284673
395412678824376591671589243156928437249735186738641925983164752412857369567293814
679543182158926473432817659567381294914265738283479561345792816896154327721638945
867539142324167859159482736275398614936241587481756923592873461743615298618924375
954217683861453729372968145516832497249675318783149256437581962695324871128796534
271459386435168927986273541518734269769821435342596178194387652657942813823615794
237541896186927345495386721743269158569178432812435679378652914924813567651794283
168279435459863271273415986821354769734692518596781342615947823387526194942138657
863459712415273869279168354526387941947615238138942576781596423354821697692734185
768593142423176859951428736184765923572389614639214587816942375295837461347651298`
.split`
`.every(r.test.bind(r))
&&
`519284673725893461841657392396142758473516829168429537952378146234761985687935214
839541267182437659367158924715692843624973518573864192298316475941285736456729381
679543182158926473432817659567381294914256738283479561345792816896154327721638945
867539142324167859159482736275398684936241517481756923592873461743615298618924375
754219683861453729372968145516832497249675318983147256437581962695324871128796534
271459386435168927986273541518734269769828435342596178194387652657942813823615794
237541896186927345378652914743269158569178432812435679495386721924813567651794283
168759432459613278273165984821594763734982516596821347615437829387246195942378651
869887283619214453457338664548525781275424668379969727517385163319223917621449519
894158578962859187461322315913849812241742157275462973384219294849882291119423759
123456789456789123564897231231564897789123456897231564312645978645978312978312645
145278369256389147364197258478512693589623471697431582712845936823956714931764825`
.split`
`.every(s => !r.test(s))

আমি মনে করি সারিগুলির চেয়ে কলামগুলি আরও সহজ হওয়া উচিত, তাই আমি এটি কৌতূহলী মনে করি যে আপনার কলামের রেজেক্সটি আপনার সারিটির চেয়ে দীর্ঘ।
পিটার টেলর

পিটারটেলর, তাদের কাঠামোগুলি একই রকম, তবে কলামগুলির জন্য আমাকে 1 এর পরিবর্তে 9 টি অক্ষর এড়িয়ে যেতে হবে, সুতরাং পরবর্তীটির কারণে বন্ধনীতে .প্রবেশ করান । আপনি কেন কলামগুলি সংক্ষিপ্ত হওয়া উচিত বলে মনে করেন? (.{9}){0,8}
কিওয়ারটি

@ পিটারটেলর, হ্যাঁ, কলামগুলি সরল হত যদি আমি প্রত্যাখ্যানের বিষয়টি পরীক্ষা করে দেখি।
কিউয়ের্তি

@ সুপারজেডি ২৪৪, জাভাস্ক্রিপ্ট কেন? আমি আশা করি এই রেজেক্সটি সর্বত্র বৈধ হবে।
কিওয়ারটি

6
@ কিওয়ার্টি যদিও আপনার রেজেক্সটি অনেক স্বাদে কাজ করা উচিত, এটি লুক হেডসগুলিতে নির্ভর করে (উদাহরণস্বরূপ লুয়া বা ওক্যামলে পাওয়া যায় না)। এটি একটি অবৈধ বেসিক বা বর্ধিত নিয়মিত অভিব্যক্তিও যা সম্পূর্ণ ভিন্ন বাক্য গঠন ব্যবহার করে। বৈধতা দাবির জন্য স্বাদ গ্রহণ করা ভাল, এমনকি যদি সমাধান আরও অনেকের মধ্যে কাজ করে।
ডেনিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.