Перехресні послідовності


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]

не є послідовністю схрещування; немає способу розкласти його на зростаючу та зменшувальну послідовність.

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

Це ; найкоротша програма / функція кожної мови є переможцем.

Правила:

  • Введення гнучко.
  • Звичайні лазівки заборонені.
  • Якщо існує кілька дійсних способів розкласти вхід, ви можете вивести один або всі з них.
  • Форматування виводу для розкладання є гнучким; але це має бути однозначним щодо розрізнення двох підрядів.
  • Ви можете використовувати будь-яке послідовне вихідне значення, щоб вказати, що вхід не є пересічною послідовністю; до тих пір, поки це однозначно порівняно з результатами для будь-якої послідовності схрещування. Ви повинні вказати значення фальси у своїй відповіді.

Випробування:

Використання 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% бонус). Все ще звучить як дупа для мене, але я її не забиваю.
Kevin Cruijssen

@KevinCruijssen обмеження часу, ймовірно, достатньо самостійно, щоб не зробити це обдуром.
Нік Кеннеді

1
@NickKennedy Можливо, так, саме тому я утримався від удару молотом. :)
Кевін Круїссен

2
Схожий тест: [3, 5, 2, 4, 4, 1, 1]. Поточні тестові випадки дозволяють вам уникнути >=/ <, коли це дійсно має бути >=/ <=.
Grimmy

1
@Arnauld: Так, це може бути будь-яке значення ("falsey" - це просто сказати: помилково, що вхід - це перехресна послідовність).
Час Браун

Відповіді:




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

b[0]b[1]in

1i=11i=0

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

bsome()


1

Хаскелл, 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 , і зберегти байт.
Ad Hoc Garf Hunter

Дякую за пропозицію. Я оновив відповідь. Чи є тут якийсь шаблон, який можна вставити копію, для публікації відповідей?
Джоел

Я не впевнений, що ти маєш на увазі? У TIO є шаблон, який, здається, ви вже використовуєте.
Ad Hoc Garf Hunter

Я створив лише посилання на TIO і додав посилання до своєї публікації. Я не використовував там жодного шаблону. Де це?
Джоель

1
@Joel - У верхній частині сторінки TIO є значок, схожий на деякі ланцюгові посилання. Клацніть це, і тоді ви отримаєте сторінку параметрів. Один з них - «Кодекс подання гольфу». Це помістить у ваш буфер для копіювання потрібні відформатовані речі! Ласкаво просимо і приємного рішення!
Час Браун

0

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

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

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

Напевно, тут є багато місця для гольфу.


2
Ви вже відповідали на цей виклик тут , де зробили це в 16 байтах. ;)
Кевін Круїссен

Я не міг позбутися відчуття , що там було що - щось подібне , що я зробив, але з якоїсь - то причини мій розум вирішив , що повинен був би це замість
неспоріднених Рядок

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