Це перетасування?


19

Вчора я задав це питання щодо гвинтівок. Здається, питання вчорашнього дня було занадто важким, тому це питання пов'язане, але набагато простіше завдання.

Сьогодні вас просять визначити, чи справді перестановка насправді є мішанням стрілецької зброї. Наше визначення перемикання гвинтівки адаптоване з нашого останнього запитання:

Перша частина перетасовки - це поділ. У розділі розділити колоду карт на два. Два підрозділи повинні бути безперервними, взаємовиключними та вичерпними. У реальному світі хочуть зробити свій розділ максимально наближеним, однак у цьому виклику це не враховується, всі розділи, включаючи вироджені (одна секція порожня), мають однакове врахування.

Після їх розділення картки з'єднуються між собою таким чином, що картки підтримують свій відносний порядок у розділі, до якого вони входять . Наприклад, якщо карта A знаходиться перед карткою B на колоді, а картки A і B знаходяться в одному розділі, карта A повинна бути перед карткою B в остаточному результаті, навіть якщо кількість карт між ними збільшилася. Якщо A і B знаходяться в різних розділах, вони можуть бути в будь-якому порядку, незалежно від їх початкового порядку, у кінцевому результаті.

Кожен переміщення стрілецької зброї можна розглядати як перестановку оригінальної колоди карт. Наприклад перестановка

1,2,3 -> 1,3,2

являє собою стрілецький перетасування. Якщо ви розділите колоду так

1, 2 | 3

ми бачимо, що кожна карта в 1,3,2такому ж відносному порядку, як і для кожної іншої карти в її розділі. 2все ще після 1.

З іншого боку, наступна перестановка не є стрілецьким переміщенням.

1,2,3 -> 3,2,1

Ми можемо це побачити, оскільки для всіх двох (нетривіальних) розділів

1, 2 | 3
1 | 2, 3 

є пара карток, які не підтримують свого відносного впорядкування. У першому розділі 1і 2зміни їх упорядкування, а в другому розділі 2і 3зміни їх упорядкування.

Завдання

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

Це тому відповіді будуть набиратись у байтах, а менша кількість байтів - краща.

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

1,3,2 -> True
3,2,1 -> False
3,1,2,4 -> True
2,3,4,1 -> True
4,3,2,1 -> False
1,2,3,4,5 -> True
1,2,5,4,3 -> False
5,1,4,2,3 -> False
3,1,4,2,5 -> True
2,3,6,1,4,5 -> False

1
Чи може висновок бути непослідовним, але правдивим / хибним у нашій мові? Як (Python, де серед цілих чисел лише 0 є фальшивим) 0для фальси, але будь-яке ціле число [1, +∞)для truthy?
Містер Xcoder

1
@ Mr.Xcoder Мені не подобаються значення truthy / falesy, оскільки їх досить важко визначити. Відповіді повинні відповідати чинним правилам.
Пшеничний майстер

Схожий тест: [3,1,4,2,5].
Ørjan Johansen

9
До жаль про це, але: [2,3,6,1,4,5].
Ørjan Johansen

1
Чи можемо ми взяти перестановки [0, ..., n-1]замість [1, ..., n]як вхідні дані?
Денніс

Відповіді:


8

JavaScript (ES6), 47 байт

Вводить введення як масив цілих чисел. Повертається булева.

([x,...a],y)=>a.every(z=>z+~x?y?z==++y:y=z:++x)

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

Як?

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

Правила виклику вказати , що ми дали перестановку з [1 ... N] . Тому нам не потрібно додатково перевіряти, що відсортований об'єднання цих послідовностей насправді призводить до такого діапазону.

Ми використовуємо лічильник x, ініціалізований на A [0], і лічильник y, спочатку невизначений.

Для кожного запису z в A , починаючи з другого:

  • Перевіряємо, чи z дорівнює або x + 1, або y + 1 . Якщо так, ми збільшуємо відповідний лічильник.
  • Інакше: якщо y ще не визначено, ми ініціалізуємо його на z .
  • Інше: ми робимо тест невдалим.


5

Haskell , 43 байти

sприймає список цілих чисел, як у прикладах OP і повертає a Bool.

s p=or[f(<x)p++f(>=x)p<[1..]|x<-p]
f=filter

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

