Która duża liczba jest większa?

22

Wkład

Każda liczba całkowita a1, a2, a3, b1, b2, b3 w zakresie od 1 do 20.

Wydajność

True if a1^(a2^a3) > b1^(b2^b3) and False otherwise.

^ jest potęgowaniem w tym pytaniu.

Zasady

To jest golf golfowy. Twój kod musi zostać poprawnie zakończony w ciągu 10 sekund dla każdego ważnego wejścia na standardowym komputerze stacjonarnym.

Możesz wypisać dowolną wartość Prawda dla Prawdy i dowolną Falsey dla False.

Możesz przyjąć dowolną kolejność wprowadzania danych, o ile podana jest w odpowiedzi i zawsze taka sama.

W przypadku tego pytania Twój kod powinien zawsze być poprawny. Oznacza to, że nie powinno to zawieść z powodu niedokładności zmiennoprzecinkowych. Ze względu na ograniczony zakres danych wejściowych nie powinno to być zbyt trudne do osiągnięcia.

Przypadki testowe

3^(4^5) > 5^(4^3)
1^(2^3) < 3^(2^1)
3^(6^5) < 5^(20^3)
20^(20^20) > 20^(20^19)
20^(20^20) == 20^(20^20)
2^2^20 > 2^20^2
2^3^12 == 8^3^11
1^20^20 == 1^1^1
1^1^1 == 1^20^20
Anush
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
DJMcMayhem

Odpowiedzi:

16

Perl 6 , 31 29 bajtów

-2 bajty dzięki Grimy

*.log10* * ***>*.log10* * ***

Wypróbuj online!

Wierzcie lub nie, to nie jest esolang, nawet jeśli składa się głównie z gwiazdek. To używa formuły Arnaulda , z log10 zamiast ln.

Jo King
źródło
Uważam, że to się nie udaje 2^3^12 == 8^3^11.
Ørjan Johansen
@ ØrjanJohansen To powinno zostać naprawione teraz. daj mi znać, jeśli to się nie powiedzie
Jo King
@Grimy Thanks! Mógłbym przysiąc, że spróbowałem ...
Jo King
7

R , 39 bajtów

function(x,y,z)rank(log2(x)*(y^z))[1]<2

Wypróbuj online!

Zwraca FAŁSZ, gdy a > bi PRAWDA, jeślib < a

digEmAll
źródło
4
To jest złe dlaf(2,2,20,2,20,2)
H.PWiz
Naprawiono, używając twojej sugestii do odpowiedzi @Arnauld;)
digEmAll
Uważam, że to się nie udaje 2^3^12 == 8^3^11.
Ørjan Johansen
1
Nie działa zarówno na, jak 1^20^20 == 1^1^1i na 1^1^1 == 1^20^20.
Olivier Grégoire
6

05AB1E , 11 9 11 7 bajtów

.²Šm*`›

Port @Arnauld 's JavaScript i @digEmAll R' s podchodzi (widziałem je dodawać w tym samym czasie)
-2 bajty dzięki @Emigna
+2 bajtów jak bug-fix po @Arnauld 's i @digEmAll odpowiedzi jest zawarta błąd
-4 bajty teraz, gdy dozwolona jest inna kolejność wprowadzania po komentarzach @LuisMendo

Wejście jak [a1,b1], [a3,b3], [a2,b2]w trzech oddzielonych wejść.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

       # Take the logarithm with base 2 of the implicit [a1,b1]-input
  Š      # Triple-swap a,b,c to c,a,b with the implicit inputs
         #  The stack order is now: [log2(a1),log2(b1)], [a2,b2], [a3,b3]
   m     # Take the power, resulting in [a2**a3,b2**b3]
    *    # Multiply it with the log2-list, resulting in [log2(a1)*a2**a3,log2(b1)*b2**b3]
     `   # Push both values separated to the stack
        # And check if log2(a1)*a2**a3 is larger than log2(b1)*b2**b3
         # (after which the result is output implicitly)
