প্রশস্ত উপত্যকা নির্ধারণ করুন


12

কল্পনা করুন যে আমরা কিছু পার্বত্য অঞ্চলের একটি স্লাইস পেয়েছি, এটি এর অনুরূপ আকারে আসবে:

4                   _
3   _    _       __/ \
2  / \__/ \    _/     \_   /
1 /        \  /         \_/
0           \/
  12322223210012233343221112

আমরা দেখতে পাচ্ছি, আমরা পূর্ণসংখ্যার ক্রমিক সহ এটি (একটি নির্দিষ্ট ডিগ্রীতে) উপস্থাপন করতে পারি।

এই চ্যালেঞ্জের উদ্দেশ্যে আমরা একটি উপত্যকার সংজ্ঞাটিকে একটি সংযুক্ত সাম্প্রদায়িক হিসাবে সংজ্ঞায়িত করি যেখানে প্রাথমিকভাবে মানগুলি হ্রাস পাচ্ছে এবং কিছু দিক থেকে সেগুলি বাড়ছে। আরও আনুষ্ঠানিকভাবে একটি সিকোয়েন্সের জন্য একটি উপত্যকা সূচক হবে যার জন্য নিম্নলিখিতটি ধারণ করে:(ai)i=1n1s<r<tn

  • উপত্যকার শুরু এবং শেষ পয়েন্ট একই:as=at
  • অঞ্চলটি নীচে পরে উপত্যকাটি শুরু হয় এবং শেষ হয়:as>as+1at1<at
  • উপত্যকা সমতল নয়:asararat
  • উপত্যকাটি প্রথমদিকে হ্রাস পায়:i[s,r):aiai+1
  • উপত্যকাটি এক পর্যায়ে বৃদ্ধি পাবেj[r,t):ajaj+1

এখন আমরা সূচকগুলির আকার অর্থাত্ এই জাতীয় উপত্যকার প্রস্থকে সংজ্ঞায়িত করি । ।[s,t]ts+1

চ্যালেঞ্জ

উচ্চতা-প্রোফাইল দেওয়া (অ-নেতিবাচক পূর্ণসংখ্যার ক্রম) দেওয়া আপনার কাজটি প্রশস্ত উপত্যকার প্রশস্ততা নির্ধারণ করা।

উদাহরণ

উচ্চতা-প্রোফাইল দেওয়া [1,2,3,2,2,2,2,3,2,1,0,0,1,2,2,3,3,3,4,3,2,2,1,1,1,2], আমরা এটিকে আগের মতো দেখতে পারি:

4                   _
3   _    _       __/ \
2  / \__/ \    _/     \_   /
1 /        \  /         \_/
0           \/
  12322223210012233343221112
    aaaaaa             ccccc
         bbbbbbbbb

নোট কিভাবে দ্বিতীয় উপত্যকা [3,2,1,0,0,1,2,2,3]ডানদিকে আরও প্রসারিত না কারণ বাম-সবচেয়ে বিন্দু এবং । তবুও আমরা বাকী দুটি টি যোগ করি না কারণ আমাদের প্রয়োজন শেষ প্রান্তটি দ্বিতীয়-শেষ পয়েন্টের চেয়ে বেশি।343

অতএব বিস্তৃত উপত্যকার প্রস্থ হয় ।9

বিধি

  • ইনপুটটি অ-নেতিবাচক (দুঃখিত ডাচ লোক) পূর্ণসংখ্যার একটি ক্রম হবে
    • আপনি ধরে নিতে পারেন যে সর্বদা কমপক্ষে একটি উপত্যকা রয়েছে
  • উপরোক্ত সংজ্ঞা অনুসারে আউটপুট প্রশস্ত উপত্যকার আকার হবে

Testcases

[4,0,4] -> 3
[1,0,1,0,1] -> 3
[1,0,2,0,1,2] -> 4
[13,13,13,2,2,1,0,1,14,2,13,14] -> 4
[1,2,3,2,2,2,2,3,2,1,0,0,1,2,2,3,3,3,4,3,2,2,1,1,1,2] -> 9
[3,2,0,1,0,0,1,3] -> 4

