困惑する数を追加して乗算する


16

複素数」とも呼ばれる分割複素数は、複素数に似ています。i^2 = -1ただし、代わりにがありj^2 = 1; j != +/-1ます。各番号はの形式を取りますz = x + j*y

この課題の複雑さを制限するための1つの試み-では、減算を行わないため、シンボルを使用して否定を表します。

視聴の楽しみの例を次に示します。

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

チャレンジ

この課題の目標は、分割複素数を持つ式を評価することです。

これはcode-golfであり、最も少ないバイトが勝ちます。

入力

入力は、シンボル+*()-、数字0123456789、文字のみを含む1行jで、オプションの改行があります。この文字列は、中置表記法と演算子の優先順位を使用して式を表します(加算前の乗算、括弧のグループ化)。

  • 記号-は常に否定を表し、減算を表しません。 必要に応じて、-どちらか_または~ I / Oを簡単にするために置き換えることができます
  • 括弧は、グループ化を示すために最大3回ネストできます。 (1+(1+(1)))
  • 文字のj前に否定が直接付加されることはなく、常に後に続き*ます。
  • 括弧の前には否定がありませんが-(7)、代わりに-1*(j*5+2)
  • 暗黙的な操作はありません。すべての乗算は、と表現する(7)*7代わりに(7)7、およびなどj*5の代わりにj5
  • 先行ゼロなし。

出力

出力はの形式になりますX+j*Y。XとYは任意の整数です。整数が負の場合、負符号を前に付ける必要があります。

追加の制限

私はネイティブサポートの言語を認識していませんが、分割複素数を扱う組み込み関数は禁止されています。通常の複素数は公平なゲームです。

テストケース

上記の例と同様ですが、整理されています。1行に入力し、その下の行を出力します。

(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

回答:


13

Python 2、62バイト

def f(s):b,a=[eval(s)/2.for j in-1,1];print'%d+j*%d'%(a+b,a-b)

私たちは、単に式を評価sして j=1j=-1の係数としてそれらの和の半分それらの差を、出力の半分1j

これが機能するのは、両方が定義式を定義し、定義式j=1j=-1満たすためj*j==1です。したがって、元の式と簡略化された式は、これらの両方の値で等しくなければなりません。簡略化された式は線形であるため、2つの未知数で2つの線形方程式が得られます。

x + 1*y  = s(1)  = 2*a
x - 1*y  = s(-1) = 2*b

によって解決されx=a+b, y=a-bます。


行列演算を使用する言語でj=[0 1; 1 0]は、最上行から係数を使用して式を評価し、係数を読み取ることもできます。
xnor

2

Python 2、258

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)`

これはおそらく最善のアプローチではありませんが、OOPがコードゴルフのPythonでまずまずのアイデアのように見えたのは初めてでした。

ccomplexを継承するが、mul操作が異なるクラスを作成します。また、add操作は変更され、type cではなくtypeのオブジェクトを返すようになりますcomplex。この動作は(a + b) * (c + d)、この特別な種類ではなく複雑な乗算を行う場合を防ぐために必要です。

入力文字列は、Pythonで自然に評価できる文字列に変換されます。それは、すべてに番号を変更することでこれを行いc(number)、その後、すべてjc(0,1)

オンラインで試すか、テストスイートを実行する


1

GAP、38バイト

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のマトリックスアプローチを使用した方が良いと思います。


1
MathematicaにPolynomialMod[#,j^2-1]&は同様のプロパティがあります。確かに、テストケースのように、2つ以上のパープレックス数を一度に乗算しない場合は、Expand@#/.j^2->1十分です。
グレッグマーティン

同様にt->t%(j^2-1)、Pari / GP。
-alephalpha

1

公理、20 42バイト

f(x,n)==x^(n rem 2);m:=rule('j^n==f('j,n))

前述の解決策は、次の場合に問題を抱えているn<0j^n 何か間違っているがある場合、完璧には戻り例J ^ 1.2またはJ ^ SQRT(-1)と同じ式は評価しないだろうしても、このことは、より強固ようだ、とよくアドバイス

(9) -> f(x,n)==x^(n rem 2);m:=rule('j^n==f('j,n))
         n
   (9)  j  == 'f(j,n)
                    Type: RewriteRule(Integer,Integer,Expression Integer)
(10) -> [m((2+j*3)+(4+j*7)), m((2+j*3)*(4+j*7)), m((-5+j*1+j*2+2)*(4+j*7))]
   (10)  [10j + 6,26j + 29,- 9j + 9]
                                            Type: List Expression Integer
(11) -> [m((1+j*-1)*(1+j*1)), m(j*((j*-1)+2)), m(2+(5+-1*(j*1))+2)]
   (11)  [0,2j - 1,- j + 9]
                                            Type: List Expression Integer
(12) -> [m(j*j*j*j),m(j*j*j),m(j^200)]
   (12)  [1,j,1]
                                            Type: List Expression Integer
(13) -> [m(j^0),m(j^-1),m(j^-2), m(j^-3)]
            1   1
   (13)  [1,-,1,-]
            j   j
                                            Type: List Expression Integer
(14) -> m(j^(3.4))
   There are no library operations named m
      Use HyperDoc Browse or issue

私が質問のいくつかの法則に従わない場合:それを言って、私は「競争力のない」を追加します。数式を単純化するための一つの公理として


0

バッチ、52バイト

@set/aj=1,a=%1,j=-1,a-=b=(a-(%1))/2
@echo %a%+j*%b%

@xnorの優れた回答のノミネートを見た後、移植することを余儀なくされました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.