A multiplicação entre 2 números inteiros pode ser reduzida em uma série de adição como essa
3 * 5 = 3 + 3 + 3 + 3 + 3 = 5 + 5 + 5
Exponenciação (aumentando um para o poder b ) também pode ser reduzida para uma série de multiplicações:
5 ^ 3 = 5 * 5 * 5
Portanto, a exponenciação pode ser reduzida em uma série de adições, criando uma expressão de multiplicação e depois em uma série de adições. Por exemplo, 5 ^ 3
(5 em cubos) pode ser reescrito como
5 ^ 3 = 5 * 5 * 5
= (5 + 5 + 5 + 5 + 5) * 5
= (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5)
= 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5
Sua tarefa é, dadas expressões somadas que consistem em exponenciação, multiplicação e adição, reduza-a à menor série de adições. A expressão "menor" é definida como a expressão com o menor número de +
símbolos, ainda usando apenas um dos dois números na expressão original. Por exemplo, a expressão mais curta de 10 * 2
é 10 + 10
.
Os números envolvidos na entrada serão todos números inteiros positivos, e a expressão consistirá em apenas +
(adição), *
(multiplicação) e ^
(exponenciação), juntamente com números inteiros e colchetes ( ()
) para indicar precedência.
A saída deve consistir apenas de números inteiros positivos e +
símbolos. Você não deve emitir as etapas individuais das reduções, apenas a saída final. A saída pode não consistir em números que não apareçam na entrada. No entanto, você pode usar quaisquer 3 símbolos distintos em vez de +*^
, mas diga quais símbolos eles são
Os espaços que separam entradas e saídas podem ou não ser usados em seus programas, ou seja, 3 * 5
podem ser gerados como 5 + 5 + 5
ou 5+5+5
.
Observe que, na maioria dos casos, a adição não é realmente executada. O único caso em que a adição deve ser realizada é quando você tem algo como 5 ^ (1 + 2)
, nesse caso, a adição é necessária para continuar -> 5 ^ 3 -> 5 * 5 * 5 -> ...
. Veja o caso de teste nº 4.
Seu código não precisa manipular entradas que cheguem a uma expressão ambígua. Por exemplo (2 + 2) * (4 + 1)
,. Devido às regras estabelecidas até agora, o objetivo não é calcular a resposta, o objetivo é simplificar as adições. Portanto, o resultado pode ser diferente dependendo da ordem em que as expressões são resolvidas ou comutadas (quais adições simplificar, quais deixar?). Outro exemplo inválido: ((3 + 2) ^ 2) ^ 3 -> ((3 + 2) * (3 + 2)) ^ 3 -> ???
.
Isso é código-golfe, então o código mais curto ganha
Casos de teste
Input => output
5 ^ 3 + 4 * 1 ^ 5 => 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 4
2 ^ 1 * 2 + 3 + 9 => 2 + 2 + 3 + 9
2 ^ 1 * (2 + 3) + 9 => 2 + 3 + 2 + 3 + 9
2 ^ (1 * (2 + 3)) + 9 => 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 9
10 + 3 * 2 + 33 ^ 2 => 10 + 3 + 3 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33
100 * 3 => 100 + 100 + 100
2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1 => 2 + 2 + 2 + 2 + 8
(1 + 2 + 5 * 8 + 2 ^ 4) * 2 => 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2
fonte
**
vez de^
?using only one of the two numbers in the original expression.
mas a expressão original pode ter mais de dois números. Eu não entendo porque8 + 8
não é uma saída válida para2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1
. Essa pergunta ainda não está clara para mim.Respostas:
Retina , 302 bytes
Tenho certeza de que isso pode ser jogado, mas, neste momento, estou feliz que funcione. As seções de exponenciação e multiplicação são muito semelhantes, mas como a ordem das operações é importante, não sei como combiná-las.
y
- Exponenciaçãox
- Multiplicaçãop
- AdiçãoExperimente online - todos os casos de teste
Conversor de caso de teste
Explicação
Você também pode perceber que o grupo mais usado é
(\(\w+\)|1+)
. Isso corresponde a uma expressão interna entre parênteses ou um número inteiro. Eu escolhi usar os símbolos que fiz para poder usar em\w
vez de uma classe de personagem. Não tenho certeza se seria melhor usar símbolos que não sejam palavras e substituir algumas soluções alternativas por bordas de palavras (\b
).fonte
Mathematica,
250218183170 bytesFunciona! Finalmente!
Define a função em
f
.A entrada é uma expressão matemática simples. (ou seja,
1 + 2
não"1 + 2"
).Experimente Online!
Observe que o link TIO tem um código ligeiramente diferente, pois o TIO (que, presumo, usa o kernel do Mathematica) não gosta
Infix
. EmRiffle
vez disso, usei a mesma aparência do Mathematica REPL.Ungolfed
fonte
Mathematica,
405406 bytesUngolfed e explicou
Eu tive muitos problemas para obter o seguinte efeito: essa função usa como entrada uma expressão padrão do Mathematica, com o habitual
+
,*
e^
operações (e parênteses) na mesma, e saídas que parece ser uma expressão Mathematica padrão (mas com sinais de adição "desativados") como resposta.A função acima começa desativando todas as operações na entrada. Em seguida, aplica regras de expansão repetidamente até que nada mais possa ser simplificado. Sempre que encontra um produto como
2 * 3 * 4
, que pode ser expandido de várias maneiras, ele faz uma lista de possíveis expansões e continua. No final, obtemos uma lista de possíveis respostas finais, e a mais curta é escolhida.fonte