2
টেস্ট কেস: [3,2,0,1,0,0,1,3]। সমস্ত বর্তমান উত্তর 8 টি প্রত্যাবর্তন করবে, আপনার সংজ্ঞায় আমি বিশ্বাস করি এটি 4 হওয়া উচিত
জাগারব

পর্বতের slালটি কি কখনও ৫ এর চেয়ে বেশি খাড়া হবে? (উদাঃ [3,1,2,3])
ডুরকনব

@ জগারব: হ্যাঁ, এটা ঠিক correct আমি এটি টেস্টকেসে যুক্ত করেছি।
ბიმო

@ ডুরকনব: হ্যাঁ, এটি প্রতিরোধ করার মতো কিছুই নেই। উদাহরণ হিসেবে বলা যায় [4,0,4]যেমন একটি ক্ষেত্রে হবে।
ბიმო

1
" ইনপুটটি অ-নেতিবাচক (দুঃখিত ডাচ লোকেরা) পূর্ণসংখ্যার ক্রম হবে " লোল, একজন ডাচম্যান হিসাবে যখন আমি এটি পড়ি তখন জিগল করেছিলাম। ;)
কেভিন ক্রুইজসেন

উত্তর:


3

জেলি , 15 বাইট

ẆµIṠḟ0ṢƑaMIḢ)Ṁ‘

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

অথবা একটি পরীক্ষা-স্যুট দেখুন (আরও দুটি টেস্ট কেস যুক্ত করা হয়েছে যা আমি পূর্বে পূরণ করতে ব্যর্থ হয়েছি)।

কিভাবে?

ẆµIṠḟ0ṢƑaMIḢ)Ṁ‘ - Link: list of integers
Ẇ               - all contiguous substrings
 µ          )   - for each substring, X:
  I             -   deltas
   Ṡ            -   sign (-ve:-1, 0:0, +ve:1)
    ḟ0          -   filter out zeros
       Ƒ        -   is invariant under:
      Ṣ         -     sort
         M      -   get maximal indices of X
        a       -   (vectorising) logical AND
          I     -   deltas
           Ḣ    -   head
             Ṁ  - maximum
              ‘ - increment

3

জাভাস্ক্রিপ্ট (ES6), 111 108 99 97 বাইট

a=>a.map(o=(p,x)=>a.some(P=q=>(~x?x<0?i?q<P:q>P&&i++:i=0:q>=p)||(o=o<--x|q==P|q-p?o:x,P=q,0)))|-o

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

মন্তব্য

a =>                        // a[] = input array
  a.map(o =                 // initialize the output o to a non-numeric value
    (p, x) =>               // for each value p at position x in a[]:
    a.some(P =              //   initialize P to a non-numeric value
      q =>                  //   for each value q in a[]:
      (                     //     exit if something goes wrong:
        ~x ?                //       if x is not equal to -1:
          x < 0 ?           //         if x is negative:
            i ?             //           if we're in the increasing part:
              q < P         //             exit if q is less than P
            :               //           else:
              q > P && i++  //             increment i if q is greater than P
          :                 //         else:
            i = 0           //           initialize i to 0 (decreasing part)
        :                   //       else:
          q >= p            //         exit if q is greater than or equal to p
      ) || (                //     if we didn't exit:
        o =                 //       update the output o:
          o < --x |         //         decrement x; if o is less than x
          q == P |          //         or the last value is equal to the previous one
          q - p ?           //         or the last value is not equal to the first one
            o               //           leave o unchanged
          :                 //         else:
            x,              //           update o to x
        P = q,              //       update the previous value P to q
        0                   //       force this iteration to succeed
      )                     //
    )                       //   end of some()
  ) | -o                    // end of map(); return -o


1

রেটিনা 0.8.2 , 77 বাইট

\d+
$*
M&!`\b(1+),((?!\1)(?!1+\2)1*,)+((?!\1)1*(?(3)\3|\2))*\1\b
1

O^`
\G,|$

