分裂复数,也被称为“混淆数”,类似于复数。然而,我们没有使用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,并带有可选的换行符。此字符串表示表达式,使用infix表示法和运算符优先(加法前的乘法,加上括号分组)。
-总是表示否定,从不减法。如果您愿意,可以将-替换为_或~,以方便I/O。(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发布于 2016-01-10 07:39:37
class c(complex):__mul__=lambda s,o:c(s.real*o.real+s.imag*o.imag,s.real*o.imag+s.imag*o.real);__add__=lambda s,o:c(sum(map(complex,[s,o])))
import re
r=eval(re.sub("j","c(0,1)",re.sub(r"(-?\d+)",r"c(\1)",raw_input())))
print`int(r.real)`+"+j*"+`int(r.imag)`这可能不是最好的方法,但是这是第一次在Python中OOP看起来是一个代码高尔夫的好主意,那么为什么不呢?
创建一个类c,该类继承自complex,但具有不同的mul操作。add操作也会被更改,以便返回一个类型为c而不是complex的对象,这种行为对于防止(a + b) * (c + d)进行复数乘法而不是这种特殊类型的情况是必要的。
然后将输入字符串转换为可由python自然计算的字符串。它通过将每个数字转换为c(number),然后将每个j转换为c(0,1)来做到这一点。
发布于 2017-01-15 16:50:07
j:=X(Integers,"j");f:=t->t mod(j^2-1);首先,j被定义为不确定的,因此我们可以在j中创建多项式。为了得到相应的困惑数,我们用j^2-1减少(即取多项式除法的余数)。这给出了一个线性(或常数)项,我们可以依赖于GAP输出多项式的能力。
示例:
gap> f((2+j*3)+(4+j*7));
10*j+6
gap> f((1+j*-1)*(1+j*1));
0警告: 1.这不是以字符串作为输入,而是使用GAP语言中的一个真正的术语。要修复,我可以使用EvalString。2.输出清晰,但不完全按照规定:顺序被改变,不必要的零被抑制。我认为并希望这仍然是挑战的精神,否则我想我会更好地使用@xnor的矩阵方法。
发布于 2017-01-15 14:33:51
@set/aj=1,a=%1,j=-1,a-=b=(a-(%1))/2
@echo %a%+j*%b%在看到@xnor的出色的答案提名后,我觉得不得不将它移植。
https://codegolf.stackexchange.com/questions/69003
复制相似问题