Пересекающиеся последовательности


11

Пересекающиеся последовательности

Если задан список натуральных чисел A, назовите его возрастающей последовательностью, если каждый элемент больше или равен предыдущему; и назовите его убывающей последовательностью, если каждый элемент меньше или равен предыдущему.

Некоторые увеличивающиеся последовательности:

[1,2,4,7]
[3,4,4,5]
[2,2,2]
[]

Некоторые убывающие последовательности:

[7,4,2,1]
[5,4,4,3]
[2,2,2]
[]

Последовательность пересечения является списком , который можно разложить на два непересекающихся подпоследовательностей, одной возрастающей последовательности и убывающей последовательности в другую.

Например, список:

[3,5,2,4,1]

является последовательностью пересечения, так как она может быть разложена на:

[3,    4  ]
[  5,2,  1]

где [3,4]возрастающая подпоследовательность и [5,2,1]убывающая подпоследовательность. Мы назовем такую ​​пару (возрастающих, убывающих) подпоследовательностей декомпозицией пересекающейся последовательности.

Список:

[4,5,2,1,3]

не является пересекающейся последовательностью; нет способа разложить его на возрастающую и убывающую подпоследовательность.

Ваша задача - написать программу / функцию, принимающую в качестве входных данных список натуральных чисел; и если это пересекающаяся последовательность, вернуть два списка в одном из его разложений; или некоторое непротиворечивое значение "falsey", если список не является пересекающейся последовательностью.

Это ; самая короткая программа / функция на каждом языке является победителем.

Правила:

  • Ввод гибкий.
  • Обычные лазейки запрещены.
  • Если существует несколько допустимых способов разложить входные данные, вы можете вывести один или все из них.
  • Форматирование вывода для декомпозиции является гибким; но оно должно быть однозначным в отношении различия между двумя подпоследовательностями.
  • Вы можете использовать любое непротиворечивое выходное значение, чтобы указать, что ввод не является последовательностью пересечения; пока это однозначно по сравнению с выходом для любой последовательности пересечения. Вы должны указать значение Falsey в своем ответе.

Тестовые случаи:

Использование Falseдля указания непересекающихся последовательностей:

[3, 5, 2, 4, 1] => [3, 4], [5, 2, 1]
[3, 5, 2, 4, 4, 1, 1] => [3, 4, 4], [5, 2, 1, 1]

[7, 9, 8, 8, 6, 11] => [7, 8, 8, 11], [9, 6]
[7, 9, 8, 8, 6, 11] => [7, 9, 11], [8, 8, 6] # also valid
[7, 9, 8, 8, 6, 11] => [7, 8, 11], [9, 8, 6] # also valid

[7, 8, 9, 10, 20, 30] => [7, 8, 9, 20, 30], [10]
[7, 8, 9, 10, 20, 30] => [8, 9, 10, 20, 30], [7] # this is also valid

[5, 5, 5] => [5, 5, 5], []

[4, 5, 2, 1, 3] => False
[3, 4, 3, 4, 5, 2, 4] => False

2
Возможно дублирование . Я вижу только два отличия в том, что другая задача должна выполняться за полиномиальное время по длине входных данных и учитывает истинное значение вместо двух подпоследовательностей (хотя при возврате самих подпоследовательностей будет получен бонус в 20%). По-прежнему звучит как дурак для меня, но я не буду забивать это.
Кевин Круйссен

@KevinCruijssen ограничение по времени, вероятно, достаточно само по себе, чтобы не сделать это обманом.
Ник Кеннеди

1
@NickKennedy Возможно, да, именно поэтому я воздержался от удара. :)
Кевин Круйссен

2
Похожий тест: [3, 5, 2, 4, 4, 1, 1]. Текущие тестовые случаи позволяют вам избегать >=/ <, когда это действительно должно быть >=/ <=.
Гримми

1
@Arnauld: Да, это может быть любое значение (просто «фальси»: неверно, что вход является последовательностью пересечения).
Час Браун

Ответы:




1

JavaScript (ES6),  110 105  104 байта

[[decreasing], [increasing]]1

f=(a,n,b=[[],[]])=>a.some((v,i)=>[...x=b[i=n>>i&1]].pop()*(x.push(v),i-=!i)>v*i)?n>>a.length||f(a,-~n):b

Попробуйте онлайн!

Как?

N02LL

б[0]б[1]яN

1язнак равно1-1язнак равно0

[...x = b[i = n >> i & 1]].pop() * (x.push(v), i -= !i) > v * i

бsome()


1

Haskell, 84 байта

(([],[])#)
(d,i)#(a:b)=(#b)=<<[(d++[a],i)|all(a<=)d]++[(d,i++[a])|all(a>=)i]
p#_=[p]

Возвращает список всех допустимых (decreasing,increasing)пар или пустой список, если такой пары нет.

Попробуйте онлайн!


1

Python 3 , 109 107 байт

def f(l,i=[],d=[]):
 if l:s,*r=l;i and s<i[-1]or f(r,i+[s],d);d and s>d[-1]or f(r,i,d+[s])
 else:print(i,d)

Попробуйте онлайн!

Функция выводит все возможные декомпозиции на стандартный вывод. Если нет возможных разложений, ничего не печатается.

Спасибо @Sriotchilism O'Zaic за предложения по улучшению.


Добро пожаловать на сайт. Я предлагаю делать, s<i[-1]а не i[-1]>s и схожим образом d[-1]<s , оба сохранить байт.
Специальный охотник за

Спасибо за предложение. Я обновил ответ. Есть ли здесь какой-нибудь копируемый шаблон для публикации ответов?
Джоэл

Я не уверен, что ты имеешь в виду? У TIO есть шаблон, который вы, похоже, уже используете.
Специальный охотник за

Я только сгенерировал ссылку на TIO и добавил ссылку на свой пост. Я не использовал никакого шаблона там. Где это находится?
Джоэл

1
@Joel - вверху страницы TIO есть значок, похожий на звенья цепи. Нажмите на это, и тогда вы получите страницу вариантов. Одним из них является «Code Golf Submission». Это поместит в ваш буфер копирования отформатированный материал, который вы хотите! Добро пожаловать, и хорошее решение!
Час Браун

0

Брахилог , 17 байт

;Ṣzpᵐz{ℕˢ}ᵐ≤₁ʰ≥₁ᵗ

Попробуйте онлайн!

Там, вероятно, есть много возможностей для игры в гольф.


2
Вы уже ответили на этот вызов здесь , где вы сделали это в 16 байтах. ;)
Кевин Круйссен

Я не мог отделаться от ощущения , что там было что - то подобное , что я сделал, но по какой - то причине мой разум решил , что должен был бы это вместо
неродственных Строка

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.