복잡한 힘을 계산


10

런 다운

입력 xy가 주어지면 복잡한 연산을 수행하고 해당 결과를 인쇄하십시오.

프로그램 작동 방식

  1. z = x + yi 형식 의 입력 xy 가 주어지면 z i-z를 찾으십시오.

  2. z i-z 의 절대 실수 값이 절대 허수 부분보다 크면 실수 부분을 인쇄하십시오. 반대의 경우도 마찬가지입니다. 두 값이 같으면 값 중 하나를 인쇄하십시오.

x: 2
y: 0

따라서:

z = 2
z^(i-z) ~= 0.192309 + 0.159740i

실수 부분은 허수 부분보다 절대 값이 더 크므로 프로그램은

0.192309

더 많은 예

z = 1+i >> 0.5
z = i >> 1
z = 0.5 >> 1.08787
z = -2+8i >> 2.22964E7
z = -10i >> 3.13112E7

10
전문가 팁 : 보너스를 제거하십시오!
Stewie Griffin


7
복소수를 복소수로 올리는 것은 불 연속적이며 사용 된 브랜치 컷에 따라 다릅니다. 지정할 수 있습니까? 비록 모두가 내장 수학 연산을 사용하고 아마도 모두 동일한 규칙을 사용한다고 생각합니다.
xnor

2
"크게"는 최대 값을 선택하기보다는 (가장 많이 가정 한) 값보다 절대 값이 가장 큰 값을 선택한다는 의미입니까? 테스트 케이스를 -2+i사용할 수 있습니다 ( z^(i-z)=3-4i그래서 3>-4vs abs(-4)>abs(3)).
Jonathan Allan

5
"절대 값"설명 / 변경으로 대부분의 답변이 무효화되었습니다.
xnor

답변:


7

젤리 , 8 11 바이트

규칙 변경으로 답변을 업데이트 한 Johnathan Allan에게 감사합니다.

ı_*@µĊ,ḞAÞṪ

온라인으로 사용해보십시오!

ı_*@        z^(i-z)
    µ       new monadic link
     Ċ,Ḟ    pair real and imaginary parts
        AÞṪ sort by absolute value and take last value

그것을 ı_*@µĊ,ḞAÞṪ만들고 당신은 유일하게 유효한 항목을 가질 수 있습니다 (예를 들어, 대신 에 -2+1j반환 -4.0하는 것과 같이 절대 값으로 최대 값을 요구하도록 변경을 가한 경우 3.0).
Jonathan Allan

6

파이썬 2, 45 바이트

def f(z):z=z**(1j-z);print max(z.real,z.imag)

온라인으로 사용해보십시오 - 모든 테스트 사례

프로그래밍 언어는 종종 j대신에 사용 합니다 i. 그것은 파이썬의 경우입니다. 이유에 대한 자세한 내용 은 이 SO 질문 을 참조하십시오.


5

수학, 21 22 바이트

편집 : 3 btyes를 절약 한 JungHwan Min에게 감사드립니다.

