Рассмотрим одномерную последовательность чисел в фиксированном диапазоне, т.е.
[1, 2, 4, 6, 8, 0, 2, 7, 3] in range [0, 10⟩
Постоянно увеличивающийся график * ** - это линия, которая соединяет все точки в этой последовательности слева направо и всегда идет вверх или остается на одном уровне. Если необходимо, линия оборачивается сверху вниз и продолжает идти оттуда, чтобы встретить следующую точку.
Цель этой задачи состоит в том, чтобы разбить последовательность на разные подпоследовательности, которые все не уменьшаются, чтобы при построении графика вместе с ограниченной вертикальной осью они образовали постоянно увеличивающийся график. Это делается путем добавления точки в конец одной подпоследовательности и в начало следующей подпоследовательности, чтобы угол линии, пересекающей верхнюю границу, совпадал с линией, пересекающей нижнюю границу, и двумя точками пересечения имеют одинаковую горизонтальную координату. Приведенный выше пример даст следующий результат:
[1, 2, 4, 6, 8, 10]
[-2, 0, 2, 7, 13]
[-3, 3]
И соответствующий график будет выглядеть следующим образом: И с осью, расширенной для лучшего обзора: Требуемый вывод - это список подпоследовательностей, которые образуют части постоянно увеличивающегося графика. Создание сюжета не обязательно, но вы заработаете бонусные баллы;). Выходные данные должны каким-то образом четко отделять подпоследовательности.
Заметки
- Диапазон всегда будет иметь ноль в качестве левой (включительно) границы, а правой границей будет некоторое целое число N.
- Последовательность никогда не будет содержать значений, которые не находятся в пределах диапазона.
- Первая подпоследовательность не имеет дополнительной точки в начале.
- Последняя подпоследовательность не имеет дополнительной точки в конце.
- Не требуется указывать начальные индексы, которые потребуются для построения подпоследовательностей.
Контрольные примеры
Input: [0, 2, 4, 6, 1, 3, 5, 0], 7
Output: [0, 2, 4, 6, 8], [-1, 1, 3, 5, 7], [-2, 0]
Input: [1, 1, 2, 3, 5, 8, 3, 1], 10
Output: [1, 1, 2, 3, 5, 8, 13],[-2, 3, 11],[-7, 1]
Input: [5, 4, 3, 2, 1], 10
Output: [5, 14],[-5, 4, 13],[-6, 3, 12],[-7, 2, 11],[-8, 1]
Input: [0, 1, 4, 9, 16, 15, 0], 17
Output: [0, 1, 4, 9, 16, 32], [-1, 15, 17], [-2, 0]
счет
Это код-гольф, выигрывает самый короткий код в байтах.
* Не фактический жаргон ** На самом деле должен называться Ever Non-Decreasing Graph, как указал @ngm, но это звучит менее впечатляюще.
Ответы:
Желе , 20 байт
Попробуйте онлайн!
Подпоследовательности делятся на
0.5
.источник
R ,
179158151 байтПопробуйте онлайн!
Редактировать: код теперь является функцией и принимает ввод. (Спасибо Giuseppe, user202729 и JayCe за спокойное указание на это)
Редактировать: -21 байт, предложенный Giuseppe.
Изменить: -7 байт, удалив
d=NULL;
.источник
s[p+1]-((m+s[p+1])-s[p])
упрощаетs[p]-m
, и у вас,d=c(c(...))
где толькоd=c(...)
требуется. Я сильно подозреваю, что есть путь к игре в гольф, но это все еще хороший ответ.d
даже нужно инициализировать?Python 2 , 60 байт
Ввод N, за которым следуют все точки в качестве отдельных аргументов. Подпоследовательности в выходных данных разделены
0.5
.Попробуйте онлайн!
Python 2 ,
927768 байтПодпоследовательности разделены
[...]
.Попробуйте онлайн!
источник
Чистый ,
279269258 байтПопробуйте онлайн!
источник
JavaScript (Node.js) ,
10482 байтаПопробуйте онлайн! Порт @ ovs's Python ответа.
источник
Haskell,
828180 байтЭто порт моего Чистого ответа .
Попробуйте онлайн!
-1, -1 спасибо Лайкони
источник
f
локально без скобок вокруг:
шаблона, как вlet x<r@(a:_):s|...
.Чисто , 92 байта
Попробуйте онлайн!
Аргументом оператора
foldr
является лямбда с защитой; он анализируется как:Я перенес это на Хаскелл .
источник
Чистый ,
11010910410097 байтПопробуйте онлайн!
-1 байт благодаря Килану
источник
Haskell , 82 байта
Попробуйте онлайн! Порт моего Чистого ответа .
Альтернатива, также 82 байта
Попробуйте онлайн!
источник
JavaScript (Node.js) , 98 байт
Попробуйте онлайн! Это немного длиннее, чем в другом ответе JS, но использует другой подход.
Неуправляемое и упрощенное объяснение
источник
JavaScript (Node.js) , 48 байтов, массивы разделены
,,
Попробуйте онлайн!
JavaScript (Node.js) , 50 байтов, массивы разделены
|
Попробуйте онлайн!
источник