Як це працює

  • Список осягнення намагається кожен елемент xз , pв свою чергу , і перевіряє , якщо він може бути першим елементом другого розділу перетасовки. Потім orповертається, Trueякщо будь-яка з перевірок була True.
  • Розуміння робить це шляхом розподілу (з filter) pна елементи, менші та більші (або рівні) x, об'єднання та перевірку наявності списку [1..length p], тобто в порядку.
  • Перевірка наявності списку [1..length p]виконана, побачивши, чи результат суворо менший, ніж нескінченний список [1..] == [1,2,3,etc.], що дає однаковий результат для будь-якої перестановки.

5

Желе , 13 6 байт

ỤIṢḊRẠ

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

Альтернативна версія, виклик публікацій, 5 байт

Ụ>ƝSỊ

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

Як це працює

ỤIṢḊRẠ  Main link. Argument: A (permutation of [1, ..., n])

Ụ       Grade up; sort the indices of A by their respective values.
        For shuffles, the result is the concatenation of up to two increasing
        sequences of indices.
 I      Compute the forward differences.
        In a shuffle, only one difference may be negative.
  Ṣ     Sort the differences.
   Ḋ    Dequeue; remove the first (smallest) difference.
    R   Range; map each k to [1, ..., k].
        This yields an empty array for non-positive values of k.
     Ạ  All; check if all resulting ranges are non-empty.


4

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

o~cĊ⟨⊆⊇⟩?

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

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

   Ċ         Some length-two list
 ~c          which concatenated
o            is the input sorted
    ⟨        satisfies the condition that its first element
     ⊆       is an ordered not-necessarily-contiguous sublist
        ?    of the input
      ⊇      which is an ordered superlist of
       ⟩     the list's second element.

Я відчуваю, що ⊆ᵐна місці чотирибайтної конструкції "сендвіч" має працювати щось, у дусі чого має працювати ⟨⊆⊇⟩.


1
Я думаю, що ви перша людина, яка вживає сендвіч у відповіді PPCG (і це прекрасний симетричний :))
Fatalize


2

Рубін , 35 байт

->l{l.any?{|a|l&[*1..a]|l==l.sort}}

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

Як?

  • l & [*1..a] | lзастосовує перехрестя, а потім об'єднання: спочатку дістаньте елементи, lякі є, <=aа потім додайте решту елементів lбез зміни порядку. Якщо а - це число, яке ми шукаємо, то ця операція така ж, як і сортування l.


2

Pyth, 5 байт

}SQy+

Тестовий набір

}SQy+

    +QQ  concatenated two copies of the (implicit) input
   y     all subsequences of it
}        contain an element equaling
 SQ      the input list sorted 

Перевіряє, чи містить подвоєний вхідний список відсортовану версію себе як підпорядкованість.

Завдяки Еріку Outgolfer за 1 байт скориставшись перевагою неявного введення, +QQа не *2Q.


5 байт: }SQy+. Він розширюється до }SQy+QQ.
Ерік Аутгольфер

@EriktheOutgolfer Приємний, дякую.
xnor

1

Pyth , 9 байт

!t-.+xLQS

Тестовий набір.

Збережено 3 байти завдяки isaacg .

Піт , 14 байт

}SQm.nS.Tcd2./

Спробуйте тут! або Перевірте всі тестові випадки.

Виходи Trueі Falseдля гвинтівки, і для нереалізації відповідно.

Як?

} SQm.nS.Tcd2./ ~ Повна програма. Читає вхід зі STDIN та виводить на STDOUT.

            ./ ~ Повертайте всі поділи вхідних даних у роз'єднані підрядки (розділ).
   m ~ Позначте вищезазначене за допомогою змінної d.
         cd2 ~ Розбийте d на двоелементні списки.
       .T ~ Виправдано переносити, ігноруючи прогули.
      S ~ Сортувати (лексикографічно).
    .n ~ глибоко сплющити.
} ~ Перевірте, чи містить вище ...
 SQ ~ Відсортований вхід.

Крім того, <#0можна замінити на -ще 2 байти.
isaacg

@isaacg О так, facepalm спасибі. Відредаговано. Відредаговано.
Містер Xcoder



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