Sua tarefa é compilar regexes ... especificando uma substituição para cada caractere em uma regex.
Regexes
As expressões regulares suportam estes
REGEX = (LITERAL REGEX / GROUP REGEX / STAR REGEX / ALTERNATIVE)
LITERAL = 1 / 0
GROUP = '(' REGEX ')'
STAR = (LITERAL / GROUP) '*'
ALTERNATIVE = '('REGEX ('|' REGEX)*')'
Por que apenas 1 ou 0? É para simplificação. A regex, portanto, possui apenas os seguintes caracteres:
*()|10
É interpretado da seguinte maneira:
*
é a estrela Kleene (repita o grupo esquerdo ou literal 0 ou mais vezes).|
é alternação (corresponda se a regex à esquerda ou a regex à direita corresponder).()
está agrupando.1
corresponde ao caractere 1.0
corresponde ao caractere 0.
Como compilar?
Você especifica seis trechos de código: um para substituir cada caractere de expressão regular. Por exemplo, se sua resposta for:
*
:FSAGFSDVADFS
|
:GSDGSAG
(
:GSDG
)
:GDSIH
1
:RGIHAIGH
0
:GIHEBN
Em seguida, você substitui cada regex pelo respectivo trecho de código, portanto:
(0|11)*
é transformado em:
GSDGGIHEBNGSDGSAGRGIHAIGHRGIHAIGHGDSIHFSAGFSDVADFS
O que o programa resultante deve fazer?
Seu programa irá:
- Pegue a entrada.
- Emita um valor verdadeiro se o regex corresponder à entrada inteira.
- Caso contrário, gera um valor falso.
A entrada externa 01
é um comportamento indefinido consumido. A entrada pode estar vazia.
Regras adicionais
- Para um determinado caractere de expressão regular, o snippet resultante deve sempre ser o mesmo.
- Não há caracteres de prefixo ou sufixo adicionados posteriormente.
- O regex é garantido como não vazio.
Pontuação
O snippet menos combinado é o vencedor. Portanto, a pontuação para o caso de exemplo seria calculada da seguinte maneira:
FSAGFSDVADFS
+ GSDGSAG
+ GSDG
+ GDSIH
+ RGIHAIGH
+GIHEBN
12 + 7 + 4 + 5 + 8 + 6 = 42
Respostas:
Caracóis , 48 bytes
0
->)0(\0!(l.)(~
1
->)0(\1!(l.)(~
(
->)0({{(
)
->)0}}(~
|
->)0}|{(
*
->)0),(~
Se tivéssemos que procurar correspondências parciais em vez de corresponder apenas à entrada completa, seria muito fácil.
0
se tornaria\0
,1
se tornaria\1
,*
se tornaria,
, e os outros mapeariam para si mesmos. Em vez disso, existem muitas travessuras para impedir que as partidas iniciem em outro lugar que não seja o início ou terminem em outro lugar que não seja o fim.!(l.)
é uma afirmação que falhará se o início da correspondência não estiver no início da entrada.~
corresponde a uma célula fora da entrada e, portanto, é adicionada a todos os caracteres que podem estar no final da regex. Se houver outro caractere regex a seguir, ele será cancelado por um quantificador numérico0
o que exige que ele seja correspondido 0 vezes, essencialmente comentando-o. Para permitir que*
(,
) funcione corretamente, apesar do teste simulado fora dos limites estar no caminho, as regras de correspondência entre colchetes do idioma são muito usadas. A partir da documentação:Claro como lama, certo?
fonte
CJam, 151 bytes
As linhas correspondem aos caracteres
01(|)*
(nessa ordem). Experimente online!Isso não usa expressão regular incorporada ou outros tipos de correspondência de padrões. De fato, o CJam não possui nenhum desses recursos. Em vez disso, começa a partir da expressão regular que representa e cria todas as sequências possíveis que poderiam corresponder, para finalmente verificar se a entrada do usuário é uma delas.
Execuções de teste
A seguir, um programa que lê uma expressão regular de STDIN, substitui cada um de seus caracteres pelo snippet apropriado e finalmente avalia o código gerado para verificar se ele corresponde à entrada especificada no argumento da linha de comandos.
Infelizmente, isso não é particularmente rápido. Ele engasgará rapidamente se houver mais de 9 caracteres na entrada ou mais de uma única estrela Kleene na regex.
Ao custo de 5 bytes extras - para um total de 156 bytes - podemos gerar seqüências mais curtas para corresponder à entrada potencial e desduplicá-las. Isso não muda como o código funciona; apenas o torna mais eficiente.
fonte
`-escaping of the
"" supérfluo no padrão para*
. Independentemente disso, eu não consegui que este programa aceitasse nenhuma entrada, mesmo no caso mais simples em que o regex consiste apenas em um0
(veja o teste no intérprete online ). I fazendo errado?