স্থানীয় স্ট্রিং


20

স্থানীয় সময়কাল

একটি খালি স্ট্রিং নিন গুলিস্থানীয় সময়ের এর গুলি সূচিতে আমি পূর্ণসংখ্যা ইতিবাচক সবচেয়ে ছোট এন যেমন যে প্রত্যেকের জন্য 0 ≤ ট <এন , আমরা গুলি [i + K] = গুলি [i-এন + K] যখনই উভয় পক্ষের সংজ্ঞায়িত করা হয়। অন্যথা, এটি একটি nonempty স্ট্রিং এর ন্যূনতম দৈর্ঘ্য হল W যেমন যে যদি সংযুক্তকরণের WW পাশে স্থাপন করা হয় গুলি , যাতে দ্বিতীয় কপি যে W সূচিতে শুরু আমি এর গুলি , তারপর দুটি স্ট্রিং যেখানেই তারা ওভারল্যাপ সম্মত হন।

একটি উদাহরণ হিসাবে, এর স্থানীয় সময়কাল গণনা করা যাক s = "আবাবাব" এর (0-ভিত্তিক) সূচক 2 ।

  • এন = 1 চেষ্টা করুন : তার পরে [2 + 0] ≠ গুলি [2-1 + 0] , সুতরাং এই পছন্দটি সঠিক নয়।
  • এন = 2 : তার পরে চেষ্টা করুন [2 + 0] = গুলি [2-2 + 0] তবে এস [2 + 1] ≠ এস [2-2 + 1] , সুতরাং এটিও সঠিক নয়।
  • N = 3 চেষ্টা করুন : তার পরে [2 + 0-3] সংজ্ঞায়িত করা হয়নি, s [2 + 1] = s [2-3 + 1] এবং এস [2 + 2] = এস [2-3 + 2] । এভাবে স্থানীয় সময়কাল 3।

এখানে দ্বিতীয় সংজ্ঞা ব্যবহার স্থানীয় সময়কালের দ্বারা নির্দিষ্ট কল্পনা, দুটি অনুলিপি মধ্যে যোগ সেমিকোলন সাথে আছেন W স্বচ্ছতার জন্য:

index      a b a a b b a b      period
 0       a;a                     1
 1       b a;b a                 2
 2       a a b;a a b             3
 3             a;a               1
 4     b b a b a a;b b a b a a   6
 5                 b;b           1
 6               a b b;a b b     3
 7                   b a;b a     2

লক্ষ্য করুন W অগত্যা একটি সাবস্ট্রিং নয় গুলি । সূচি -4 ক্ষেত্রে এখানে এটি ঘটে।

কাজটি

আপনার ইনপুট একটি nonempty স্ট্রিং গুলি ছোট হাতের অক্ষর ব্যবহার ASCII অক্ষর আছে। এটি পছন্দসই অক্ষরের তালিকা হিসাবে নেওয়া যেতে পারে। আপনার আউটপুট এর প্রতিটি সূচকে স্থানীয় সময়কাল অন্তর্ভুক্ত তালিকা হবে । উপরের উদাহরণে, সঠিক আউটপুট হবে [1,2,3,1,6,1,3,2]

প্রতিটি ভাষায় সর্বনিম্ন বাইট গণনা জয়ী হয়। স্ট্যান্ডার্ড বিধি প্রযোজ্য।

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

a -> [1]
hi -> [1, 2]
www -> [1, 1, 1]
xcxccxc -> [1, 2, 2, 5, 1, 3, 2]
abcbacb -> [1, 4, 7, 7, 7, 3, 3]
nininini -> [1, 2, 2, 2, 2, 2, 2, 2]
abaabbab -> [1, 2, 3, 1, 6, 1, 3, 2]
woppwoppw -> [1, 4, 4, 1, 4, 4, 4, 1, 4]
qwertyuiop -> [1, 10, 10, 10, 10, 10, 10, 10, 10, 10]
deededeededede -> [1, 3, 1, 5, 2, 2, 5, 1, 12, 2, 2, 2, 2, 2]
abababcabababcababcabababcaba -> [1, 2, 2, 2, 2, 7, 7, 7, 7, 2, 2, 2, 19, 19, 5, 5, 2, 5, 5, 12, 12, 2, 2, 2, 7, 7, 5, 5, 2]

