난수를 더하고 곱하기


16

" 복합 수 "라고도 하는 분할 복소수 는 복소수와 유사합니다. 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 / O의 용이성을 위해.
  • 괄호는 그룹화를 나타 내기 위해 최대 세 번 중첩 될 수 있습니다. (1+(1+(1)))
  • 이 문자 j는 절대로 접두사가 붙지 않으며 항상 뒤에옵니다.* .
  • 괄호 앞에는 부정이 붙지 않습니다 -(7) 이 없지만 대신-1*(j*5+2)
  • 암시 적 작업은 절대 없습니다. 모든 승산은 다음과 같이 표현 될 것 (7)*7대신 (7)7, 그리고 j*5대신 j5.
  • 선행 0이 없습니다.

산출

출력은의 형식이며 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

답변:


13

파이썬 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=1하고j=-1 , 출력의 절반 합계의 계수로 절반의 차이 1j .

이것은 정의 방정식 정의 방정식 모두 j=1j=-1만족시키기 때문에 작동합니다 j*j==1. 따라서 원래의 표현과 단순화 된 표현은이 두 값에 대해 동일해야합니다. 단순화 된 표현은 선형이므로 두 개의 미지수로 두 개의 선형 방정식을 제공합니다.

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

파이썬 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에서 코드 골프에 대한 유쾌한 아이디어처럼 보이는 것은 처음이었습니다. 왜 그렇지 않습니까?

c컴플렉스에서 상속하지만 다른 mul작업을 갖는 클래스 를 만듭니다 . add작업도 그래서 형식의 개체를 반환 변경 c하지 complex,이 동작의 경우 방지 할 필요가 (a + b) * (c + d)대신이 특별한 종류의 복잡한 곱셈을 수행합니다.

입력 문자열은 파이썬으로 자연스럽게 평가할 수있는 문자열로 변환됩니다. 그것은으로 모든 번호를 변경하여이를 수행 c(number)모든 다음 jc(0,1).

온라인으로 사용해 보거나 Test Suite를 실행하십시오.


1

간격 , 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. 출력은 훌륭하고 명확하지만 지정된대로 정확하게는 아닙니다. 순서가 변경되고 불필요한 0이 억제됩니다. 나는 이것이 여전히 도전의 정신에 있다고 생각하고 희망한다. 그렇지 않으면 @xnor의 매트릭스 접근법을 사용하는 것이 더 나을 것이라고 생각한다.


1
Mathematica PolynomialMod[#,j^2-1]&는 비슷한 특성을 가지고 있습니다. 실제로 테스트 케이스와 같이 두 개 이상의 난수를 함께 곱하지 않으면 Expand@#/.j^2->1충분합니다.
Greg Martin

마찬가지로 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.