Oblicz złożoną moc


10

Bieg do dołu

Biorąc pod uwagę dowolny wejściowy x i y , wykonanie złożonej operacji drukowania i odpowiedni wynik.

Jak powinien działać Twój program

  1. Biorąc pod uwagę x i y w postaci z = x + yi , znajdź z i-z

  2. Jeśli bezwzględna rzeczywista wartość z i-z jest większa niż absolutna część urojona, wydrukuj część rzeczywistą; i odwrotnie, na odwrót. Jeśli obie wartości są równe, wydrukuj jedną z wartości.

Przykład

x: 2
y: 0

W związku z tym:

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

Ponieważ część rzeczywista ma większą wartość bezwzględną niż część urojona, program powraca

0.192309

Więcej przykładów

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

10
Porada od specjalistów: pozbądź się bonusu!
Stewie Griffin,


7
Podnoszenie liczb zespolonych do złożonej mocy jest nieciągłe i zależy od zastosowanego cięcia gałęzi. Czy możesz to określić? Chociaż myślę, że wszyscy będą używać wbudowanych operacji matematycznych, a ci prawdopodobnie wszyscy używają tej samej konwencji.
xnor

2
Czy „większe” oznacza wybranie wartości o największej wartości bezwzględnej, a nie (co większość zakładała) wybranie wartości maksymalnej? W tym celu -2+imożna zastosować przypadek testowy ( z^(i-z)=3-4itak 3>-4vs abs(-4)>abs(3)).
Jonathan Allan

5
Wyjaśnienie / zmiana „wartości bezwzględnej” unieważniła większość odpowiedzi.
xnor

Odpowiedzi:


7

Galaretka , 8 11 bajtów

Dzięki Johnathan Allan za aktualizację odpowiedzi wraz ze zmianą zasad.

ı_*@µĊ,ḞAÞṪ

Wypróbuj online!

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

Zrób to, ı_*@µĊ,ḞAÞṪa możesz mieć jedyny prawidłowy wpis (biorąc pod uwagę zmianę wymagającą maksymalnej wartości w wartościach bezwzględnych, na przykład, że -2+1jzwraca -4.0raczej niż 3.0).
Jonathan Allan

6

Python 2, 45 bajtów

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

Wypróbuj online - wszystkie przypadki testowe

Języki programowania często używają jzamiast i. Tak jest w przypadku Pythona. Zobacz to SO pytanie, aby uzyskać więcej informacji o tym, dlaczego.


5

Mathematica, 21 22 bajtów

Edycja: Podziękowania dla JungHwan Min za zaoszczędzenie 3 bajtów

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

Czysta funkcja, która oczekuje argumentu jako liczby zespolonej. Jeśli podana zostanie dokładna liczba, zostanie zwrócona dokładna liczba (np. 1/2Daje Sqrt[2] Cos[Log[2]]). Specyfikacja problemu została edytowana po opublikowaniu mojego rozwiązania, aby określić, że należy użyć wartości bezwzględnej. Najlepsze, co mogę na to wymyślić, to MaximalBy[ReIm[#^(I-#)],Abs][[1]]&albo Last@MaximalBy[Abs]@ReIm[#^(I-#)]&oba 34bajty.


1
Maxnie musi być głową. Zwraca maksymalną wartość bez względu na głębokość wejścia List(np. Max[1, {2, {3}}]Zwraca 3). Ponadto pytanie określa tylko, że drukujesz wartości, więc nie sądzę, byś potrzebował N: Max@ReIm[#^(I-#)]&działałby.
JungHwan Min.

3

Oktawa , 29 bajtów

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

Definiuje to anonimową funkcję. Działa również w MATLAB.

Wypróbuj online!

Wyjaśnienie

Element-mądry dzieląc ( ./) liczbę z^(i-z)przez tablicę [1 i]i biorąc rzeczywistą część daje tablicę z rzeczywistymi i urojonymi częściami z^(i-z).


3

MATL , 10 bajtów

Jy-^&ZjhX>

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Rozważ dane wejściowe -2+8ijako przykład.

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 bajtów

Zapisano bajt dzięki @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

Pobiera dane wejściowe jako liczbę zespoloną Zzmiennej.

TI-BASIC używa własnego kodowania, można je znaleźć tutaj .



1

Perl 6 , 24 bajtów

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

$_jest prawdopodobnie złożonym argumentem; $_ ** (i - $_)jest wyrażeniem do obliczenia; .realsjest Complexmetodą, która zwraca listę rzeczywistych i urojonych części; i wreszcie .maxzwraca większy z dwóch.


1

C (GCC), 93 79 + 4 ( -lm) = 97 83 bajtów

Zaoszczędź 14 bajtów dzięki @ceilingcat!

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

Dołączenie nagłówka complex.hjest dłuższe niż ¯ \ _ (ツ) _ / ¯

Wypróbuj online!


Dlaczego +4 bajty? Liczę 3, -, l, i m.
Rɪᴋᴇʀ

@Riker kompilacja jest normalne gcc file.c -o exe, więc ta flaga dodaje 4 bajty: przestrzeń, -, l, i m. (Przynajmniej tak to
liczę

@ceilingcat oh nie wiedziałem, że to możliwe. Dzięki!
betseg


1

Ruby , 25 lat 35 bajtów

EDYCJA : Naprawiono, aby zachować zgodność z nową zasadą wartości bezwzględnej.

->z{(z**(1i-z)).rect.max_by(&:abs)}

Wypróbuj online!

To tworzy anonimową funkcję.


1

TI-Basic, 19 16 bajtów

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

real(i imag(są dwubajtowymi tokenami.

Uruchom z 5+3i:prgmNAME( 5+3ibędąc argumentem, NAMEbędąc nazwą programu).


0

R, 38 bajtów

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

Funkcja anonimowa. Staje się (ewentualnie) Numer złożony z, bierze się do określonej siły, po czym zwraca maxz ReAl i Imczęści aginary.


0

Aksjomat, 60 bajtów

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

kod testu i wyniki; przestrzegam poprzedniej wersji pytania ...

(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 bajtów

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

Czytelny:

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

Objaśnienie: Postanowiono nie używać żadnych bibliotek złożonych.

z=x+jay=rmijatzja-z=(rmijat)(-x+ja(1-y))=r-xrja(1-y)mi-xjatmit(y-1)=r-xmit(y-1)mija((1-y)ln(r)-xt) (tak jak rja=mijaln(r))

Niech to będzie równe mmijaza gdzie

m=r-xmit(y-1)
za=(1-y)ln(r)-xt

Następnie (zja-z)=msałataza i (zja-z)=mgrzechza

Maksymalna wartość bezwzględna może być określona przez sałataza i grzechza warunki, przy czym są równe przy 12) (stąd test 2)do2)<1).

Jak wspomniano, podniesienie do złożonego wykładnika zależy od wyboru konkretnego cięcia gałęzi (np z=1 możliwe mijaπ lub mi3)jaπ - podniesienie tego do ja daje prawdziwą część mi-π lub mi-3)π odpowiednio), jednak właśnie użyłem konwencji t[0,2)π) jak na pytanie.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.