Problema:
Nella scelta della lingua, scrivi la funzione più breve che restituisce il piano della radice quadrata di un numero intero a 64 bit senza segno.
Casi test:
La tua funzione deve funzionare correttamente per tutti gli input, ma qui ci sono alcuni che aiutano a illustrare l'idea:
INPUT ⟶ OUTPUT
0 ⟶ 0
1 ⟶ 1
2 ⟶ 1
3 ⟶ 1
4 ⟶ 2
8 ⟶ 2
9 ⟶ 3
15 ⟶ 3
16 ⟶ 4
65535 ⟶ 255
65536 ⟶ 256
18446744073709551615 ⟶ 4294967295
Regole:
- Puoi nominare la tua funzione come preferisci. (Le funzioni senza nome, anonime o lambda vanno bene, purché siano in qualche modo richiamabili.)
- Il conteggio dei personaggi è ciò che conta di più in questa sfida, ma anche il runtime è importante. Sono sicuro che potresti scansionare iterativamente verso l'alto per la risposta in tempo O (√n) con un conteggio di caratteri molto piccolo, ma il tempo O (log (n)) sarebbe davvero migliore (cioè assumendo un valore di input di n, non una lunghezza di bit di n).
- Probabilmente vorrai implementare la funzione usando solo numeri interi e / o artitmetici booleani. Tuttavia, se vuoi davvero usare i calcoli in virgola mobile, allora va bene finché non chiami funzioni di libreria. Quindi, dire semplicemente
return (n>0)?(uint32_t)sqrtl(n):-1;
in C è off limits anche se produrrebbe il risultato corretto. Se stai usando aritmetica in virgola mobile, è possibile utilizzare*
,/
,+
,-
, e elevamento a potenza (ad esempio,**
o^
se si tratta di un built-in operatore in lingua di propria scelta, ma l'elevazione a potenza solo di poteri non inferiore a 1 ). Questa limitazione serve a prevenire "imbrogli" chiamandosqrt()
o una variante o aumentando un valore a ½ potenza. - Se si utilizzano operazioni in virgola mobile (vedere # 3), non è necessario che il tipo restituito sia intero; solo che il valore restituito è un numero intero, ad esempio, floor (sqrt (n)), ed essere in grado di contenere qualsiasi valore a 32 bit senza segno.
- Se si utilizza C / C ++, è possibile supporre l'esistenza di tipi interi senza segno a 64 e 32 bit, ad esempio
uint64_t
euint32_t
come definito instdint.h
. Altrimenti, assicurati solo che il tuo tipo intero sia in grado di contenere qualsiasi numero intero senza segno a 64 bit. - Se il tuo langauge non supporta numeri interi a 64 bit (ad esempio, Brainfuck apparentemente ha solo il supporto numeri interi a 8 bit), fai del tuo meglio con quello e indica la limitazione nel titolo della risposta. Detto questo, se riesci a capire come codificare un numero intero a 64 bit e ottenerne correttamente la radice quadrata usando l'aritmetica primitiva a 8 bit, allora più potenza per te!
- Divertiti e diventa creativo!
O(log_2 n) === O(log_4 n)
. log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2