Quero tentar um novo tipo de desafio de golfe regex, que solicite que você resolva tarefas computacionais não triviais com nada além de substituição de regex. Para tornar isso mais possível e menos trabalhoso, você poderá aplicar várias substituições, uma após a outra.
O desafio
Começaremos simples: dada uma string contendo dois números inteiros positivos, como números decimais separados por a ,
, produza uma string contendo sua soma, também como um número decimal. Então, muito simplesmente
47,987
deve se transformar em
1034
Sua resposta deve funcionar para números inteiros positivos arbitrários.
O formato
Cada resposta deve ser uma sequência de etapas de substituição, cada etapa consistindo em uma regex e uma sequência de substituição. Opcionalmente, para cada uma dessas etapas na sequência, você pode optar por repetir a substituição até que a sequência pare de mudar. Aqui está um exemplo de envio (que não resolve o problema acima):
Regex Modifiers Replacement Repeat?
\b(\d) g |$1 No
|\d <none> 1| Yes
\D g <empty> No
Dada a entrada 123,456
, essa submissão processaria a entrada da seguinte maneira: a primeira substituição é aplicada uma vez e produz:
|123,|456
Agora a segunda substituição é aplicada em um loop até que a string pare de mudar:
1|23,|456
11|3,|456
111|,|456
111|,1|56
111|,11|6
111|,111|
E, finalmente, a terceira substituição é aplicada uma vez:
111111
Observe que o critério de finalização para loops é se a cadeia é alterada, não se a regex encontrou uma correspondência. (Ou seja, também pode ser encerrado se você encontrar uma correspondência, mas a substituição for idêntica à correspondência.)
Pontuação
Sua pontuação principal será o número de etapas de substituição no seu envio. Toda substituição repetida contará 10 etapas. Portanto, o exemplo acima teria pontuação 1 + 10 + 1 = 12
.
No caso (não muito improvável) de empate, a pontuação secundária é a soma dos tamanhos de todas as etapas. Para cada etapa, adicione o regex ( sem delimitadores), os modificadores e a string de substituição. Para o exemplo acima, isso seria (6 + 1 + 3) + (3 + 0 + 2) + (2 + 1 + 0) = 18
.
Regras Diversas
Você pode usar qualquer sabor de regex (que você deve indicar), mas todas as etapas devem usar o mesmo sabor. Além disso, você não deve usar nenhum recurso do idioma do host do sabor, como retornos de chamada de substituição ou e
modificador do Perl , que avalia o código do Perl. Toda manipulação deve ocorrer exclusivamente através da substituição de regex.
Observe que depende do seu sabor e modificadores se cada substituição única substitui todas as ocorrências ou apenas uma única. Por exemplo, se você escolher o sabor ECMAScript, uma única etapa, por padrão, substituirá apenas uma ocorrência, a menos que você use o g
modificador. Por outro lado, se você estiver usando o sabor do .NET, cada etapa sempre substituirá todas as ocorrências.
Para idiomas que possuem métodos de substituição diferentes para substituição única e global (por exemplo, Ruby sub
vs. gsub
), suponha que a substituição única seja o padrão e trate a substituição global como um g
modificador.
Teste
Se o seu sabor escolhido for .NET ou ECMAScript, você poderá usar o Retina para testar seu envio (me disseram que também funciona no Mono). Para outros tipos, você provavelmente precisará escrever um pequeno programa no idioma host que aplique as substituições em ordem. Se o fizer, inclua este programa de teste na sua resposta.