Проблема спаленого млинця


23

Це завдання пов'язане з гортанням млинців .

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

Наприклад, враховуючи наступний стек (розмір млинця зліва. 0Означає згорілу сторону вниз і 1означає згорілу сторону вгору праворуч):

1 0
3 1
2 1

Ви можете перегорнути всю групу, щоб отримати 20 30 11, перевернути дві найкращі, щоб отримати, 31 21 11і перевернути всю стек знову, щоб отримати 10 20 30, відсортований стоп спалених млинців. Ця послідовність рухів, фліп 3, фліп 2, фліп 3 може бути представлена ​​як 3 2 3.

Змагання

  • Враховуючи масив розмірів млинців (не обов'язково унікальних) та їх орієнтацію, виведіть будь-яку дійсну послідовність сортування випалених млинців, тобто послідовність перегортань, що призводить до того, що стопка млинців сортується від найменшої до найбільшої із згорілими сторонами вниз.
  • Введення та виведення можуть мати будь-який здоровий формат із роздільниками, але, будь ласка, вкажіть, які формати ви використовуєте та вкажіть, який кінець формату введення знаходиться у верхній частині стека (TOS).
  • Дозволено гортати нульові млинці.
  • Допускається змішування роздільників на вході / виході.

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

Для всіх наступних тестових випадків введення - це список, а вихід - пробіл, розділений пробілом, а TOS - зліва.

[[1, 0], [3, 1], [2, 1]]
"3 2 3"

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

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

Як завжди, якщо щось незрозуміле чи неправильне, будь ласка, повідомте мене про це у коментарях. Успіхів і хорошого гольфу!

Відповіді:


7

Пітон 2, 83

Очікується, що буде список (розмір, орієнтація) кортежів із верхом стека в кінці. Вихід - це список розмірів, які слід розгорнути, розділених різними видами пробілів.

a=input()
while a:i=a.index(max(a));print len(a)-i,a[i][1],len(a),i;a=a[i+1:]+a[:i]

2
Мабуть, я ідіот.
Leaky Nun

Чи 0дозволено у списку вихідних даних?
Leaky Nun

19
@LeakyNun Перегортаючи 0 млинців, можливо, це можливо. Насправді я це роблю зараз.
feersum

@daniero Верхня частина стека знаходиться з правого боку.
Leaky Nun

@LeakyNun О, вибачте, мій поганий
daniero

3

CJam (37 байт)

q~{__$W>#)_p/(W%\M*2,f.^+(1=p_,)pW%}h

Вхід - це масив у форматі CJam на stdin; висновок - це розділений по новому рядку фліп довжини на stdout. Вершина стека знаходиться в індексі 0; 0позначає згорілу сторону вгору, і 1вказує згорілу сторону вниз.

Демонстрація в Інтернеті

Розсічення

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

q~         e# Parse input into array
{          e# Loop...
  __$W>#)  e#   Find 1-based index of largest element in array
  _p       e#   Dup and print
  /(       e#   Split into chunks that long, and pull off the first
  W%       e#   Reverse the first chunk. Note that we don't flip the burnt/unburnt bit
  \M*      e#   Merge the remaining chunks into a single array
  2,f.^    e#   Flip *their* burnt/unburnt bits
  +        e#   Concatenate, prepending the first chunk
  (1=p     e#   Pull off the first (largest) element and print its burnt/unburnt bit
  _,)p     e#   Print the number of remaining elements plus 1 (to account for the largest)
  W%       e#   Reverse. Note that the first chunk has now been flipped twice, which is
           e#   why we have left its burnt/unburnt bit alone
}h         e# ... until we get down to an empty array

3

Рубі, 101 95 93 байт

Не дуже гофрований, я просто хотів зробити варіант сортування бого. Це анонімна функція, яка займає масив масивів і друкує випадкові перегортання, щоб промальовувати, доки млинці не будуть відсортовані.

->a{(p r=-~rand(a.size)
a[0,r]=a[0,r].reverse.map{|x,b|[x,1-b]})while a!=a.sort||a.rassoc(1)}

Наприклад, ви можете призначити це fі сказатиf.call [[1, 0], [3, 1], [2, 1]]

-5 байт від @Jordan із блискучим використанням rassoc
-2 байт від @ Sherlock9


1
Ви можете зберегти кілька байтів, замінивши a.all?{...}на !a.rassoc(1).
Йорданія

@Jordan Wow, це справді геніально! Я не думаю, що раніше не думав використовувати ( r) assoc, але, думаючи про це, це, мабуть, корисно у багатьох проблемах на цьому веб-сайті - я вважаю, що це має пройти у пості з порадами щодо гольфу в Рубі. Так чи інакше, спасибі :) Мені також вдалося вбити ще один байт через застосування закону про деорганізацію та заміну untilна while.
daniero


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