Kevin Cruijssen
źródło
1
Drugą wersją może być εć.²š] P` ›
Emigna
@Emigna Ach miło, patrzyłem na podejście ć, ale całkowicie zapomniałem o użyciu š(nie jestem pewien, dlaczego teraz to widzę, haha). Dzięki!
Kevin Cruijssen
To wydaje się niepoprawne (ponieważ odpowiedź Arnaulda była niepoprawna do ostatniej poprawki).
Anush
@Anush Naprawiono i zapisano 4 bajty, biorąc teraz dane wejściowe w innej kolejności. :)
Kevin Cruijssen
5

Java (JDK) , 56 bajtów

(a,b,c,d,e,f)->a>Math.pow(d,Math.pow(e,f)/Math.pow(b,c))

Wypróbuj online!

Kredyty

Olivier Grégoire
źródło
Uważam, że to się nie udaje 2^3^12 == 8^3^11.
Ørjan Johansen
@ ØrjanJohansen Naprawiono
Olivier Grégoire
4

Wolfram Language (Mathematica) , 23 bajty

#2^#3Log@#>#5^#6Log@#4&

Wypróbuj online!

J42161217
źródło
To nie kończy się dla a1 = 20, a2 = 20, a3 = 20.
Anush
@Anush naprawiono ...
J42161217
1
Szkoda, jeśli chodzi o przepełnienie, w przeciwnym razie ##>0&@@(##^1&@@@#)&jest tylko 19 bajtów, a nawet bardziej zadziwiająco nie-matematyczne niż powyższy kod. (format infput {{a,b,c},{d,e,f}})
Greg Martin
3

J , 11 9 bajtów

>&(^.@^/)

Wypróbuj online!

Argumenty podane jako listy.

  • > czy lewy jest większy?
  • &(...) ale najpierw przekształć odpowiednio każdy argument:
  • ^.@^/zmniejszaj go od prawej do lewej z eksponencją. Ale ponieważ zwykłe potęgowanie ograniczy błąd nawet dla liczb rozszerzonych, bierzemy logi obu stron
Jonasz
źródło
3

Czysty , 44 bajty

import StdEnv
$a b c d e f=b^c/e^f>ln d/ln a

Wypróbuj online!

Wykorzystuje adaptację formuły Arnaulda.

Obrzydliwe
źródło
1
Uważam, że to się nie udaje 2^3^12 == 8^3^11.
Ørjan Johansen
@ ØrjanJohansen Naprawiono.
Οurous
3

Python 3 , 68 bajtów

lambda a,b,c,d,e,f:log(a,2)*(b**c)>log(d,2)*(e**f)
from math import*

Wypróbuj online!

Port odpowiedzi @Arnualds, ale zmieniono bazę logów.

Artemis wspiera Monikę
źródło
^jest wywoływany **w Pythonie. Po tej zmianie nie będzie można uruchomić wszystkich przypadków testowych OP.
Ørjan Johansen
Powinno być teraz wszystko naprawione, jednak 66 bajtów.
Artemis obsługuje Monikę
Uważam, że to się nie udaje 2^3^12 == 8^3^11.
Ørjan Johansen
@ ØrjanJohansen powinien zostać naprawiony
Artemis obsługuje Monikę
Wygląda jak to. Oprócz logarytmicznej zmiany podstawy dla poprawki, wygląda to podobnie do metody Arnaulda.
Ørjan Johansen
2

05AB1E , 13 bajtów

Wykorzystuje metodę z odpowiedzi JS Arnaulda

2F.²IIm*ˆ}¯`›

Wypróbuj online!

Emigna
źródło
To nie kończy się dla a1 = 20, a2 = 20, a3 = 20.
Anush
1
@Anush: Wydaje mi się, że zakończy się w mniej niż sekundę.
Emigna
trzeba ustawić wszystkie zmienne do 20. Patrz tio.run/##yy9OTMpM/f9f79Du3GK9Q6tzHzXs@v8/2shAB4xiuRBMAA
anuś
@Anush: Ach, miałeś na myśli b1=b2=b3=20, tak, to się nie kończy.
Emigna
1
@Anush: Zostało już naprawione. Dzięki za zwrócenie uwagi na mój błąd :)
Emigna,
2

Excel, 28 bajtów

=B1^C1*LOG(A1)>E1^F1*LOG(D1)

Implementacja Excel tej samej formuły, która już była używana.

Wernisch
źródło
Rozumiem, że Excel ma 15 cyfr dokładności, więc mogą wystąpić przypadki, w których zaokrąglenie spowoduje zwrócenie błędnej odpowiedzi.
Akumulacja
2

