的分割复数,也被称为“困扰数字”类似于复数。i^2 = -1
但是,我们有代替j^2 = 1; j != +/-1
。每个数字采用的形式z = x + j*y
。
为了限制这一挑战的复杂性,我将使用该符号-
来表示否定,因为不会有任何减法。
以下是一些欣赏乐趣的示例:
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
挑战
这项挑战的目标是评估具有复数复数的表达式。
这是代码高尔夫球,最少的字节获胜。
输入值
输入将是仅包含符号+*()-
,数字0123456789
和字母j
的一行,并带有可选的换行符。该字符串表示一个表达式,使用中止符号和运算符优先级(加法之前的乘法,带有括号分组)。
- 该符号
-
将始终表示取反,而不是相减。 如果您愿意,可以-
使用_
~
I 或 I 代替,也可以简化I / O。 - 括号最多可嵌套3次以表示分组:
(1+(1+(1)))
- 该字母
j
绝不会直接带有否定词前缀,并且始终后跟*
。 - 括号前面不会加负号
-(7)
,而是像-1*(j*5+2)
- 永远不会有隐式操作。所有乘法将表示为
(7)*7
代替(7)7
,并作为j*5
替代j5
。 - 没有前导零。
输出量
输出将采用的形式X+j*Y
,其中X和Y可以是任何整数。如果整数为负数,则应在其前面加上否定符号。
其他限制
尽管我不知道有任何本机支持的语言,但是禁止使用处理复数形式的内置程序。常规复数是公平的游戏。
测试用例
与以上示例类似,但整理了。在一行上输入,然后在下面输出。
(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]
最上面的行来评估表达式并从中读取系数。