Введение
Очередь является абстрактным типом данных , где элементы добавляются к передним (Enqueue) и удалены от задней (DEQUEUE). Это также известно как принцип FIFO (First In First Out) .
Лучше всего это показать на примере:
Вызов
Учитывая непустой массив, который содержит положительные целые числа и элементы, которые указывают на очередь (удаление элемента), выведите окончательный список очереди.
Допустим, это X
обозначает dequeue в этом примере. Давайте посмотрим на следующий список:
[45, X, X, 37, 20, X, 97, X, 85]
Это может быть переведено в следующий псевдокод очереди:
Queue
Enqueue 45 -> 45
Dequeue ->
Dequeue -> (dequeue on an empty queue is a no-op)
Enqueue 37 -> 37
Enqueue 20 -> 20 37
Dequeue -> 20
Enqueue 97 -> 97 20
Dequeue -> 97
Enqueue 85 -> 85 97
Вы можете видеть, что в итоге получается результат [85, 97]
, который является выходом для этой последовательности.
Контрольные примеры
Обратите внимание, что вы можете выбрать любой другой символ или символ X
, если он не является положительным целым числом.
[1, X, 2, X, 3, X] -> []
[1, 2, X] -> [2]
[1, 2, 3] -> [3, 2, 1]
[1, 2, X, X, X, 3] -> [3]
[1, 2, X, 3, X, 4] -> [4, 3]
Это код-гольф , поэтому выигрывает представление с наименьшим количеством байтов!
Ответы:
Желе , 8 байт
Использует любое ложное значение ( 0 или пустое итерируемое) для удаления из очереди.
Попробуйте онлайн!
Как это работает
источник
Python 2,
565350 байтПопробуйте онлайн!
Dequeue есть
-1
. Этот трюк позволяет легко питонировать нарезку очереди.источник
Mathematica, 102 байта
Определенно, это не самое короткое решение, но я не смог устоять, потому что это своего рода извращение.
После некоторых вспомогательных функций это определяет чистую функцию, которая принимает строку в качестве входных данных: в строке числа разделяются запятыми (пробел необязательный); символ dequeue является
"]"
; и в списке нет разделителей спереди или сзади. Например, первый пример в OP будет введен как строка"45,],],37,20,],97,],85"
. Вывод функции представляет собой список чисел.Функция подсчитывает, сколько очереди
"]"
находится во входной строке, добавляет столько копий"f["
к началу строки, а затем окружает все это"r[...]"
. В приведенном выше примере это производит"r[f[f[f[f[45,],],37,20,],97,],85]"
; обратите внимание, что скобки сбалансированы.Затем
ToExpression
интерпретирует полученную строку как часть кода Mathematica и выполняет ее. Функцияf
удобно определена, чтобы сохранить все свои аргументы, кроме первого (и также игнорирует конечные запятые; в любом случае, это необходимо для удаления пустых очередей), иr
преобразует полученную последовательность чисел в список чисел в правильном порядке.источник
b___,
должна быть там? Это работает , но запятая становится красной из-за этого. (Кроме того, в чем разница между строками 2 и 3?)f[a_,b___]:=b
(без запятой), а строка 3 эквивалентнаf[a_,b___,Null]:=b
. В обоих случаяхb___
относится к любому количеству аргументов (включая ни одного вообще). Строка 3 является более конкретной, поэтому всегда используется перед строкой 2, когда это необходимо. Таким образом, функцияf
игнорирует свой первый аргумент, а также игнорирует последний аргумент, если этот аргумент равенNull
. Это было необходимо для обработки очереди из пустой очереди. Обратите внимание, что типичный ввод даст выражение вродеr[f[f[f[5,3,],2,],],11]
, где каждая запятая еще]
раз обозначает aNull
.Сетчатка , 30 байт
Попробуйте онлайн!
Повторно удаляет первое число, которое (не обязательно сразу), сопровождаемое
X
вместе с этимX
, илиX
в начале строки. Затем переворачивает оставшиеся числа.источник
JavaScript,
7063535043 байтаСпасибо @Neil за вывод 10 байтов с x.map вместо цикла и троичного выражения
Спасибо @Arnauld за 3 байта
Спасибо @ETHproductions за игру в 7 байтов
Попробуйте онлайн!
Исключением может быть любое нечисловое значение, кроме true.
источник
if
оператора, и еще короче, если бы вы использовалиmap
вместо цикла, и еще короче, если вы использовали выражение вместо блока. Смотрите советы .x=>(t=[],x.map(a=>a>0?t.unshift(a):t.pop()),t)
сэкономить немало байтов наreturn
x=>x.map(a=>a>0?t.unshift(a):t.pop(),t=[])&&t
еще короче.a?
достаточно, я думаю?)Mathematica,
4645 байтСпасибо ngenisis за сохранение 1 байта.
В основном так же, как мой ответ Retina, используя сопоставление с образцом. Мы повторно сопоставляем первое
X
и удаляем его вместе с первым числом (если оно существует). После того как мы закончим, мы перевернем список.источник
Чистый Баш, 72
Ввод дан как параметры командной строки.
Попробуйте онлайн .
источник
Haskell, 41 байт
источник
x&(y:z)
MATL ,
1312 байтВвод представляет собой массив чисел, с
0
для "dequeue".Выходные данные разделены пробелами. Пустой результат отображается как ничто.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Haskell,
4140 байтФункция
foldl(#)[]
(также включена в bytecount с разделительным байтом)Попробуйте онлайн!
X - любое неположительное целое число
РЕДАКТИРОВАТЬ: -1 байт благодаря Ними
источник
|l>[]=init l|1>0=l
Юлия,
78767357 байтСпасибо Харрисону Гродину за отличные советы по игре в гольф от Юлии. Заменяется if / else на троичный, а for / заканчивается на понимание списка для экономии 16 байт.
Убраны некоторые ненужные места для экономии 3 байта.
До того как отрицательные числа или ноль были разрешены:
Ungolfed:
Я довольно новичок в Джулии; Там может быть лучший способ. Использует
:X
для X, который является символом в Юлии. Обновлено: теперь, когда 0 разрешено, использует 0 (или любое отрицательное число) для X, сохраняя два символа. Обновил снова, чтобы удалить некоторые пробелы, которые я не понимал, не было необходимости.источник
05AB1E ,
1211 байтСохраненный байт благодаря Райли
Попробуйте онлайн!
объяснение
Dequeues обозначаются любой буквой .
источник
GNU Sed, 43
Оценка включает +2 за использование
-r
и-n
флагов.Попробуйте онлайн .
объяснение
источник
PHP, 85 байт
-8 байт
$v
вместо,is_int($v)
если каждое значение в очереди относится к ложномуисточник
Python 3 ,
9594 байтаПопробуйте онлайн!
Также 94 байта:
источник
Perl 5 , 28 + 1 = 29 байт
28 байт кода +
-p
флаг.Попробуйте онлайн!
Он использует строку (
$\
) в качестве очереди: когда вход содержит целое число (/\d/?
мы добавляем его в начале$\
($\=$_.$\
), а в противном случае мы удаляем последний сs/.*\n$//
. В конце,$\
неявно печатается благодаря-p
flag (и те, которые не имеют себе равных}{
).Другие подходы:
33 байта , используя массив в качестве очереди (я думаю, это самый естественный способ сделать это на Perl, но не самый короткий):
Попробуйте онлайн!
52 байта , используя регулярное выражение и
reverse
(это, в общем-то, то же самое, что ответ Retina Мартина Эндера - благодаря которому я сэкономил на нем 2 байта). Обратный список занимает много символов, потому что, чтобы сохранить целые числа, мне нужно преобразовать строку в массив, чтобы обратить его обратно, а затем обратно в строку, чтобы распечатать. (say for
вместо того, чтобы$_=join$",
сохранить 2 байта, но это требует-E
или-M5.010
и это не так интересно).Попробуйте онлайн!
источник
Python 3, 107 байт
Dequeuer может иметь любое нечисловое значение.
Попробуйте онлайн
источник
Пакетный, 160 байт
Это было сложнее, чем нужно было.
Это означает, что я а) должен иметь маркер конца очереди, который не удаляется, и б) должен манипулировать очередью задом наперед, чтобы новые элементы вставлялись непосредственно перед маркером конца, так что старые элементы могут быть удалены с лицевой стороны, что означает, что я c) должен перевернуть очередь перед печатью.
источник
PHP, 70 байт
источник
C #, 115 байт +33 байта за использование
Анонимный метод, который возвращает список целых чисел после выполнения операций постановки в очередь и снятия с очереди. Отрицательные целые числа используются для удаления элементов из очереди.
Полная программа с методикой ungolfed и тестовыми примерами:
источник
Скала, 97 байт
В качестве входных данных
f
принимает список с0
элементом «dequeue». Он использует хвостовую рекурсию со вторым параметром (b
), выступая в качестве аккумулятора. Первоначально,b
пустоSeq
(Nil
).Пояснения:
Примечание:
b dropRight 1
используется вместо ,b.tail
чтобы избежать исключения:tail of empty list
.Тестовые случаи:
f
может также работать с другими типами (String
,char
..., даже гетерогенный список этих типов!):источник
REXX, 115 байт
Принимает разделенную пробелами строку, печатает разделенную пробелами строку
источник
C ++,
122119 байт0 указывает на очередь.
Попробуйте онлайн!
источник
Swift 3, 70 байт
Предполагая, что у нас есть массив Ints, как
let x = [1, 2,-1,3,-1,4]
Обратите внимание, что
[].prefix(0)
это хитрый способ получить пустой ArraySliceисточник