JavaScript, 51 bajtów

f=(a,b,c,h,i,j)=>(l=Math.log)(a)*b**c-l(h)*i**j>1e-8

Co zaskakujące, przypadki testowe nie wykazują błędów zmiennoprzecinkowych. Nie wiem, czy kiedykolwiek tak się stanie.

To po prostu porównuje logarytm liczb.

Tolerancja równości jest równa 1e-8.

Naruyoko
źródło
Witamy w PPCG! Niestety nie powiedzie się to w moim 2^3^12 == 8^3^11przypadku testowym. W rzeczywistości twoja odpowiedź jest bardzo podobna do oryginalnej odpowiedzi Arnaulda (niestety raczej skreślona niż naprawiona), która zainspirowała większość tych, którzy jej nie zdołali.
Ørjan Johansen
@ Ørjan Johansen Przeniesiono l(h)w prawo, a może teraz działa? Edycja: Czekaj, nie robi.
Naruyoko,
Dodano tolerancję równości 0.01.
Naruyoko,
Przeprowadziłem szybkie wyszukiwanie i tolerancja powinna zadziałać, ale jest to trochę za wysoka. Najwyższą wartością, którą musisz wykluczyć, jest (5.820766091346741e-11,(8.0,3.0,11,2.0,3.0,12))(mój przypadek testowy), a najniższą, którą musisz uwzględnić, jest (9.486076692724055e-4,(17.0,19.0,1,3.0,7.0,2))( 3^7^2 > 17^19^1.) Więc coś takiego 1e-8powinno być bezpiecznie w środku i tej samej długości bajtów.
Ørjan Johansen
@ Ørjan Johansen Ok, dzięki!
Naruyoko,
1

bc -l, 47 bajtów

l(read())*read()^read()>l(read())*read()^read()

z wejściem odczytanym z STDIN, jedna liczba całkowita na linię.

bcjest dość szybki; obsługuje a = b = c = d = e = f = 1 000 000 w nieco ponad sekundę na moim laptopie.


źródło
Uwielbiam odpowiedź BC! Teraz potrzebuję tylko jednego w bash :)
Anush
1

C ++ (gcc) , 86 bajtów

Dzięki @ ØrjanJohansen za wskazanie błędu w tym i @Ourous za naprawienie.

#import<cmath>
int a(int i[]){return pow(i[1],i[2])/pow(i[4],i[5])>log(i[3])/log(*i);}

Wypróbuj online!

zabdo>remifa

Neil A.
źródło
Formuła po zażyciu logdwa razy powinna być i[2]*log(i[1])+log(log(*i)). Np. Obecny nie powiedzie się 2^2^20 > 4^2^18.
Ørjan Johansen
@ ØrjanJohansen: good catch! Chyba muszę wtedy użyć tej powmetody.
Neil A.
Ten alternatywny ma 2^3^12 == 8^3^11problem, który wskazałem innym.
Ørjan Johansen
@ ØrjanJohansen: myślę, że wtedy używam twojej ustalonej formuły.
Neil A.
Och, obawiam się, że formuła jest tylko matematycznie poprawna. To wciąż ma problem błędu pływający punkt, tylko z innym przypadku 2^3^20 == 8^3^19. W rzeczywistości metoda mocy zawiedzie średnio mniej, prawdopodobnie dlatego, że ma tendencję do mnożenia przez potęgę dwóch. Inni zdołali sprawić, by działał, po prostu lekko go poprawiając.
Ørjan Johansen
1

Galaretka , 8 bajtów

l⁵×*/}>/

Wypróbuj online!

Na podstawie odpowiedzi JS Arnaulda . Oczekuje jako danych wejściowych [a1, b1]jako argument lewy i [[a2, b2], [a3, b3]]argument prawy.

Teraz zmieniono na używanie logu do bazy 10, która, o ile poprawnie obsługuje wszystkie możliwe dane wejściowe w określonym zakresie. Dzięki Ørjan Johansen za znalezienie oryginalnego problemu!

