Определить самую широкую долину

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.
Згарб
Будет ли склон горы круче 1? (например [3,1,2,3])
дверная ручка
@Zgarb: Это правильно, да. Я добавил это в тестовые случаи.
ბიმო
@ Doorknob: Ничто не мешает этому, да. Например [4,0,4]был бы такой случай.
ბიმო
1
« Входные данные будут представлять собой последовательность неотрицательных (извините голландцев) целых чисел » Lol, как голландец, я хихикнул, когда читал это. ;)
Кевин Круйссен

Ответы:

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
Arnauld
источник
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
Zgarb
источник
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
Камил Дракари
источник