Quale grande numero è più grande?


22

Ingresso

Numeri interi a1, a2, a3, b1, b2, b3 ciascuno nell'intervallo da 1 a 20.

Produzione

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

^ è esponenziazione in questa domanda.

Regole

Questo è code-golf. Il codice deve terminare correttamente entro 10 secondi per qualsiasi input valido su un PC desktop standard.

Puoi produrre qualsiasi cosa Verità per vero e qualsiasi cosa Falsey per falso.

Puoi assumere qualsiasi ordine di input che desideri purché sia ​​specificato nella risposta e sempre lo stesso.

Per questa domanda il tuo codice dovrebbe essere sempre corretto. Cioè non dovrebbe fallire a causa di imprecisioni in virgola mobile. A causa della gamma limitata dell'input, questo non dovrebbe essere troppo difficile da ottenere.

Casi test

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

I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
DJMcMayhem

Risposte:


16

Perl 6 , 31 29 byte

-2 byte grazie a Grimy

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

Provalo online!

Che ci crediate o no, questo non è un esolang, anche se è composto principalmente da asterischi. Questo utilizza la formula di Arnauld , con log10 anziché ln.


Credo che questo fallisca 2^3^12 == 8^3^11.
Ørjan Johansen,

@ ØrjanJohansen Ora dovrebbe essere risolto. fatemi sapere se fallisce per qualcos'altro
Jo King il


@Grimy Grazie! Avrei potuto giurare di averlo provato ...
Jo King,


6

05AB1E , 11 9 11 7 byte

.²Šm*`›

Porto di @Arnauld 's JavaScript e @digEmAll ' s R si avvicina (li ho visti postare intorno allo stesso tempo)
-2 byte grazie alla @Emigna
+2 byte come bug-fix dopo @Arnauld 's e @digEmAll risposte' s contenevano un errore di
-4 byte ora che è consentito un diverso ordine di input dopo i commenti di @LuisMendo

Input come [a1,b1], [a3,b3], [a2,b2]come tre ingressi separati.

Provalo online o verifica tutti i casi di test .

Spiegazione:

       # 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)

1
La tua seconda versione può essere εć.²š] P` ›
Emigna il

@Emigna Ah bello, stavo guardando un approccio con ć, ma ho completamente dimenticato di usare š(non so perché ora che lo vedo, ahah). Grazie!
Kevin Cruijssen,

Questo sembra essere errato (perché la risposta di Arnauld era errata fino alla recente correzione).
Anush

@Anush Fisso e 4 byte salvati prendendo gli input in un ordine diverso ora. :)
Kevin Cruijssen il



3

J , 11 9 byte

>&(^.@^/)

Provalo online!

Argomenti forniti come elenchi.

  • > quello di sinistra è più grande?
  • &(...) ma prima, trasforma ogni argomento in questo modo:
  • ^.@^/ridurlo da destra a sinistra con esponenzione. Ma poiché l'espiazione ordinaria limiterà l'errore anche per i numeri estesi, prendiamo i registri di entrambe le parti


3

Python 3 , 68 byte

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

Provalo online!

La porta di @Arnualds risponde, ma con la base per il registro modificata.


^viene chiamato **in Python. E con ciò modificato, non sarà possibile eseguire tutti i casi di test del PO.
Ørjan Johansen,

Dovrebbe essere tutto risolto ora, 66 byte però.
Artemis supporta Monica il

Credo che questo fallisca 2^3^12 == 8^3^11.
Ørjan Johansen,

@ ØrjanJohansen dovrebbe essere risolto
Artemis supporta Monica il

Sembra così. A parte la modifica della base logaritmica per la correzione, questo sembra il metodo di Arnauld.
Ørjan Johansen,

2

05AB1E , 13 byte

Utilizza il metodo dalla risposta JS di Arnauld