Nick Kennedy
źródło
1
Uważam, że to się nie udaje 2^3^12 == 8^3^11.
Ørjan Johansen
Twoje Python TIO jest niepoprawne. Masz 8*zamiast 8**. @ ØrjanJohansen jest rzeczywiście poprawny, 2**(3**12) > 8**(3**11)to jest falsey, ponieważ są one równe.
Kevin Cruijssen
@KevinCruijssen oops. Tak, są rzeczywiście równe. Powód, dla którego dwa pierwotne są oznaczone jako różne, dotyczy błędu zmiennoprzecinkowego.
Nick Kennedy
1

TI-BASIC, 27 31 bajtów

ln(Ans(1))Ans(2)^Ans(3)>Ans(5)^Ans(6)(ln(Ans(4

6Ans

Przykłady:

{3,4,5,5,4,3
   {3 4 5 5 4 3}
prgmCDGF16
               1
{20,20,20,20,20,19       ;these two lines go off-screen
{20 20 20 20 20 19}
prgmCDGF16
               1
{3,6,5,5,20,3
  {3 6 5 5 20 3}
prgmCDGF16
               0

Wyjaśnienie:

ln(Ans(1))Ans(2)^Ans(3)>Ans(5)^Ans(6)(ln(Ans(4   ;full program
                                                 ;elements of input denoted as:
                                                 ; {#1 #2 #3 #4 #5 #6}

ln(Ans(1))Ans(2)^Ans(3)                          ;calculate ln(#1)*(#2^#3)
                        Ans(5)^Ans(6)(ln(Ans(4   ;calculate (#5^#6)*ln(#4)
                       >                         ;is the first result greater than the
                                                 ; second result?
                                                 ; leave answer in "Ans"
                                                 ;implicit print of "Ans"

Uwaga: TI-BASIC jest językiem tokenizowanym. Liczba znaków nie jest równa liczbie bajtów.

Tau
źródło
Nie jestem zaznajomiony z TI-Basic, ale to wydaje się być log(x) × y × zraczej niż log(x) × y ^ z. Niekoniecznie doprowadzi to do takiej samej kolejności jak pierwotna nierówność.
Nick Kennedy,
@NickKennedy Tak, masz rację co do tego! Zaktualizuję post, aby to uwzględnić.
Tau
1

APL (NARS), znaki 36, bajty 72

{>/{(a b c)←⍵⋄a=1:¯1⋄(⍟⍟a)+c×⍟b}¨⍺⍵}

Tutaj poniżej funkcja z w (abc) z (xyt) zwróci 1, jeśli a ^ (b ^ c)> x ^ (y ^ t) w przeciwnym razie zwróci 0; test

  z←{>/{(a b c)←⍵⋄a=1:¯1⋄(⍟⍟a)+c×⍟b}¨⍺⍵}
  3 4 5 z 5 4 3
1
  1 2 3 z 3 2 1
0
  3 6 5 z 5 20 3
0
  20 20 20 z 20 20 19
1
  20 20 20 z 20 20 20
0
  2 2 20 z 2 20 2
1
  2 3 12 z 8 3 11
0
  1 20 20 z 1 1 1
0
  1 1 1 z 1 20 20
0
  1 4 5 z 2 1 1
0

{(abc) ← ⍵⋄a = 1: ¯1⋄ (⍟⍟a) + c × ⍟b} to funkcja p (a, b, c) = log (log (a)) + c * log (b ) = log (log (a ^ b ^ c)), a jeśli aa = a ^ (b ^ c) z a, b, c> 0 oraz a> 1 bb = x ^ (y ^ t) z x, y, t> 0 i x> 1 niż

aa>bb <=> log(log(a^b^c))>log(log(x^y^t))  <=>  p(a,b,c)>p(x,y,t)

Wystąpił problem z funkcją p: Gdy a ma wartość 1, dziennik log 1 nie istnieje, więc wybieram reprezentowanie go liczbą -1; gdy a = 2, więc dziennik a jest liczbą ujemną, ale> -1.

PS. Widział funkcję w swoim większym zestawie, w którym jest zdefiniowana

p(a,b,c)=log(log(a))+c*log(b)

pojawia się zakres dla a, b, cw 1..20 jest za mało ... Jeśli ktoś widzi, kiedy przepełnia się logarytmiczną podstawą 10, zakres dla a, b, c może wynosić 1..10000000 lub większy dla 64 bitów typ pływaka.

RosLuP
źródło