Визначте найширшу долину


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

Правила

  • Введенням буде послідовність невід’ємних (вибачте голландців) цілих чисел
    • можна припустити, що завжди є хоча б одна долина
  • Вихід буде розміром найширшої долини, як визначено вище

Тестові шафи

[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.
Згарб

Чи буде схил гори колись крутішим за 1? (наприклад [3,1,2,3])
Дверна ручка

@ Zgarb: Це правильно, так. Я додав його до тестів.
ბიმო

@Doorknob: Ніщо це не заважає, так. Наприклад, [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

JavaScript (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

Japt , 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.