Os números de complexo dividido , também conhecidos como "números perplexos" são semelhantes aos números complexos. Em vez de i^2 = -1
, no entanto, temos j^2 = 1; j != +/-1
. Cada número assume a forma de z = x + j*y
.
Em uma tentativa de limitar a complexidade desse desafio, usarei o símbolo -
para representar negação, pois não haverá subtração.
Aqui estão alguns exemplos para o seu prazer:
6 * 9 = 54 // real numbers still act normally
5 + -7 = -2
j*1 + j*1 = j*2 // two `j`s added together make a j*2
7 * j*1 = j*7 // multiplication is commutative & associative
j*1 + 2 = 2+j*1 // like oil and water, "combine" to form a split-complex number
j*1 + j*-3 = j*-2 // seems okay so far
j*j*1 = j*-1*j*-1 = 1 // kinda sketchy, but such is its inherent nature
j*j*-1 = j*-1*j*1 = -1
(2+j*3)+(4+j*7) = 6+j*10 // combine like terms
7 * (2+j*3) = 14+j*21 // distributive property
j * (2+j*3) = (j*2) + (j*j*3) = 3+j*2 // since j^2 = 1, multiplying my j "swaps" the coefficients
(2+j*3)*(4+j*7) = (2*4)+(2*j*7)+(j*3*4)+(j*3*j*7) = 8+j*14+j*12+21 = 29+j*26 // a complete multiplication
Desafio
O objetivo deste desafio é avaliar uma expressão com números complexos complexos.
Isso é código-golfe, o menor número de bytes vence.
Entrada
A entrada será uma única linha contendo apenas os símbolos +*()-
, os dígitos 0123456789
e a letraj
, com uma nova linha opcional. Essa sequência representa uma expressão, usando notação de infixo e precedência de operador (multiplicação antes da adição, com agrupamento de parênteses).
- O símbolo
-
sempre representará negação, nunca subtração. Se desejar, você pode substituir-
por um_
ou outro~
para facilitar a E / S. - Os parênteses podem ser aninhados até três vezes para indicar o agrupamento:
(1+(1+(1)))
- A letra
j
nunca será prefixada diretamente com negação e sempre será seguida por*
. - Parênteses não serão precedidos de negação
-(7)
, mas sim como-1*(j*5+2)
- Nunca haverá operações implícitas. Toda multiplicação será expressa como em
(7)*7
vez de(7)7
, e como emj*5
vez dej5
. - Sem zeros à esquerda.
Resultado
A saída será na forma de X+j*Y
, onde X e Y podem ser qualquer número inteiro. Se um número inteiro for negativo, deverá ser prefixado com o sinal de negação.
Restrições adicionais
Embora eu não conheça nenhum idioma com suporte nativo, são proibidos os internos que lidam com números complexos. Números complexos regulares são um jogo justo.
Casos de teste
Semelhante aos exemplos acima, mas arrumado. Insira uma linha e produza a linha abaixo.
(2+j*3)+(4+j*7)
6+j*10
(2+j*3)*(4+j*7)
29+j*26
(-5+j*1+j*2+2)*(4+j*7)
9+j*-9
(1+j*-1)*(1+j*1)
0+j*0 // this is why division does not exist.
j*((j*-1)+2)
-1+j*2
(2+(5+-1*(j*1))+2)
9+j*-1
j=[0 1; 1 0]
e ler coeficientes da linha superior.