Один іде вгору, другий спускається


20

Вступ

У цьому завданні ваше завдання полягає в тому, щоб визначити, чи можна розділити задану послідовність чисел на дві послідовності, одна з яких збільшується, а інша зменшується. Як приклад розглянемо послідовність 8 3 5 5 4 12 3. Його можна розбити на дві послідовності так:

  3 5 5   12
8       4    3

Підряд на першому ряду збільшується, а другий у другому ряду зменшується. Крім того, ви повинні виконувати це завдання ефективно.

Вхідні дані

Ваш вхід - це порожній список Lцілих чисел у межах від 0 до 99999 включно. Він надається у рідному форматі вашої мови або просто розмежується пробілами.

Вихідні дані

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

Правила та бонуси

Ви можете написати повну програму або функцію. Виграє найменший кількість байтів, а стандартні лазівки заборонені. Крім того, в цьому виклику забороняється жорстоке форсування: ваша програма повинна запускатись у поліном час по довжині вводу .

Ви не зобов’язані фактично повернути дві підрядки, але за це є бонус -20% . Щоб полегшити заявку на бонус на мовах, які мають статичний текст, прийнятно повернути пару порожніх списків для фальшивих екземплярів.

Тестові справи

Дано у форматі input -> Noneдля хибних входів та input -> inc decдля правдоподібних даних. Тут подано лише одну можливу пару підрядів; може бути більше.

[4,9,2,8,3,7,4,6,5] -> None
[0,99999,23423,5252,27658,8671,43245,53900,22339] -> None
[10,20,30,20,32,40,31,40,50] -> None
[49,844,177,974,654,203,65,493,844,767,304,353,415,425,857,207,871,823,768,110,400,710,35,37,88,587,254,680,454,240,316,47,964,953,345,644,582,704,373,36,114,224,45,354,172,671,977,85,127,341,268,506,455,6,677,438,690,309,270,567,11,16,725,38,700,611,194,246,34,677,50,660,135,233,462,777,48,709,799,929,600,297,98,39,750,606,859,46,839,51,601,499,176,610,388,358,790,948,583,39] -> None
[0,1,2,3,4] -> [0,1,2,3,4] []
[4,3,2,1,0] -> [] [4,3,2,1,0]
[1,9,2,8,3,7,4,6,5] -> [1,2,3,4,6] [9,8,7,5]
[71414,19876,23423,54252,27658,48671,43245,53900,22339] -> [19876,23423,27658,48671,53900] [71414,54252,43245,22339]
[10,20,30,20,30,40,30,40,50] -> [10,20,20,30,40,40,50] [30,30]
[0,3,7,13,65,87,112,43,22,1] -> [0,3,7,13,65,87,112] [43,22,1]
[7,4,4,7,4,7,7,4,7,4,4,4,7,7] -> [7,7,7,7,7,7,7] [4,4,4,4,4,4,4]
[7,997,991,957,956,952,7,8,21,924,21,923,22,38,42,44,920,49,58,67,71,83,84,85,917,89,907,896,878,878,90,861,115,860,125,128,140,148,858,155,160,836,164,182,826,191,824,805,195,792,205,782,206,210,769,213,756,748,214,745,724,701,234,241,693,268,685,293,679,297,334,671,336,669,341,652,356,648,362,364,370,375,386,630,622,388,389,618,398,408,468,615,470,533,611,539,544,609,586,582,572,565,547,602,536,619,624,528,512,631,640,649,669,671,677,505,678,723,743,489,489,473,454,757,446,445,758,759,764,445,431,770,429,426,418,409,790,383,379,366,363,791,358,795,809,827,835,356,353,841,844,333,867,323,317,879,311,881,309,896,282,281,897,263,904,237,236,226,202,195,914,186,177,917,920,157,926,936,154,138,943,131,945,100,98,947,957,964,95,973,989,57,43,32,21,16,13,11,8,0] -> [7,7,8,21,21,22,38,42,44,49,58,67,71,83,84,85,89,90,115,125,128,140,148,155,160,164,182,191,195,205,206,210,213,214,234,241,268,293,297,334,336,341,356,362,364,370,375,386,388,389,398,408,468,470,533,539,544,586,602,619,624,631,640,649,669,671,677,678,723,743,757,758,759,764,770,790,791,795,809,827,835,841,844,867,879,881,896,897,904,914,917,920,926,936,943,945,947,957,964,973,989] [997,991,957,956,952,924,923,920,917,907,896,878,878,861,860,858,836,826,824,805,792,782,769,756,748,745,724,701,693,685,679,671,669,652,648,630,622,618,615,611,609,582,572,565,547,536,528,512,505,489,489,473,454,446,445,445,431,429,426,418,409,383,379,366,363,358,356,353,333,323,317,311,309,282,281,263,237,236,226,202,195,186,177,157,154,138,131,100,98,95,57,43,32,21,16,13,11,8,0] 

Відповіді:


3

Pyth, 34 байти

.N|!N|&ghNT:tNhNY&gYhN:tNThN:QZ^T5

Тестовий сюїт

Використовується запам'ятована рекурсія, щоб утримувати час виконання. Визначає 3 функції введення :, яка приймає суфікс списку входів, кінець послідовності збільшення, кінець послідовності зменшення.


2

Брахілог , 16 байт - 20% = 12,8 (але це майже напевно не многочлен)

⊇≥₁X&⊇≤₁Y;X.cp?∧

Спробуйте в Інтернеті!

Виходить з ладу, якщо немає пари сумісних підрядчиків, і виводить їх через свою вихідну змінну, якщо така є (але буде просто друкувати, true.якщо вона запускається як програма). Я кажу, що це майже напевно не многочлен, тому що краса Брахілога полягає в тому, що, оскільки це декларативна мова, ти не робиш так багато способу реалізації алгоритму, як ти просто описуєш взаємозв'язки між змінними і просиш комп'ютер витягнути результати . Тож цілком ймовірно, що це жорстка жорстока сила, але я витратив досить довгу копію, обклеюючи тестові випадки (два з яких просто виходили з цього разу), що я відчуваю, що хотів би подати це так чи інакше, якщо з іншої причини, ніж перетягнути цю проблему зі зворотного списку списку " ".

   X                X is a
 ≥₁                 non-increasing
⊇                   sublist of the input
    &               and
        Y           Y is a
      ≤₁            non-decreasing
     ⊇              sublist of the input
         ;X         which paired with X
           .        is the output variable
            c       which when its elements are concatenated
             p      is a permutation of
              ?     the input
               ∧    which is not unified with the output.

2

Haskell , 65 байт

(>[]).foldl(%)[(0,9^6)]
p%x=do(u,d)<-p;[(x,d)|x>=u]++[(u,x)|x<=d]

Спробуйте в Інтернеті!

Ітератується через список, відстежуючи можливі пари (u,d)максимуму послідовності, що збільшується, і хвилини спадної. Кожен новий елемент xзамінює або, uабо d, що відповідає йому, додає до цього підпорядкування. Можливо, обидва варіанти або обидва варіанти недійсні. Зрештою, ми перевіряємо, чи список можливостей не порожній.

Початкові межі (0,9^6)використовують, що в задачі задаються числа, що знаходяться в діапазоні 0 - 99999. Більш загальне рішення може зробити (1/0,-1/0)для вирішення (-inf,inf).

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