@ আর্নল্ড আপনি সর্বদা s এর মতো দৈর্ঘ্যের একটি ডব্লিউ খুঁজে পেতে পারেন । ক্ষেত্রে , W একটি আবর্তিত সংস্করণ হতে হবে । সূচক 4 আরও দেখুন উদাহরণ: W অগত্যা একটি সাবস্ট্রিং নয় গুলিqwertyuiopqwertyuiop
Zgarb

এটা বোধগম্য. আমি চ্যালেঞ্জ ভুলভাবে পড়েছি।
আরনাউল্ড

রৈখিক সময়ের সমাধানের জন্য খালি বোনাস! (অন্য কেউ প্রকৃত অনুগ্রহ দিতে পারে, তাই চেষ্টা চালিয়ে যান)
ব্যবহারকারী 202729

সত্যই ঝরঝরে চ্যালেঞ্জ, তবে আমি অবাক হয়েছি যে দুটি চরিত্রের মধ্যে (যেমন ;আপনার উদাহরণে যেখানেই আছে ) প্রতিটি অবস্থানের স্থানীয় সময়কালকে সংজ্ঞায়িত করা যদি আরও বেশি অর্থবোধ করে ? এটি অগ্রণী 1 থেকে মুক্তি পাবে
মার্টিন এন্ডার

@ মার্টিনএেন্ডার এটি ধারণাগতভাবে ক্লিনার হতে পারে তবে এই সংজ্ঞাটি স্ট্রিংয়ের উপরে লুপিং করে আউটপুট উত্পাদন করা সহজ করে তোলে এবং আউটপুট খালি থাকে না।
Zgarb

উত্তর:


4

রেটিনা , 89 86 বাইট

.
$`¶$<'¶
/(^|.+)¶.+/_(Lw$`^(.+)?(.*)(.+)?¶(?(1)|(.*))\2(?(3)$)
$2$3$4
G`.
%C`.
N`
0G`

এটি অনলাইন চেষ্টা করুন! সম্পাদনা: @ মার্টিনইেন্ডারকে ধন্যবাদ 3 টি বাইট সংরক্ষণ করা হয়েছে ব্যাখ্যা:

.
$`¶$<'¶

প্রতিটি অক্ষরে ইনপুট বিভক্ত করুন, এক জোড়া লাইনের তৈরি করুন, একটি উপসর্গের জন্য এবং একটি উপসর্গের প্রত্যয়ের জন্য।

/(^|.+)¶.+/_(

প্রতিটি ফলাফলের জুটিতে স্ক্রিপ্টের বাকী অংশটি চালান।

Lw$`^(.+)?(.*)(.+)?¶(?(1)|(.*))\2(?(3)$)
$2$3$4

সমস্ত ওভারল্যাপিং ম্যাচগুলি সন্ধান করুন এবং ফলাফলগুলি তালিকা করুন। (নিচে দেখ.)

G`.

খালি ম্যাচটি বাতিল করুন।

%C`.

প্রতিটি ম্যাচের দৈর্ঘ্য নিন।

N`

সংখ্যা অনুসারে বাছাই করুন।

0G`

সবচেয়ে ছোট নিন।

মিলটি উপসর্গ এবং প্রত্যয়কে তিন ভাগে বিভক্ত করে কাজ করে। বিবেচনা করার জন্য এখানে চারটি বৈধ মামলা রয়েছে:

AB|BC   B matches B to the left and B to the right
B|ABC   AB matches [A]B to the left and AB to the right
ABC|B   BC matches BC to the left and B[C] to the right
BC|AB   ABC matches [A]BC to the left and AB[C] to the right

রেজেক্স কেবল একবারে এবং সি কে এক সাথে একসাথে মিলতে দেয়।