2F.²IIm*ˆ}¯`›

Provalo online!


Questo non termina per a1 = 20, a2 = 20, a3 = 20.
Anush,

1
@Anush: sembra terminare in meno di un secondo per me.
Emigna,

devi impostare tutte le variabili su 20. Vedi tio.run/##yy9OTMpM/f9f79Du3GK9Q6tzHzXs@v8/2shAB4xiuRBMAA
Anush

@Anush: Ah, volevi dire b1=b2=b3=20, sì, questo non si interrompe.
Emigna,

1
@Anush: ora è stato risolto. Grazie per aver segnalato il mio errore :)
Emigna il

2

Excel, 28 byte

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

Implementazione Excel della stessa formula già utilizzata.


La mia comprensione è che Excel ha 15 cifre di precisione, quindi potrebbero esserci casi in cui l'arrotondamento comporta la restituzione della risposta errata.
Accumulo il

2

JavaScript, 51 byte

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

Sorprendentemente, i casi di test non mostrano alcun errore in virgola mobile. Non so se lo farà mai a queste dimensioni.

Questo confronta solo il logaritmo dei numeri.

La tolleranza dell'uguaglianza è uguale a 1e-8.


Benvenuti in PPCG! Purtroppo questo non riesce con il mio 2^3^12 == 8^3^11caso di prova. In effetti la tua risposta è molto simile alla risposta originale di Arnauld (purtroppo cancellata piuttosto che risolta) che ha ispirato la maggior parte di coloro che la hanno fallita.
Ørjan Johansen,

@ Ørjan Johansen Spostato l(h)a destra, e forse ora funziona? Modifica: aspetta, non lo fa.
Naruyoko,

Aggiunta tolleranza di uguaglianza 0.01.
Naruyoko,

Ho fatto una ricerca veloce e una tolleranza dovrebbe funzionare, ma questo è un po 'troppo alto. Il massimo che devi escludere è (5.820766091346741e-11,(8.0,3.0,11,2.0,3.0,12))(il mio caso di test) e il minimo che devi includere è (9.486076692724055e-4,(17.0,19.0,1,3.0,7.0,2))( 3^7^2 > 17^19^1.) Quindi qualcosa di simile 1e-8dovrebbe essere al sicuro nel mezzo e con la stessa lunghezza di byte.
Ørjan Johansen,

@ Ørjan Johansen Ok, grazie!
Naruyoko,

1

bc -l, 47 byte

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

con l'input letto da STDIN, un numero intero per riga.

bcè abbastanza veloce; gestisce a = b = c = d = e = f = 1.000.000 in poco più di un secondo sul mio laptop.


Adoro una risposta in bc! Ho solo bisogno di uno a Bash ora :)
Anush il

1

C ++ (gcc) , 86 byte

Grazie a @ ØrjanJohansen per aver segnalato un difetto in questo e @Ourous per averci dato una soluzione.

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

Provalo online!

abc>def


La formula dopo aver preso logdue volte dovrebbe essere i[2]*log(i[1])+log(log(*i)). Ad esempio, quello attuale fallirà 2^2^20 > 4^2^18.
Ørjan Johansen,

@ ØrjanJohansen: buona cattura! Immagino che dovrei usare il powmetodo allora.
Neil A.

Quello alternativo ha il 2^3^12 == 8^3^11problema che ho indicato per gli altri.
Ørjan Johansen,

@ ØrjanJohansen: beh, immagino di usare la tua formula fissa allora.
Neil A.

Oh, temo che la formula sia solo matematicamente corretta. Ha ancora un problema floating point errore, solo con un caso diverso, 2^3^20 == 8^3^19. In effetti, in media il metodo di alimentazione fallisce per meno, probabilmente perché tende a moltiplicarsi esattamente per potenze di due. Altri sono riusciti a farlo funzionare semplicemente modificandolo leggermente.
Ørjan Johansen,

1

Gelatina , 8 byte

l⁵×*/}>/

Provalo online!

Basato sulla risposta JS di Arnauld . Si aspetta come input [a1, b1]come argomento di sinistra e [[a2, b2], [a3, b3]]come argomento di destra.

Ora modificato per utilizzare il registro sulla base 10 che, per quanto possibile, gestisce correttamente tutti gli input possibili nell'intervallo specificato. Grazie a Ørjan Johansen per aver trovato il problema originale!


1
Credo che questo fallisca 2^3^12 == 8^3^11.
Ørjan Johansen,

Il tuo Python TIO non è corretto .. 8*Invece di 8**. @ ØrjanJohansen ha davvero ragione che 2**(3**12) > 8**(3**11)è falsità, poiché sono uguali.
Kevin Cruijssen,

@KevinCruijssen oops. Sì, sono davvero uguali. Il motivo per cui i due originali sono contrassegnati come diversi si riferisce all'errore in virgola mobile.
Nick Kennedy,

1

TI-BASIC, 27 31 byte

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

6Ans

Esempi:

{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

Spiegazione:

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"

Nota: TI-BASIC è un linguaggio tokenizzato. Il conteggio dei caratteri non equivale al conteggio dei byte.


Non ho molta familiarità con TI-BASIC, ma questo sembra essere log(x) × y × zpiuttosto che log(x) × y ^ z. Ciò non porterà necessariamente allo stesso ordinamento della disuguaglianza originale.
Nick Kennedy,

@NickKennedy Sì, hai ragione! Aggiornerò il post per tener conto di questo.
Tau,

1

APL (NARS), caratteri 36, byte 72

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

Di seguito la funzione z in (abc) z (xyt) restituisce 1 se a ^ (b ^ c)> x ^ (y ^ t) altrimenti restituisce 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} è la funzione p (a, b, c) = log (log (a)) + c * log (b ) = log (log (a ^ b ^ c)) e se aa = a ^ (b ^ c) con a, b, c> 0 e a> 1 bb = x ^ (y ^ t) con x, y, t> 0 e x> 1 di

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

C'è un problema con la funzione p: quando a è 1, il registro 1 non esiste, quindi scelgo di rappresentarlo con il numero -1; quando a = 2, il registro log a è un numero negativo ma> -1.

PS. Ho visto la funzione nel suo set più grande in cui è definita

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

appare l'intervallo per a, b, c in 1..20 è troppo pochi ... Se si vede quando trabocca con la base di registro 10, l'intervallo per a, b, c potrebbe essere 1..10000000 o maggiore per un 64 bit tipo di galleggiante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.