首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加乘困惑数

加乘困惑数
EN

Code Golf用户
提问于 2016-01-09 15:44:10
回答 3查看 449关注 0票数 16

分裂复数,也被称为“混淆数”,类似于复数。然而,我们没有使用i^2 = -1,而是使用了j^2 = 1; j != +/-1。每个数字都采用z = x + j*y的形式。

为了限制这一挑战的复杂性,我将使用符号-来表示否定,因为不会有任何减法。

以下是一些欣赏乐趣的例子:

代码语言:javascript
复制
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可以是任意整数。如果一个整数是负的,它应该以负号作为前缀。

附加限制

虽然我不知道有任何语言的原生支持,内置的处理分裂-复数是禁止的。规则复数是公平的游戏。

测试用例

类似于上面的例子,但是整理起来了。输入一行并输出下面的行。

代码语言:javascript
复制
(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
EN

回答 3

Code Golf用户

发布于 2016-01-10 07:39:37

Python 2,258

代码语言:javascript
复制
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)来做到这一点。

在网上试试或运行测试套房

票数 2
EN

Code Golf用户

发布于 2017-01-15 16:50:07

空隙,38字节

代码语言:javascript
复制
j:=X(Integers,"j");f:=t->t mod(j^2-1);

首先,j被定义为不确定的,因此我们可以在j中创建多项式。为了得到相应的困惑数,我们用j^2-1减少(即取多项式除法的余数)。这给出了一个线性(或常数)项,我们可以依赖于GAP输出多项式的能力。

示例:

代码语言:javascript
复制
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的矩阵方法。

票数 1
EN

Code Golf用户

发布于 2017-01-15 14:33:51

批处理,52字节

代码语言:javascript
复制
@set/aj=1,a=%1,j=-1,a-=b=(a-(%1))/2
@echo %a%+j*%b%

在看到@xnor的出色的答案提名后,我觉得不得不将它移植。

票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/69003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档