Я не могу поверить, что у нас этого еще нет ... Это одна из самых важных структур данных в программировании, но все же достаточно простая, чтобы реализовать ее в коде-гольфе :
Вызов
Ваша задача состоит в том, чтобы реализовать стек, который позволяет вставлять и выталкивать числа, тестировать вашу реализацию и упрощать ввод / вывод, мы будем использовать следующую настройку:
- На входе будет список неотрицательных целых чисел
Каждое положительное целое число обозначает а каждое обозначает - отбрасывает верхний элемент.push ( n ) 0 pop ()
- На выходе будет получен стек
пример
Например, если нам дано :
Вывод будет:
правила
- Ввод будет список неотрицательных целых чисел в любом формате ввода / вывода по умолчанию
- вы можете использовать отрицательное целое число, чтобы обозначить конец потока целых чисел
- Результатом будет список / матрица / .. результирующего стека
- на ваш выбор, где будет верхний элемент (в начале или в конце), вывод просто должен быть последовательным
- вывод является гибким (например, целые числа, разделенные новыми строками, будет в порядке), единственное, что имеет значение, это порядок
- вы можете использовать отрицательное целое число для обозначения дна стека
- Вы гарантированно, что никогда не будет когда стек пуст
Примеры
[] -> []
[1] -> [1]
[1,0,2] -> [2]
[4,0,1,12] -> [12,1]
[8,3,1,2,3] -> [3,2,1,3,8]
[1,3,7,0,0,0] -> []
[13,0,13,10,1,0,1005,5,0,0,0] -> [13]
[12,3,0,101,11,1,0,0,14,0,28] -> [28,101,12]
Ответы:
MATL , 6 байтов
Ввод - это вектор строки чисел.
Последний стек показан вверх ногами, а самый последний элемент показан ниже.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Java (JDK 10) , 42 байта
Так как «[the] output является гибким [...], единственное, что имеет значение, это порядок», это изменяет входной массив в
0
-определенный массив. Пример:[1,0,2]
вернет,[2,0,2]
который должен интерпретироваться как = .[2
,0,2
]
[2]
Попробуйте онлайн!
Предыдущие версии:
Java (JDK 10) , 60 байт
Попробуйте онлайн!
Кредиты:
Если я могу завершить программу с ошибками: 55 байт
(хотя все правильно модифицировано)
Попробуйте онлайн!
источник
>0
так как в начале списка никогда не будет нуля (что означало бы, что вершина стека была в-1
).Sed, 17 байт
:;s/[0-9]\+,0//;t
-3 байта благодаря @ OMᗺ, -1 благодаря @eggyal
Поскольку вы гарантированно никогда не вытолкнете пустой список, вам не нужно ничего, кроме повторного конечного автомата. Регулярные выражения являются инструментом для построения конечных автоматов и
sed
могут выполнять итерации. Это состязание на небесах.Принимает ввод от стандартного ввода, вот так:
echo '[12,3,0,101,11,1,0,0,14,0,28]' | sed ':;s/[0-9]\+,0,//;t'
Выводит стек в обратном порядке:
[12,101,28]
Может быть меньше на два байта, если мои локальные по
sed
своей природе понятные классы символов, как\d
, но это не по какой-то причине.источник
g
это избыточно - экономя 4 байта: попробуйте онлайн!PowerShell ,
464140 байтПопробуйте онлайн!
Принимает ввод через сплаттинг, например,
$z=@(12,3,0,101,11,1,0,0,14,0,28); .\implement-stack.ps1 @z
который в TIO проявляется как отдельные аргументы.-5 байт благодаря маззи.
Замена -1 байта
$_
на1
источник
$agrs
? :)$args|%{$x,$a=&({$_,$_+$a},{$a})[!$_]};$a
?.\implement-stack.ps1 @z
(не$z
), иначе вы просто передаете массив в качестве первого / единственного аргументаC (gcc) ,
62605655 байтов-2-6 байт благодаря l4m2-1 байт благодаря потолку .
Использует разрешенное понятие -1 завершенных массивов.
f()
вызывает себя рекурсивно, пока полностью не обмотается, а затем возвращается назад по списку.r
отслеживает, сколько чисел нужно отбросить, прежде чем что-то печатать. Увеличивается, если текущий предмет равен 0, иначе уменьшается. Если 0, нам не нужно сбрасывать, и мы можем напечатать число.Попробуйте онлайн!
источник
f(l)int*l;
=>f(int*l)
?r=0
кажется бесполезнымHaskell, 28 байт
Попробуйте онлайн!
источник
R , 45 байт
Попробуйте онлайн!
источник
F
также даст вам 48 байтов, но это чище, имхоR+pryr
иReduce
решение составляет 44 байтаPython 2 ,
595751 байтПопробуйте онлайн!
источник
Желе , 6 байт
Попробуйте онлайн!
Как это работает
источник
[1,3,7,0,0,0]
Например, разделяется на[[1,3,7],[],[],[]]
, и каждый шаг влево-уменьшение появляется на элементе левого массива.Brain-Flak ,
4036 байтПопробуйте онлайн!
Спасибо @Nitrodon за -4 байта.
Поскольку Brain-Flak уже использует стеки, это хорошая головоломка для Brain-Flak.
источник
{{}<>{}<>}
может быть сокращено до{{}<>}
.Wolfram Language (Mathematica) , 28 байт
Попробуйте онлайн!
источник
b
равен нулю.)a___
сначала оно пытается найти самое короткое из возможных . Это можно увидеть, попробовавReplaceList[#, {a___, b_, 0, c___} :> {a, c}] &
. На связанной ноте,StringReplace
на самом деле является жадным, так что это представление не будет работатьStringReplace
(с шаблоном, какa___~~b_~~"0"~~c___
)Python 2 , 48 байт
Попробуйте онлайн!
источник
2*0**x
, всегда будет0
. Я явно что-то упускаю.x=0
, в этом случае это 2.Пробел , 89 байт
Буквы
S
(пробел),T
(табуляция) иN
(новая строка) добавляются только как подсветка.[..._some_action]
добавлено только в качестве объяснения.Занимает новую строку входного списка, разделенную с,
-1
чтобы указать, что мы закончили с вводами.Попробуйте онлайн .
Объяснение в псевдокоде:
источник
Python 2 ,
60595756 байтПопробуйте онлайн!
Добавлено:
источник
0
иin
JavaScript, 40 байт
Выходы в обратном порядке.
Попробуйте онлайн
1 байт сохранен благодаря Herman L .
источник
a=>a.map(x=>x?o.push(x):o.pop(),o=[])&&o
на один байт короче(un)shift
до того, как я заметил выход может быть полностью изменен.o
него ссылаются в обратном вызове после того, как он определен во втором аргументе.05AB1E , 9 байтов
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Альтернатива 9 байтов :
Попробуйте онлайн для проверки всех тестовых случаев .
Объяснение:
PS: Если выходные данные должны были быть обращены, чтобы соответствовать тестовым примерам в описании вызова, мы можем добавить трейлинг
R
ко второй версии (так, 10 байтов ), который переворачивает список. Попробуйте онлайн или проверьте все контрольные примеры .источник
Сетчатка 0.8.2 , 18 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Префикс доп
,
.Обрабатывать все поп-операции.
Удалить,
,
если он все еще там.Изменение чисел обойдется в дополнительные 8 байтов:
источник
<number>, 0
подсписок ничем.Рубин , 36 байт
Попробуйте онлайн!
Анонимная лямбда. Выходы в обратном порядке.
источник
Brain-Flak , 36 байт
Попробуйте онлайн!
источник
Brain-Flak , 32 байта
Попробуйте онлайн!
Используется
-1
для обозначения конца массива (но любое число будет действительно).источник
V , 10 байт
Попробуйте онлайн!
объяснение
Эквивалент в Vim , 16 байтов
Попробуйте онлайн!
объяснение
Практически то же самое, за исключением записи макроса
q
и рекурсивного вызова его:источник
Java 10,
7572 байтаВыходы разделены запятой. Вершина стека является последней. Попробуйте это онлайн здесь .
Спасибо Оливье Грегуару за игру в гольф 2 байта.
Пожалуйста, ознакомьтесь с ответами Кевина Круйссена и Оливье Грегуара на Java. Вместо этого они используют подход, основанный на списках, причем последний опережает мой с опрятным запасом.
Ungolfed:
источник
Stack
-объектом. +1 от меня.n->{var s="";for(int i:n)s=(s+","+i).replaceAll(",\\d+,0$","");return s;}
(73 байта), но ставит числа,
перед, а не после.n->{var s=""+n;for(int x:n)s=s.replaceFirst("\\d+, 0,? ?","");return s;}
(72 байта), использует список, а не массив и портит выходные данные, потому что он может возвращать такие вещи, как "[, 2]"$
чтобы сохранить дополнительный байт, так как каждый0
добавленный нами удаляется сразу.GolfScript ,
1412 байтПопробуйте онлайн!
источник
Perl 5
-p
, 17 байтСпасибо @sundar и @DomHastings
Попробуйте онлайн!
источник
> <> , 25 байт
Попробуйте онлайн! (ввод должен быть написан в ascii. в противном случае используйте этот )
Как это работает
i:?\~~
проверяет на 0, продолжает~~
удалять предыдущую запись. в противном случае перейдите к:(0:/:^?
который проверяет -1 (больше не вводит), затем завершает, чтобы удалить -1 и цикл:!?l:!<oan;
который выводит каждое число с новой строки, а затем заканчивается, когда стек очищаетсяисточник
Шелуха , 6 байт
Так как ответа Хаска уже нет, и это мой любимый гольф:
Попробуйте онлайн!
объяснение
Альтернативное решение, 6 байтов
Вместо переворачивания мы также можем просто перевернуть список и затем использовать правое сгибание:
Ḟ?:tø↔
источник
брейкфук ,
214150 байтЧитает ввод как числа, разделенные символами новой строки. Это должно включать один завершающий перевод строки. Также не ожидается никаких ведущих нулей на каждом числе. Вывести как аналогичный разделенный строкой список
Попробуйте онлайн!
Объяснение
, которое на самом деле не является объяснением, но на самом деле это просто версия, над которой я работал, с комментариями и прочим материалом, который может или не может быть полезен кому-либоисточник
Брахилог , 21 байт
Попробуйте онлайн!
-1 байт, и что более важно, это выглядит как гораздо менее неуклюжий способ сделать это.
Альтернатива 21 байт:
∋0∧ℕ₁;0;P↺c;Qc?∧P,Q↰|
попробуйте онлайн!Старый код:
22 байта
Попробуйте онлайн!
источник
Предупреждение: много строк. Вы были предупреждены.
CJam , 17 байт
Наиболее опасный код
(Предполагается, что элементы стека могут быть разделены только пробелами в выводе, и что входной массив может быть любой формы, которую мы хотим)
Попробуйте онлайн!
объяснение
Альтернативный код № 1, 27 байт
(предполагается, что элементы стека должны быть выведены в формате, показанном в вопросе, и что входной массив может иметь любую форму, какую мы пожелаем)
Попробуйте онлайн!
объяснение
Альтернативный код # 2, 24 байта
(предполагается, что элементы стека могут быть сопоставлены в выходных данных и что входной массив должен быть в точном формате, указанном в вопросе)
Попробуйте онлайн!
объяснение
Самый безопасный код для этого, 34 байта
(предполагается, что элементы стека должны быть выведены в формате, показанном в вопросе, и что входной массив должен быть в точном формате, показанном в вопросе)
Попробуйте онлайн!
объяснение
Спасибо @Jo King за то, что он указал, что те, у которых есть сопоставленный результат, недействительны, поскольку такие вещи, как
[12]
и[1,2]
будут неразличимы.Также спасибо @Jo King, который предоставил очень подходящую альтернативу для сопоставленных выходных данных и обрезал 9 байтов!
источник
[12]
и[1,2]
. Тем не менее, 27-байтовая версия выглядит хорошо, хотя вы можете избавиться от пробелов и скобок для 18 байт]S*
(3), тогда как запятые используют]',*
(4)Красный , 64 байта
Попробуйте онлайн!
источник