По историческим причинам bash - довольно сложная часть синтаксиса и парадигм программирования - это может сделать его неловким, а иногда и разочаровывающим для игры в гольф. Однако у него есть несколько хитростей, которые часто могут сделать его конкурентоспособным с другими основными сценариями. языки. Одним из них является расширение скобки .
Существует два основных типа расширения скобок:
- Список фигурных скобок может содержать разделенные запятыми списки произвольных строк (включая дубликаты и пустую строку). Например
{a,b,c,,pp,cg,pp,}
, расширимся доa b c pp cg pp
(обратите внимание на пробелы вокруг пустых строк). - Фигурные скобки могут содержать конечные точки последовательности, разделенные символом
..
. При желании..
может следовать другой , после которого указывается размер шага. Конечные точки последовательности могут быть целыми числами или символами. Последовательность будет автоматически подниматься или опускаться в зависимости от того, какая конечная точка больше. Например:{0..15}
будет расширяться до0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{-10..-5}
будет расширяться до-10 -9 -8 -7 -6 -5
{3..-6..2}
будет расширяться до3 1 -1 -3 -5
{a..f}
будет расширяться доa b c d e f
{Z..P..3}
будет расширяться доZ W T Q
Помимо этого, скобки последовательности и списка могут существовать со скобками списка:
{a,b,{f..k},p}
будет расширяться доa b f g h i j k p
{a,{b,c}}
будет расширяться доa b c
Скобки расширяются непробельными строками по обе стороны от них. Например:
c{a,o,ha,}t
будет расширяться доcat cot chat ct
Это также работает для нескольких фигурных скобок:
{ab,fg}{1..3}
будет расширяться доab1 ab2 ab3 fg1 fg2 fg3
Это может быть довольно сложным. Например:
{A..C}{x,{ab,fg}{1..3},y,}
будет расширяться доAx Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
Однако, если между расширениями есть пробел, они просто расширяются как отдельные расширения. Например:
{a..c} {1..5}
будет расширяться доa b c 1 2 3 4 5
Обратите внимание, как порядок всегда сохраняется.
Записи для этой задачи будут расширять расширения bash-скобок, как описано выше. Особенно:
- Eval by
bash
(или другие оболочки, которые выполняют подобное расширение) не допускается - фигурные скобки всегда будут цифрами, цифрами в нижнем и нижнем регистре или прописными в верхнем регистре без микширования. Числа будут целыми числами в 32-битном диапазоне со знаком. Если задано, необязательный размер шага всегда будет положительным целым числом. (Обратите внимание, что bash также будет расширяться
{A..z}
, но это может быть проигнорировано для этой задачи) - отдельные элементы в скобках списка всегда будут состоять только из прописных и строчных буквенно-цифровых символов (включая пустую строку)
- фигурные скобки могут содержать произвольные вложения других расширений фигурных скобок
- фигурные скобки могут быть объединены произвольное количество раз. Это будет ограничено памятью вашего языка, поэтому можно ожидать, что вы теоретически можете выполнить произвольное число конкатенаций, но если / когда у вас закончится память, это не будет учитываться против вас.
Примеры в тексте выше служат тестовыми примерами. Суммируя, с каждой строкой ввода, соответствующей одной и той же строке вывода, они:
вход
{0..15}
{-10..-5}
{3..-6..2}
{a..f}
{Z..P..3}
{a,b,{f..k},p}
{a,{b,c}}
c{a,o,ha,}t
{ab,fg}{1..3}
{A..C}{x,{ab,fg}{1..3},y,}
{a..c} {1..5}
{a{0..100..10},200}r
Выход
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-10 -9 -8 -7 -6 -5
3 1 -1 -3 -5
a b c d e f
Z W T Q
a b f g h i j k p
a b c
cat cot chat ct
ab1 ab2 ab3 fg1 fg2 fg3
Ax Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
a b c 1 2 3 4 5
a0r a10r a20r a30r a40r a50r a60r a70r a80r a90r a100r 200r
Ответы:
Рубин,
405403401400 байтОдин мудрец (Джейми Завински) однажды сказал: «Некоторые люди, сталкиваясь с проблемой, думают:« Я знаю, я буду использовать регулярные выражения ». Теперь у них две проблемы ".
Я не думаю, что полностью оценил эту цитату, пока не попытался решить эту проблему с помощью рекурсивного регулярного выражения. Первоначально случаи регулярных выражений казались простыми, пока мне не пришлось иметь дело с крайними случаями, включающими буквы, заключенные в квадратные скобки, а затем я понял, что я в аду.
В любом случае, запустите его здесь с тестовыми примерами
Ungolfed:
источник
Python 2,7,
752728 байтВау, это как куча кодов в одном вызове!
Спасибо @Neil за сокращение лямбды
объяснение
b
: рассчитывает диапазон в соответствии со спецификациями.e
: возвращает позицию первой наиболее закрытой фигурной скобки. Итерационный.m
: разделяет внешние элементы на запятые. Рекурсивный.n
: объединяет массивы при проверке на пустые места.Я не мог добратьсяand/or
до работы.p
: Где большая часть работы сделана. Проверяет все случаи (диапазон, просто список, необходимо объединить). Рекурсивный.o
: Что должно принимать участие Форматы ввода / вывода вp
.Я чувствую, что могу улучшить в некоторых местах, поэтому я буду стараться больше играть в гольф. Также я должен более подробно изложить объяснение.
источник
[c+d for c in a for d in b] or a or b
работать.JavaScript (Firefox 30-57),
465427425 байтВерсия ES6
f
весит дополнительно 10 байтов:Объяснение: Начинается с замены пробелов на запятые и переноса всей строки
{}
для согласованности (спасибо @Blue за идею). Затем ищет все{..}
конструкции и расширяет их в{,}
конструкции. Далее используется рекурсия для многократного расширения всех{,}
конструкций изнутри. Наконец, заменяет все запятые пробелами.источник