Проблема сгоревшего блина

23

Эта проблема связана с Flipping Pancakes .

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

Например, с учетом следующего стека (размер блина слева. 0Означает сгоревшую сторону внизу и 1означает сгоревшую сторону справа):

1 0
3 1
2 1

Вы можете перевернуть всю стопку, чтобы получить 20 30 11, перевернуть две верхние, чтобы получить, 31 21 11и перевернуть всю стопку, чтобы получить 10 20 30сортированную стопку сожженных блинов. Эта последовательность ходов, flip 3, flip 2, flip 3, может быть представлена ​​как 3 2 3.

Соревнование

  • Учитывая массив размеров блинов (не обязательно уникальных) и их ориентации, выведите любую действительную последовательность сортировки сожженных блинов, то есть последовательность переворотов, которая приводит к сортировке стопки блинов от наименьшего к наибольшему с обожженными сторонами вниз.
  • Ввод и вывод может быть любым нормальным форматом с разделителями, но, пожалуйста, укажите, какие форматы вы используете, и укажите, какой конец вашего формата ввода является вершиной стека (TOS).
  • Блин с нуля допускается.
  • Смешивание разделителей на входе / выходе разрешено.

Контрольные примеры

Для всех следующих тестовых случаев input представляет собой список, а output - разделенную пробелами строку, а 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"

Как всегда, если что-то неясно или неправильно, пожалуйста, дайте мне знать в комментариях. Удачи и хорошего гольфа!

Sherlock9
источник

Ответы:

7

Python 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]
feersum
источник
2
Видимо я идиот.
Утренняя монахиня
0Разрешено ли в списке вывода?
Утренняя монахиня
19
@LeakyNun Подавать 0 блинов в высшей степени возможно. На самом деле, я делаю это прямо сейчас.
feersum
@daniero Вершина стека находится на правой стороне.
Утренняя монахиня
@LeakyNun извините, мой плохой
Даниеро
3

CJam (37 байт)

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

Ввод - это массив в формате CJam на stdin; output - это разделенный новой строкой список длин флипов на 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

daniero
источник
1
Вы можете сохранить несколько байтов, заменив a.all?{...}на !a.rassoc(1).
Джордан
@ Джордан Вау, это действительно здорово! Я не думаю, что когда-либо думал о том, чтобы использовать ( r) assocраньше, но, подумав об этом, это, вероятно, полезно при большом количестве проблем на этом сайте - я чувствую, что это должно быть в посте с советами по игре в гольф на Ruby. В любом случае, спасибо :) Я также смог убить еще один байт, хотя применение закона deMorgans и заменить untilна while.
Даниеро
1
Хорошая идея: codegolf.stackexchange.com/questions/363/…
Джордан
Так bкак только когда-либо 0или 1, 1-bтакже будет работать и сохранит два байта.
Sherlock9