Neste desafio, você estará usando a distribuição de um produto por somas e diferenças de números, conforme explicado aqui .
Exemplos
Input | Output
-------------|-------------
23(12+42) | (23*12)+(23*42)
9(62-5) | (9*62)-(9*5)
4(17+8-14) | (4*17)+(4*8)-(4*14)
15(-5) | -(15*5)
2(3) | (2*3)
8(+18) | +(8*18)
8(-40+18) | -(8*40)+(8*18)
Especificação
A entrada será uma cadeia de caracteres do formulário n(_)
, com um único inteiro positivo não assinado, n
seguido de uma expressão entre parênteses _
. Essa expressão _
consistirá em somas e diferenças de um dos termos inteiros positivos separados por +
e -
sinais. O primeiro termo pode ser precedido por um +
sinal, um -
sinal ou por nenhum sinal.
Na saída, o número inicial n
deve ser distribuído para multiplicar cada um dos termos. Cada termo de a
deve ser multiplicado à esquerda n
para produzir a expressão entre parênteses (n*a)
, e esses novos termos devem ser combinados com +
e -
assinados exatamente da mesma maneira que os termos originais.
Entradas inválidas
Estes são exemplos de entradas com as quais você não precisa lidar.
3(5 plus 3)
6(5 13)
(5+8)(6+6)
(5+3)8
Ganhando
Isso é código-golfe , então o código mais curto em bytes vence.
fonte
8(-40+18)
Respostas:
Pip, 28 bytes
Explicação:
Os objetos Pattern de Pip seguem principalmente a sintaxe regex do Python, mas o
&
padrão de substituição é emprestado do sed.Leia mais sobre o Pip no repositório do Github
fonte
JavaScript 65 bytes
Isso levará a entrada. Obtenha o + ou -, os dígitos e substitua-o na ordem correta.
Explicação
Uso
Isso só funciona no Firefox e Safari Nightly, talvez Edge? porque ele usa os recursos do ES6. Você pode executá-lo:
fonte
(.?)(\d+)
está quebrado. Isso falha23(12+42)
, produzindo1(23*2)+(23*42)
.\D?
poderia ser usado em vez de[+-]?
Python 2.7,
110108 bytesO programa pega a entrada do stdin, procura por correspondências contra -
([+-]?)(\d+)
regex e cria a string de saída.Testando -
fonte
Retina , 40 bytes
Cada linha deve ir para seu próprio arquivo, mas você pode executar o código como um arquivo com o
-s
sinalizador. Por exemplo:As duas primeiras linhas empurram o multiplicador ao lado de cada número na forma esperada:
As duas últimas linhas removem a parte final desnecessária:
fonte
sed, 105 bytes
Só queria ver se isso pode ser feito com o sed.
Talvez um pouco da velha escola, mas funciona.
fonte
rs , 77 bytes
Demonstração ao vivo e todos os casos de teste.
Esta é a primeira vez que as macros do rs foram realmente usadas!
fonte
REGXY , 45 bytes
Usa REGXY, um idioma baseado em substituição de regex.
fonte
//
trabalho? Suponho que ele faça um loop até o topo até que a string seja alterada, mas não consigo encontrar o porquê da página esolang.//
cria um loop infinito, comonothing
sempre corresponderá, então sempre voltaremos para a primeira linha.Perl, 36 bytes
Código de 35 bytes + linha de comando de 1 byte
Uso:
fonte
Pitão,
3938 bytesUma solução regex terrível:
fonte
Ruby, 94 bytes
fonte
CJam, 50 bytes
Experimente online
O CJam não possui suporte a regex ou qualquer coisa além da pesquisa e divisão de cadeias que seja muito conveniente para analisar expressões. Portanto, há algum trabalho envolvido aqui.
Explicação:
fonte
gawk -
6058Ufa ... não trabalha com regexp há um bom tempo.
fonte
Perl 5,
70605544 Bytes + 1 penalidadeUma solução perl que usa apenas expressões regulares divididas e 1.
Também calcula as entradas mais longas.
Teste
Uma versão que aceita um parâmetro
Uma versão que usa apenas expressões regulares.
Este funciona através de um grupo de captura com uma aparência positiva e uma correspondência lenta. Provavelmente teria usado um olhar positivo se o Perl 5 o suportasse, mas infelizmente. Demorei um pouco para descobrir que isso é possível com o regex.
fonte
-p
opção de linha de comando (acho que isso é +1 char vs 9 para,<>
e;print
), poissplit
funcionará$_
por padrão (que será o que estiver dentro<>
) e a impressão também está incluída no loop ! Espero que ajude!Retina ,
505143 bytesEu acho que este pode ser o meu primeiro programa de Retina. Caso contrário, é o meu primeiro programa Retina que é tão complexo (não tão complexo, realmente.) Cada linha tem seu próprio arquivo.
Na verdade, eu não testei isso com o Retina, testei usando um testador de substituição de expressão regular várias vezes, mas deve funcionar.
Descrição para o primeiro exemplo:
Como há um número par de arquivos, o Retina usa o modo de substituição. A primeira substituição (dois primeiros arquivos) remove um número a ser distribuído e adiciona esse par de distribuição
(23*12)
ao final, fornecendo23(+42)(23*12)
.+`
no início, informa ao Retina para substituir repetidamente até que o padrão não corresponda e, como isso é correspondido novamente, o padrão o substitui por23()(23*12)+(23*42)
. Isso não corresponde mais, portanto, os próximos 2 arquivos são usados para a próxima substituição. Desta vez, apenas remove o23()
. Isso funciona muito bem: como os produtos são anexados até o final, não preciso fazer nada estranho se um número não tiver um sinal, pois o único que pode ficar sem sinal é o primeiro número.EDIT:
$'
em substituição representa o resto da string após a partida, para que eu possa remover os(.*)
s à direita .fonte
k, 98 bytes
Não é muito golfista.
Divida com não dígito, remova parênteses, remova cadeias vazias e mantenha
x
constante como a primeira cadeia, combine*
com cada cadeia restantey
, entre parênteses e mova o sinal para o início, se presente; achatar a saída em uma única sequência.fonte