$&$'সমান $<'এবং কম্পিউটিং লাইন দৈর্ঘ্য কম হয় %C`.tio.run/##K0otycxLNPz/X49LJeHQNhUb9UPbuPQ14mr0tDUPbdPT1o/…
মার্টিন এন্ডার

4

জাভা 8, 167 154 152 বাইট

s->{int l=s.length,r[]=new int[l],i=0,n,k;for(;i<l;r[i++]=n)n:for(n=0;;){for(k=++n;k-->0;)if(i+k<l&i+k>=n&&s[i+k]!=s[i-n+k])continue n;break;}return r;}

-2 বাইটস @ সিলিংক্যাটকে ধন্যবাদ ।

এটি অনলাইনে চেষ্টা করুন।

ব্যাখ্যা:

s->{                          // Method with char-array parameter and int-array return-type
  int l=s.length,             //  Length of the input-array
      r[]=new int[l],         //  Result-array of the same size 
      i=0,n,k;                //  Integers `i`, `n`, and `k` as defined in the challenge
  for(;i<l;                   //  Loop `i` in the range [0, `l`):
      r[i++]=n)               //    After every iteration: Add `n` to the array
    n:for(n=0;;){             //   Inner loop `n` from 0 upwards indefinitely
      for(k=++n;k-->0;)       //    Inner loop `k` in the range [`n`, 0]:
                              //    (by first increasing `n` by 1 with `++n`)
        if(i+k<l&i+k>=n)      //     If `i+k` and `i-n+k` are both within bounds,
           &&s[i+k]!=s[i-n+k])//     and if `s[i+k]` is not equal to `s[i-n+k]`:
          continue n;         //      Continue loop `n`
                              //    If we haven't encountered the `continue n` in loop `k`:
      break;}                 //     Break loop `n`
  return r;}                  //  Return the result

1

জাভাস্ক্রিপ্ট (ES6), 84 বাইট

অক্ষরের অ্যারে হিসাবে ইনপুট নেয়।

s=>s.map((_,i)=>s.some(_=>s.every(_=>k<j|!s[k]|s[k-j]==s[k++]|k-i>j,++j,k=i),j=0)*j)

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


আমি নিশ্চিত নই যে অক্ষরের একটি অ্যারে নেওয়ার অনুমতি দেওয়া হয়েছে, আপনি কি নিশ্চিত যে তারা কেবল 1-বর্ণের স্ট্রিং নয়?
এরিক আউটগল্ফার

@ এরিকথ আউটগলফার জেএস-তে কোনও চরিত্রের প্রকার নেই, তাই হ্যাঁ: এটি প্রযুক্তিগতভাবে 1-বর্ণের স্ট্রিংগুলির একটি অ্যারে। আমার বোধগম্যতা এটি যদি স্ট্রিংয়ের মতো শূন্য হয় তবে এটি একটি স্ট্রিং। (এটি সম্পর্কে একটি মেটা পোস্ট এখানে , তবে আরও প্রাসঙ্গিক একটি উপস্থিত থাকতে পারে - বা এমন একটি যা আসলে আমার অনুমানের সাথে
বিরোধী

1
বা অন্য কথায় বলতে গেলে: এটি জেএস- এর চরিত্রগুলির একটি তালিকাতে পৌঁছানোর মতোই কাছাকাছি , যা ওপির দ্বারা স্পষ্টতই অনুমোদিত ছিল।
আর্নৌল্ড

1

রুবি , 104 102 বাইট

->s{l=s.size-1
(0..l).map{|i|n=0
loop{n+=1
(n-i..l-i).all?{|k|k<0||k>=n||s[i+k]==s[i-n+k]}&&break}
n}}

এটি অনলাইন চেষ্টা করুন!

একটি ল্যাম্বদা একটি স্ট্রিং গ্রহণ করছে এবং একটি অ্যারে ফিরিয়ে দেবে।

-২ বাইট: সূচক সীমাবদ্ধ গার্ডগুলির সাথে অদলবদল পরিসীমা সমাপ্তি

Ungolfed:

->s{
  l=s.size-1                # l is the maximum valid index into s
  (0..l).map{ |i|           # i is the current index
    n=0                     # n is the period being tested
    loop{                   # Repeat forever:
      n+=1                  # Increment n
      (n-i..l-i).all?{ |k|  # If for all k where i+k and i-n+k are valid indexes into s
        k<0 || k>=n ||      #   We need not consider k OR
          s[i+k]==s[i-n+k]  #   The characters at the relevant indexes match
      } && break            # Then stop repeating
    }
  n                         # Map this index i to the first valid n
  }
}

1

জাপট , 33 32 বাইট

1 শাটগি ধন্যবাদ 1 বাইট সংরক্ষণ করা

¬Ë@¯E f'$iUtED ú.D r."($&|^)"}aÄ

এটি অনলাইন পরীক্ষা!

ব্যাখ্যা

¬Ë@¯E f'$iUtED ú.D r."($&|^)"}aÄ   Implicit: U = input string
¬Ë                                 Split the input into chars, and map each index E to
  @                          }aÄ     the smallest positive integer D where
   ¯E                                  the first E chars of U
      f                                matches the regex formed by
          UtED                         taking D chars of U from index E,
                ú.D                     padding to length D with periods,
                    r."($&|^)"          replacing each char C with "(C|^)",
        '$i                             and placing a '$' at the very end.

আমার প্রথম চিন্তাটি ছিল ঠিক জেএস উত্তরের মতো বাম সাবস্ট্রিংয়ের প্রতিটি চরিত্রকে ডান সাবস্ট্রিংয়ের সাথে সংশ্লিষ্ট চরের সাথে তুলনা করা। এটি কাজ করবে না, তবে জ্যাপের পদ্ধতি অনুসারে একটি চরিত্র পাওয়ার জন্য সূচকটি নেতিবাচক বা খুব বড় হলে স্ট্রিংয়ের অন্য প্রান্তে কেবল আবৃত হয়।

পরিবর্তে, আমার দ্রবণটি দ্বিতীয় স্ট্রিংয়ের বাইরে থেকে একটি রেজেক্স তৈরি করে এবং এটি প্রথম স্ট্রিংগুলিতে পরীক্ষা করে। abaabbabউদাহরণস্বরূপ পরীক্ষার ক্ষেত্রে ৫ ম আইটেমটি নেওয়া যাক :

abaabbab
    ^ split point -> abaa for testing regex, bbab for making regex

   slice  regex                              matches abaa
1. b      /(b|^)$/                           no
2. bb     /(b|^)(b|^)$/                      no
3. bba    /(b|^)(b|^)(a|^)$/                 no
4. bbab   /(b|^)(b|^)(a|^)(b|^)$/            no
5. bbab.  /(b|^)(b|^)(a|^)(b|^)(.|^)$/       no
6. bbab.. /(b|^)(b|^)(a|^)(b|^)(.|^)(.|^)$/  yes: /^^ab..$/

মূল কৌশলটি হ'ল ^ আসল চরিত্রের মিল না হওয়া পর্যন্ত অসীম সাথে মেলে। এটি আমাদেরকে রেজেক্সের শুরু থেকে যে কোনও সংখ্যক অক্ষরকে উপেক্ষা করতে দেয়, যখন পরীক্ষাটি স্ট্রিংয়ের শেষে সমাপ্ত হয় এবং বাকী সমস্তগুলি ধারাবাহিকভাবে মিলে যায় তা নিশ্চিত করে।

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



@ শেগি ধন্যবাদ, সেমিকোলন আমাকে
বগল

1

সি (জিসিসি) , 143 142 140 139 128 126 123 বাইট

  • একটি বাইট সংরক্ষণ করা। গল্ফড !b&&printfটু b||printf
  • কেভিন ক্রুইজসেনকে ধন্যবাদ জানিয়ে দুটি বাইট সংরক্ষণ করা হয়েছে । স্থানটি forজাগ্রত করে লুপের বডি বন্ধনীগুলি সরানো হয়েছে printf
  • একটি বাইট সংরক্ষণ করা। গল্ফড b+=S[i+k]!=S[i-n+k]টু b|=S[i+k]-S[i-n+k]
  • এগারো বাইট সংরক্ষণ করা হয়েছে। l=strlen(S)স্ট্রিংয়ের শেষে পৌঁছানোর সময় উভয় স্ট্রিং হ্যান্ডলিং লুপকে কন্ডিশনিং দিয়ে প্রয়োজনীয়তা সরিয়ে ফেলা হয়েছে (নাল বাইট '\0')।
  • দুটি বাইট সংরক্ষণ করা হয়েছে। গল্ফড i-n+k>~0টু i-n>~k
  • সিলিংক্যাটকে ধন্যবাদ তিনটি বাইট সংরক্ষণ করা ; b||printf("|"),n++সমতূল্য n+=b||printf("|")
i,b,k,n;f(char*S){for(i=~0;S[++i];)for(b=n=1;b;n+=b||printf("%d,",n))for(b=k=0;k<n&&S[i+k];k++)b|=n-i>k?0:S[i+k]-S[i-n+k];}

এটি অনলাইন চেষ্টা করুন!



@ কেভিন ক্রুজসেন আপনাকে ধন্যবাদ
জোনাথন ফ্রেচ

@ এসিলিংক্যাট ধন্যবাদ; ঝরঝরে সমতা, এক।
জোনাথন ফ্রেচ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.