Por razões principalmente históricas, o bash é uma mistura de paradigmas de sintaxe e programação - isso pode torná-lo estranho e às vezes frustrante para o golfe. No entanto, existem alguns truques na manga, que muitas vezes podem torná-lo competitivo com outros scripts tradicionais. línguas. Uma delas é a expansão de chaves .
Existem dois tipos básicos de expansão de chaves:
- Os colchetes de lista podem conter listas separadas por vírgula de cadeias arbitrárias (incluindo duplicatas e a cadeia vazia). Por exemplo
{a,b,c,,pp,cg,pp,}
, expandirá paraa b c pp cg pp
(observe os espaços ao redor das cadeias vazias). - Os colchetes de sequência podem conter pontos finais de sequência separados por
..
. Opcionalmente, outro..
pode ser seguido, seguido por um tamanho de etapa. Os pontos finais da sequência podem ser números inteiros ou caracteres. A sequência sobe ou desce automaticamente de acordo com o ponto final maior. Por exemplo:{0..15}
vai expandir para0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{-10..-5}
vai expandir para-10 -9 -8 -7 -6 -5
{3..-6..2}
vai expandir para3 1 -1 -3 -5
{a..f}
vai expandir paraa b c d e f
{Z..P..3}
vai expandir paraZ W T Q
Além disso, chaves de sequência e lista podem existir com chaves de lista:
{a,b,{f..k},p}
vai expandir paraa b f g h i j k p
{a,{b,c}}
vai expandir paraa b c
O aparelho se expande com cadeias que não sejam espaços em branco em ambos os lados. Por exemplo:
c{a,o,ha,}t
vai expandir paracat cot chat ct
Isso também funciona para várias chaves concatenadas juntas:
{ab,fg}{1..3}
vai expandir paraab1 ab2 ab3 fg1 fg2 fg3
Isso pode ficar bastante complexo. Por exemplo:
{A..C}{x,{ab,fg}{1..3},y,}
vai expandir paraAx 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
No entanto, se houver espaço em branco entre as expansões, elas simplesmente se expandirão como expansões separadas. Por exemplo:
{a..c} {1..5}
vai expandir paraa b c 1 2 3 4 5
Observe como a ordem é sempre preservada.
As inscrições para esse desafio expandirão as expansões de chaves de bash, conforme descrito acima. Em particular:
- avaliação por
bash
(ou outras conchas que executam expansão semelhante) não é permitida - chaves entre sequências sempre serão de número para número, minúsculas para minúsculas ou maiúsculas para maiúsculas sem mistura. Os números serão números inteiros no intervalo assinado de 32 bits. Se fornecido, o tamanho opcional da etapa sempre será um número inteiro positivo. (Observe que o bash também se expandirá
{A..z}
, mas isso pode ser ignorado para esse desafio) - itens individuais entre chaves sempre serão compostos apenas por caracteres alfanuméricos em maiúsculas e minúsculas (string vazia incluída)
- chaves de lista podem conter aninhamentos arbitrários de outras expansões de chave
- chaves podem ser concatenadas números arbitrários de vezes. Isso será limitado pela memória do seu idioma; portanto, a expectativa é que você possa teoricamente fazer números arbitrários de concatenações, mas se / quando ficar sem memória, isso não será considerado.
Os exemplos no texto acima servem como casos de teste. Resumidos, com cada linha de entrada correspondente à mesma linha de saída, são eles:
Entrada
{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
Resultado
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
Respostas:
Ruby,
405403401400 bytesUm homem sábio (Jamie Zawinski) disse uma vez: "Algumas pessoas, quando confrontadas com um problema, pensam 'eu sei, vou usar expressões regulares'. Agora eles tem dois problemas."
Acho que não apreciei totalmente essa citação até tentar resolver esse problema com regex recursivo. Inicialmente, os casos de regex pareciam simples, até que eu tive que lidar com casos extremos envolvendo letras adjacentes a colchetes, e então eu sabia que estava no inferno.
De qualquer forma, execute-o online aqui com casos de teste
Ungolfed:
fonte
Python 2.7,
752728bytesUau, isso é como um monte de código de golfe em um desafio!
Graças a @ Neil por encurtar um lambda
Explicação
b
: calcula o intervalo de acordo com as especificações.e
: retorna a posição do primeiro colchete externo mais externo. Iterativo.m
: divide elementos mais externos em vírgulas. Recursivo.n
: combina matrizes durante a verificação de vazios.Não conseguiand/or
trabalhar.p
: Onde a maior parte do trabalho é realizada. Verifica todos os casos (intervalo, apenas lista, precisa ser combinado). Recursivo.o
: O que deve receber entrada. Formata entrada / saída parap
.Sinto que posso melhorar em alguns lugares, por isso tentarei jogar mais. Também devo colocar mais detalhes na explicação.
fonte
[c+d for c in a for d in b] or a or b
trabalhar.JavaScript (Firefox 30-57),
465427425 bytesA versão ES6
f
pesa 10 bytes extras:Explicação: Começa alterando espaços em vírgulas e agrupando toda a sequência
{}
para obter consistência (graças a @Blue pela ideia). Em seguida, procura por todas as{..}
construções e as expande em{,}
construções. Em seguida, usa a recursão para expandir repetidamente todas as{,}
construções de dentro para fora. Finalmente, substitui todas as vírgulas por espaços.fonte