Tính toán một sức mạnh phức tạp


10

Chủ nhật

Cho bất kỳ đầu vào xy , thực hiện một thao tác phức tạp và in một kết quả tương ứng.

Chương trình của bạn nên hoạt động như thế nào

  1. Cho đầu vào xy ở dạng z = x + yi , tìm z i-z

  2. Nếu giá trị thực tuyệt đối của z i-z lớn hơn phần ảo tuyệt đối, hãy in phần thực; ngược lại cho cách khác xung quanh. Nếu cả hai giá trị bằng nhau, in một trong các giá trị.

Thí dụ

x: 2
y: 0

Vì thế:

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

Vì phần thực có giá trị tuyệt đối lớn hơn phần ảo, chương trình trả về

0.192309

Thêm ví dụ

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

10
Pro-tip: thoát khỏi tiền thưởng!
Stewie Griffin


7
Việc tăng một số phức thành một công suất phức tạp là không liên tục và phụ thuộc vào việc cắt nhánh được sử dụng. Bạn có thể chỉ định điều đó? Mặc dù tôi đoán mọi người sẽ chỉ sử dụng các phép toán tích hợp và những cái đó có lẽ đều sử dụng cùng một quy ước.
xnor

2
"Lớn hơn" có nghĩa là chọn giá trị có giá trị tuyệt đối lớn nhất, thay vì (hầu hết đã giả định) để chọn giá trị tối đa? Một trường hợp thử nghiệm của -2+ithể được sử dụng cho điều đó ( z^(i-z)=3-4ivì thế 3>-4vs abs(-4)>abs(3)).
Jonathan Allan

5
Việc làm rõ / thay đổi "giá trị tuyệt đối" đã làm mất hiệu lực hầu hết các câu trả lời.
xnor

Câu trả lời:


7

Thạch , 8 11 byte

Cảm ơn Johnathan Allan đã cập nhật câu trả lời với các quy tắc thay đổi.

ı_*@µĊ,ḞAÞṪ

Hãy thử trực tuyến!

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

Làm cho nó ı_*@µĊ,ḞAÞṪvà bạn cũng có thể có mục nhập hợp lệ duy nhất (được đưa ra thay đổi để yêu cầu giá trị tối đa theo thuật ngữ tuyệt đối, ví dụ như, -2+1jtrả về -4.0thay vì 3.0).
Jonathan Allan

6

Python 2, 45 byte

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

Dùng thử trực tuyến - tất cả các trường hợp thử nghiệm

Ngôn ngữ lập trình thường sử dụng jthay vì i. Đó là trường hợp trong Python. Xem câu hỏi SO này để biết thêm thông tin về lý do tại sao.


5

Toán học, 21 22 byte

Chỉnh sửa: Cảm ơn JungHwan Min vì đã tiết kiệm được 3 btyes

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

Hàm thuần túy dự kiến ​​một số phức làm đối số. Nếu một số chính xác được thông qua, thì một số chính xác sẽ được trả về (ví dụ: 1/2cho Sqrt[2] Cos[Log[2]]). Thông số kỹ thuật đã được chỉnh sửa sau khi tôi đăng giải pháp của mình để xác định rằng giá trị tuyệt đối nên được sử dụng. Điều tốt nhất tôi có thể đưa ra là MaximalBy[ReIm[#^(I-#)],Abs][[1]]&hoặc Last@MaximalBy[Abs]@ReIm[#^(I-#)]&cả hai 34byte.


1
Maxkhông cần phải là người đứng đầu. Nó trả về giá trị tối đa cho dù đầu vào Listcó sâu đến đâu (ví dụ Max[1, {2, {3}}]trả về 3). Ngoài ra, câu hỏi chỉ xác định rằng bạn in các giá trị, vì vậy tôi không nghĩ bạn sẽ cần N: Max@ReIm[#^(I-#)]&sẽ hoạt động.
JungHwan Min

3

Octave , 29 byte

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

Điều này xác định một chức năng ẩn danh. Nó cũng hoạt động trong MATLAB.

Hãy thử trực tuyến!

Giải trình

Phân chia phần tử khôn ngoan ( ./) số z^(i-z)cho mảng [1 i]và lấy phần thực cho một mảng với phần thực và phần ảo của z^(i-z).


3

MATL , 10 byte

Jy-^&ZjhX>

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Hãy xem xét đầu vào -2+8ilà một ví dụ.

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 byte

Đã lưu một byte nhờ @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

Lấy đầu vào là một số phức trên Zbiến.

TI-BASIC sử dụng mã hóa riêng của nó, bạn có thể tìm thấy nó ở đây .



1

Perl 6 , 24 byte

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

$_là đối số phức tạp có thể; $_ ** (i - $_)là biểu thức được tính toán; .realslà một Complexphương thức trả về một danh sách các phần thực và phần ảo; và cuối cùng .maxtrả lại lớn hơn của hai.


1

C (GCC), 93 79 + 4 ( -lm) = 97 83 byte

Đã lưu 14 byte nhờ @ceilingcat!

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

Bao gồm tiêu đề complex.hdài hơn đó ¯ \ _ (ツ) _ /

Hãy thử trực tuyến!


Tại sao +4 byte? Tôi đếm 3, -, l, và m.
Rɪᴋᴇʀ

Biên dịch bình thường @Riker là gcc file.c -o exe, vì vậy cờ này cho biết thêm 4 byte: không gian, -, l, và m. (Ít nhất đó là cách tôi thấy nó được tính khi biên dịch.)
betseg

@ceilingcat oh không biết điều đó là có thể. Cảm ơn!
betseg



1

TI-Basic, 19 16 byte

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

real(imag(là các mã thông báo hai byte.

Chạy với 5+3i:prgmNAME( 5+3ilà argmuent, NAMElà tên chương trình.)


0

R, 38 byte

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

Chức năng ẩn danh. Lấy một số phức (có thể) z, đưa nó đến công suất được chỉ định và sau đó trả về các maxphần Real và Imphần phụ.


0

Tiên đề, 60 byte

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

mã kiểm tra và kết quả; tôi làm theo phiên bản khác của câu hỏi ...

(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 byte

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);}

Có thể đọ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); }

Giải thích: Quyết định không sử dụng bất kỳ thư viện phức tạp nào.

z=x+iy=reitziz=(reit)(x+i(1y))=rxri(1y)exitet(y1)=rxet(y1)ei((1y)ln(r)xt) (as ri=eiln(r))

meia

m=rxet(y1)
a=(1y)ln(r)xt

(ziz)=mcosa(ziz)=msina

cosasina122c2<1

z=1eiπe3iπieπe3πt[0,2π)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.