এটি অনলাইন চেষ্টা করুন! লিঙ্কে পরীক্ষার কেস অন্তর্ভুক্ত রয়েছে। ব্যাখ্যা:

\d+
$*

অ্যানারিতে রূপান্তর করুন।

M&!`

ওভারল্যাপিং ম্যাচগুলি গণনা করার পরিবর্তে তালিকাবদ্ধ করুন।

\b(1+),

উপত্যকার শুরুটি ধরা পড়ে \1। এটি অবশ্যই শেষ অবধি আর মিলবে না। যেহেতু আমরা কমা ক্যাপচার করি না, এটি উচ্চতর মানগুলি মিলে যাওয়া থেকেও বাধা দেয়।

((?!\1)(?!1+\2)1*,)+

হ্রাসমান মানগুলির সাথে মিল দিন। (?!1+\2)পূর্ববর্তী চেয়ে অনেক বেশী হওয়া থেকে লুপের মাধ্যমে কোনো পাস করতে বাধা দেয়। (প্রথমবারের মতো \2সেট করা হয়নি তাই এটি তুচ্ছভাবে মেলে না।

((?!\1)1*(?(3)\3|\2))*

ক্রমবর্ধমান মানগুলির সাথে মিল দিন। এই সময়টির ((?3)\3|\2)অর্থ হ'ল প্রতিটি ম্যাচ কমপক্ষে আগের মান হিসাবে দীর্ঘ হওয়া বা শেষ হ্রাস হ্রাসকারী লুপের মাধ্যমে প্রথমবারের মতো হওয়া দরকার।

\1\b

অবশেষে উপত্যকার প্রান্তটি শুরু হওয়ার মতো একই উচ্চতা হতে হবে।

1

কমা রেখে, উচ্চতাগুলি মুছুন। (উচ্চতাগুলি গণনা করা তুলনায় এটি কিছুটা সহজ কারণ তাদের কয়েকটি শুন্য হতে পারে))

O^`

বিপরীত ক্রমে বাছাই করুন প্রথমে বেশিরভাগ কমা।

\G,|$

প্রথম লাইনে কমা সংখ্যা এবং আরও একটি গণনা করুন।


1

হুশ , 13 বাইট

→▲mΓ€fȯΛEtġ≤Q

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

ব্যাখ্যা

আমি জোনাথন অ্যালান এর মতো একটি অ্যালগরিদম ব্যবহার করি ।

→▲mΓ€fȯΛEtġ≤Q  Input is a list, say [3,1,0,1,1,0,2,3]
            Q  Nonempty slices: [[3],[1],[3,1],[0],...,[3,1,0,1,1,0,2,3]]
     f         Keep those that satisfy this:
                Argument is a slice, say [3,1,0,1,1,0,2]
          ġ≤    Cut into non-increasing pieces: [[3,1,0],[1,1,0],[2]]
         t      Drop first piece: [[1,1,0],[2]]
      ȯΛ        Each remaining piece
        E       has all elements equal: false, [1,1,0] has different elements
  m            Map over remaining slices:
                Argument is a slice, say [1,0,1,1]
   Γ            Break into head 1 and tail [0,1,1]
    €           Index of first occurrence of head in tail: 2
 ▲             Maximum: 2
→              Increment: 3

0

জাপট , 31 বাইট

¡ãYÄÃrc k_ò< Åd_äa x}îbZvÃrÔ+2

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

জগারবের হুস্কের উত্তর থেকে অনুপ্রেরণা গ্রহণ করে 10 বাইট সংরক্ষণ করা হয়েছে। আমি এখনও মনে করি এটি উন্নত করা যেতে পারে তবে আমি এটি এখনও পাইনি।

ব্যাখ্যা:

¡ãYÄÃrc                            Get all segments
        k_           Ã             Remove ones where:
          ò<                        A non-increasing sub-segment
             Å                      Other than the first one
              d_äa x}               Has different heights
                      ®   Ã        For each remaining segment:
                       bZv          Get the second index of the first character
                           rÔ      Maximum
                             +2    Increase by 2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.