Max@ReIm[#^(I-#)]&

인수로 복소수를 기대하는 순수 함수. 정확한 숫자가 전달되면 정확한 숫자가 반환됩니다 (예 : 1/2제공 Sqrt[2] Cos[Log[2]]). 솔루션을 게시 한 후 문제 사양을 편집하여 절대 값을 사용해야한다고 지정했습니다. 내가 얻을 수있는 최선은 MaximalBy[ReIm[#^(I-#)],Abs][[1]]&또는 Last@MaximalBy[Abs]@ReIm[#^(I-#)]&모두 34바이트입니다.


1
Max머리 일 필요는 없습니다. 입력의 깊이에 관계없이 최대 값을 반환합니다 List(예 : Max[1, {2, {3}}]returns 3). 또한, 질문은 당신이 필요 생각하지 않는다, 그래서 당신이 값을 인쇄하도록 지정 N: Max@ReIm[#^(I-#)]&작동합니다.
JungHwan Min

3

옥타브 , 29 바이트

@(z)max(real(z^(i-z)./[1 i]))

이것은 익명 함수를 정의합니다. MATLAB에서도 작동합니다.

온라인으로 사용해보십시오!

설명

요소 별로 배열을 ./숫자 z^(i-z)로 나누고 ( ) [1 i]실수 부를 취하면의 실수 부와 허수 부가있는 배열이 z^(i-z)됩니다.


3

MATL , 10 바이트

Jy-^&ZjhX>

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

-2+8i예를 들어 입력 을 고려하십시오 .

J     % Push i (imaginary unit)
      % STACK: i
y     % Implicit input. Duplicate from below
      % STACK: -2+8i, i, -2+8i
-     % Subtract
      % STACK: -2+8i, 2-7i
^     % Power
      % STACK: 3168271.58+22296434.47i
&Zj   % Real and imaginary parts
      % STACK: 3168271.58, 22296434.47
h     % Concatenate
      % STACK: [3168271.58 22296434.47]
X>    % Maximum. Implicitly display
      % STACK: 22296434.47

2

TI-BASIC, 40 , 32 , 31 29 바이트

@Conor O'Brien 덕분에 바이트를 절약했습니다.

Z^(i-Z→A                   #Perform operation, store as A, 8 bytes
:real(A)>imag(A            #Test if real part is greater than imaginary, 9 bytes
:Ansreal(A)+imag(Anot(Ans  #Determine output and print, 12 bytes

Z변수 에서 입력을 복소수로 취 합니다.

TI-BASIC은 자체 인코딩을 사용하며 여기에서 찾을 수 있습니다 .



1

펄 6 , 24 바이트

{($_**(i-$_)).reals.max}

$_아마도 복잡한 주장이다. $_ ** (i - $_)계산할 표현식입니다. .realsA는 Complex실수 부와 허수 부분의 목록을 반환 방법은; 마지막으로 .max둘 중 더 큰 값을 반환합니다.


1

C (GCC), 93 79 + 4 ( -lm) = 97 83 바이트

@ceilingcat 덕분에 14 바이트를 절약했습니다!

float f(_Complex z){z=cpow(z,csqrt(-1)-z);return cimag(z)>creal(z)?cimag(z):z;}

헤더를 포함하면 complex.h¯ \ _ (ツ) _ / ¯보다 깁니다

온라인으로 사용해보십시오!


왜 +4 바이트입니까? 나는 3 셀, -, l,와 m.
Rɪᴋᴇʀ

@Riker 정상 컴파일은 gcc file.c -o exe공간이 플래그가 4 바이트 추가되므로 -, l등을 m. (적어도 그것이 컴파일 할 때 계산되는 방식입니다.)
betseg

@ceilingcat 아는 가능하지 않았다. 감사!
betseg



1

TI 기본, 19 16 바이트

Ans^(i-Ans
max(real(Ans),imag(Ans

real(그리고 imag(2 바이트 토큰이다.

5+3i:prgmNAME( 5+3iargmuent, NAME프로그램 이름)로 실행하십시오 .


0

R, 38 바이트

pryr::f({z=z^(1i-z);max(Re(z),Im(z))})

익명의 기능. (아마도) 복소수 걸린다 z지정된 전원을 얻어, 다음을 반환 maxReAl 및 Imaginary 부품.


0

공리, 60 바이트

f(z:Complex Float):Float==(y:=z^(%i-z);max(real(y),imag(y)))

테스트 코드 및 결과; 나는 질문의 다른 선례로 따라갑니다 ...

(28) -> [[k,f(k)] for k in [1+%i,%i,1,-2+8*%i,-10*%i]]
   (28)
   [[1.0 + %i,0.5], [%i,1.0], [1.0,1.0],
    [- 2.0 + 8.0 %i,22296434.4737098688 53],
    [- 10.0 %i,31311245.9804955291 66]]

0

C #-189 바이트

double f(double x, double y){double r,t,m,c;r=Math.Sqrt(x*x+y*y);t=Math.Atan2(y,x);m=Math.Pow(r,-x)*Math.Exp(y*t-t);c=Math.Cos((1-y)*Math.Log(r)-t*x);return m*(2*c*c<1?Math.Sqrt(1-c*c):c);}

읽을 수있는 :

double f(double x, double y){
double r, t, m, c;
r = Math.Sqrt(x * x + y * y);
t = Math.Atan2(y, x);
m = Math.Pow(r, -x) * Math.Exp(y * t - t);
c = Math.Cos((1 - y) * Math.Log(r) - t * x);
return m * (2 * c * c < 1 ? Math.Sqrt(1 - c * c) : c); }

설명 : 복잡한 라이브러리를 사용하지 않기로 결정했습니다.

=엑스+나는와이=아르 자형이자형나는나는=(아르 자형이자형나는)(엑스+나는(1와이))=아르 자형엑스아르 자형나는(1와이)이자형엑스나는이자형(와이1)=아르 자형엑스이자형(와이1)이자형나는((1와이)ln(아르 자형)엑스) (같이 아르 자형나는=이자형나는ln(아르 자형))

이 같게 미디엄이자형나는 어디

미디엄=아르 자형엑스이자형(와이1)
=(1와이)ln(아르 자형)엑스

그때 (나는)=미디엄코사인(나는)=미디엄

최대 절대 값은 코사인 이 용어들은 12 (따라서 테스트 22<1).

언급했듯이 복잡한 지수로 올리는 것은 특정 가지 절단을 선택하는 것 (예 : =1 될 수 있었다 이자형나는π 또는 이자형나는π -이것을 높이기 위해 나는 의 진짜 부분을 제공 이자형π 또는 이자형π 그러나 나는 방금 [0,2π) 질문에 따라.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.