Фон
По мотивам игры мой четырехлетний получил от своего раввина.
«Цель» - «найти» буквы в заданном порядке, например aecdb
. Вам дают стопку писем, например daceb
. Поиск в стеке возможен только в указанном порядке, хотя и циклически. Когда вы встречаете нужное письмо, вы берете его из стопки.
Задача
При заданном порядке и стопке (перестановки без дубликатов друг друга) найдите последовательность букв верхнего стека (это все печатные ASCII), которые вы видите во время игры.
Пошаговый пример
Нам нужно найти порядок aecdb
, учитывая стек daceb
:
Верх стека d
: Не то , что мы ищем ( a
), поэтому мы добавим его в последовательности: d
и повернуть , чтобы получить стек: acebd
.
Вершина стека a
: да! поэтому мы добавим его в следующей последовательности: da
и удалить его из стека: cebd
.
Верх стека c
: Не то , что мы ищем ( e
), поэтому мы добавим его в последовательности: dac
и повернуть , чтобы получить стек: ebdc
.
Вершина стека e
: да! поэтому мы добавим его в следующей последовательности: dace
и удалить его из стека: bdc
.
Верх стека b
: Не то , что мы ищем ( c
), поэтому мы добавим его в последовательности: daceb
и повернуть , чтобы получить стек: dcb
.
Верх стека d
: Не то , что мы ищем ( c
), поэтому мы добавим его в последовательности: dacebd
и повернуть , чтобы получить стек: cbd
.
Вершина стека c
: да! поэтому мы добавим его в следующей последовательности: dacebdc
и удалить его из стека: bd
.
Верх стека b
: Не то , что мы ищем ( d
), поэтому мы добавим его в последовательности: dacebdcb
и повернуть , чтобы получить стек: db
.
Вершина стека d
: да! поэтому мы добавим его в следующей последовательности: dacebdcbd
и удалить его из стека: b
.
Вершина стека b
: да! поэтому мы добавим его в следующей последовательности: dacebdcbdb
и удалить его из стека: .
И мы сделали. Результат есть dacebdcbdb
.
Ссылочная реализация
def letters(target, stack):
string = ''
while stack:
string += stack[0]
if stack[0] == target[0]:
stack.pop(0)
target = target[1:]
else:
stack.append(stack.pop(0))
return string
print letters('aecdb', list('daceb'))
Контрольные примеры
try
, yrt
→yrtyry
1234
, 4321
→4321432434
ABCDEFGHIJKLMNOPQRSTUVWXYZ
, RUAHYKCLQZXEMPBWGDIOTVJNSF
→RUAHYKCLQZXEMPBWGDIOTVJNSFRUHYKCLQZXEMPWGDIOTVJNSFRUHYKLQZXEMPWGIOTVJNSFRUHYKLQZXMPWGIOTVJNSRUHYKLQZXMPWIOTVJNSRUYKLQZXMPWOTVNSRUYQZXPWOTVSRUYQZXPWTVSRUYQZXWTVSRUYZXWTVSUYZXWTVUYZXWVYZXWYZXYZ
?
, ?
→?
a
, a
→a a
abcd
, abcd
→abcd
99
конкретно?APL (Dyalog Classic) , 21 байт
Попробуйте онлайн!
Это поезд, эквивалентный
{∊⍵,(⊂⍵)~¨(,\⍺⊂⍨1,2>/⍺⍋⍵)}
⍋
дает перестановку правого аргумента⍵
в левый аргумент⍺
1,2>/
сравнить последовательные пары с>
и добавить 1⍺⊂⍨
используйте вышеупомянутую логическую маску для разделения⍺
на группы; 1 в маске отмечают начало новой группы,\
совокупные объединения групп(⊂⍵)~¨
дополнение каждого относительно⍵
⍵,
перед именем⍵
∊
сплющить как одну строкуисточник
Пакетный, 155 байт
Принимает цель и складывается как входные данные на STDIN.
источник
JavaScript (ES6), 54 байта
Принимает цель как строку, а стек как массив символов. Возвращает строку.
Контрольные примеры
Показать фрагмент кода
Как?
На каждой итерации мы извлекаем символ
c
в верхней части стека и добавляем его к конечному результату. Затем мы выполняем рекурсивный вызов, параметры которого зависят от результатаc == t[0]
, гдеt[0]
следующий ожидаемый символ.Если
c
совпадаетt[0]
:c
из целевой строки, передаваяt.slice(1)
c
из стека, передаваяs
без измененийЕсли
c
не совпадаетt[0]
:t.slice(0)
c
в конце стекаисточник
Python 2 , 73 байта
Попробуйте онлайн!
Я подозреваю, что это очень хорошо для игры в гольф.
источник
Python 2 , 65 байт
Попробуйте онлайн!
источник
Haskell ,
4946 байтовПопробуйте онлайн!
Довольно просто. Левый аргумент - это «цель», а правый - стек. Если головка цели совпадает с вершиной стека, мы добавляем ее и повторяем с остальной частью цели и стеком (без повторного добавления элемента сверху). В противном случае мы добавляем верхний элемент и возвращаемся с той же целью, читая верхний элемент до конца стека. Когда цель пуста, при сопоставлении с образцом выбирается вторая строка, и возвращается пустой список.
РЕДАКТИРОВАТЬ: -3 байта благодаря @GolfWolf и @Laikoni!
источник
Чисто , 85 байт
Попробуйте онлайн!
Определяет частичную функцию
f
взятия[Char]
и[Char]
, где первый аргумент является объектом , а второй стек.источник
Java 8, 88 байт
Входы как
char[]
иjava.util.LinkedList<Character>
(java.util.Queue
реализация)Объяснение:
Попробуйте онлайн.
источник
> <> ,
3832 байтаEdit: Teal пеликан имеет гораздо лучший
><>
подход здесь , что свопы метода вводаПопробуйте онлайн!
Принимает порядок букв через
-s
флаг, а стек через ввод.Как это устроено:
источник
Perl 5 , 42 + 2 (
-pl
) = 44 байтаПопробуйте онлайн!
источник
> <> ,
2116 байтПопробуйте онлайн!
Поток изменен, чтобы использовать пустые места и убрать лишний код перенаправления. (-5 байт) - благодаря @JoKing
> <> , 21 байт
Попробуйте онлайн!
Другой ответ> <> можно найти здесь.
объяснение
Стек начинается с начального набора символов с использованием флага -s. Ввод - это заданный пользователем порядок символов. Это объяснение будет следовать за потоком кода.
источник
Perl, 62 байта
Принимает свой первый аргумент, порядок, как список символов, а его второй, стек, как строку.
Ungolfed:
Вы когда-нибудь задумывались, для чего все эти непонятные переменные регулярного выражения? Ясно, что они были разработаны для этой конкретной задачи. Мы сопоставляем текущий символ
$x
(который, к сожалению, должен быть экранирован в случае, если это специальный символ регулярного выражения). Это удобно разбивает строку на «до матча»$`
, «матч»$&
и «после матча»$'
. В циклическом поиске мы ясно видели каждый символ перед совпадением и помещали его обратно в стек. Мы также видели текущий персонаж, но не вернули его. Таким образом, мы добавляем «перед совпадением» в список «видимых»$z
и строим стек из «после совпадения», за которым следует «до совпадения».источник
SNOBOL4 (CSNOBOL4) , 98 байт
Попробуйте онлайн!
Печатает каждую букву на новой строке. Используйте эту версию, чтобы все печаталось на одной строке. Принимает ввод как стек, затем цель, разделенный новой строкой.
источник
Perl, 44 байта
Включает
+4
в себя для-lF
Введите входные данные как в STDIN в качестве цели, а затем в стек (это обратный порядок из примеров):
Если вы не возражаете против новой строки, это
40
работает:источник