O desafio
Dada uma regex válida, produza uma regex que corresponda ao mesmo conjunto de cadeias, mas invertida.
A tarefa
Este desafio utiliza o maior número de operações básicas de regex: ^
, $
, ?
, +
, *
, []
, {}
, |
. Não existem grupos de captura ou coisas complicadas. Caracteres especiais podem ser escapados.
Entrada / Saída de amostra
Nota: Entrada inválida nunca será fornecida e geralmente existem várias respostas possíveis para uma entrada especificada!
Input | Sample Output
-----------|-------------
abc | cba
tuv? | v?ut
a(b|c) | (c|b)a
1[23] | [23]1
a([bc]|cd) | (dc|[bc])a
^a[^bc]d$ | ^d[^bc]a$
x[yz]{1,2} | [yz]{1,2}x
p{2} | p{2}
q{7,} | q{7,}
\[c[de] | [de]c\[
ab[c | <output undefined>
a(?bc) | <output undefined>
a[]]bc | <output undefined>
Demo
Demonstração de trabalho que demonstra entradas / saídas corretas. Isso tem alguma lógica adicional para validar entradas desnecessárias em uma resposta real. Considere entradas inválidas como comportamento indefinido.
Específicos
Por simplicidade, todos os caracteres especiais têm um significado especial ou são escapados; isto é, [[]
não é um intervalo de caracteres para [
. As faixas de comprimento são provenientes dos EREs POSIX padrão; isto é, {n}
, {n,}
, e {n,m}
são suportados. Os caracteres variam []
e [^]
são suportados. Por causa dessas regras, e como nenhuma entrada inválida é fornecida, você realmente precisa apenas copiar o conteúdo delas diretamente na saída. Por fim, a ganância não importa, ou seja, não importa se a regex reversa encontra uma correspondência diferente primeiro, ela só precisa encontrar uma correspondência para o mesmo conjunto de strings.
Pontuação
O menor programa em bytes (exceto trapaças, como solicitações de rede) vence. O programa pode usar IO real ou simplesmente definir uma função.
?
que anexar. Tente digitar/a(?bc)/
no console do navegador.(^a|b)(c$|d)
um caso de teste.(a)?(b)+
↦(b)+(a)?
?()
, usada no seu exemplo.Respostas:
Retina ,
136114110 bytesYo dawg, ouvi você gostar de regex ...
Onde
<empty>
representa uma linha de fuga vazia. Execute o código de um único arquivo com o-s
sinalizador.... quando você quiser reverter regex, você deve usar regex. Quando você deseja usar regex, você deve usar uma linguagem de programação baseada em regex.
Este código assume que a entrada não contém nem
;
nem!
nem espaços. Embora eu concorde que essa é uma suposição bastante forte e potencialmente inválida, você pode substituir os três no código por quaisquer três caracteres não imprimíveis (como bytes nulos, caractere de sino,<DEL>
o nome dele) e isso não afetará o tamanho ou a funcionalidade do código em absoluto.Vou adicionar uma explicação quando terminar o golfe.
fonte
]]]
, de qualquer forma, essa resposta não precisará de muitas modificações.)JavaScript ES6, 574 bytes
Provavelmente posso remover algumas
var
instruções.JS ES6, não testado, 559 bytes
Vai testar em casa.
JavaScript ES5, ungolfed, 961 bytes
fonte
JavaScript ES6, 343 bytes
Código original (as funções, mas sem
prompt
):O código é implementado como um analisador de cima para baixo recursivo, portanto, pode causar estouro de pilha em entradas profundamente aninhadas.
O código pode causar loop infinito em casos inválidos, já que eu não os testo, aproveitando a cláusula "comportamento indefinido".
fonte
Python 3, 144 bytes
(Este não suporta qualificadores em um grupo como
(a)+(b)*(cde)?
.)Casos de teste:
Resultado:
fonte