Numero di valori tra input e successivo quadrato più alto


9

Dato un numero quadrato positivo come input. Emette il numero di valori tra l'ingresso e il quadrato più alto successivo.

Esempio

Ingresso: 1

Uscita: 2

Motivo: i numeri 2 e 3 sono compresi tra 1 e 4, il quadrato più alto successivo

Ingresso: 4

Uscita: 4

Motivo: i numeri 5, 6, 7, 8 sono compresi tra 4 e 9


1
Quale gamma di valori di input dobbiamo supportare?
Martin Ender,

16
Penso che questo sarebbe stato più interessante se l'input non dovesse essere un quadrato.
xnor

1
@xnor Hindsight, sono assolutamente d'accordo.
Shayne03,

Risposte:


8

Gelatina , 2 byte

½Ḥ

Provalo online!

Risposta Port of my Mathematica (prendi radice quadrata, quindi raddoppia). Questo è limitato agli input che possono essere rappresentati esattamente come un numero in virgola mobile. Se questo è un problema, la soluzione a tre byte ƽḤfunziona per i quadrati arbitrari (che Dennis ha pubblicato per primi ma poi ha eliminato).


1
Oh, ho perso l'intero "input sarà un quadrato" oops.
Jonathan Allan

1
@JonathanAllan Anche a me. Strane specifiche IMO.
Trauma digitale,

Ci sono dei quadrati che non possono essere rappresentati esattamente in virgola mobile?
disperde il

@Christian Certo, i numeri in virgola mobile hanno dimensioni fisse, quindi c'è solo un numero finito di valori che possono rappresentare.
Martin Ender,

@MartinEnder In quel caso, dato il supporto di Jelly per numeri interi di precisione arbitraria e la mancanza della specifica di un limite superiore, voto che dovrebbe supportare tutti gli input validi.
disperde il

12

Brain-Flak , 38 , 22 byte

{([[]](({})))}{}([]<>)

Provalo online!

Sono molto orgoglioso di questa risposta. IMO, uno dei miei migliori golf con scaglie di cervello.

Come funziona?

Come molti altri utenti hanno sottolineato, la risposta è semplicemente sqrt (n) * 2 . Tuttavia, il calcolo della radice quadrata nel cervello-flak è molto non banale. Poiché sappiamo che l'input sarà sempre un quadrato, possiamo ottimizzare. Quindi scriviamo un ciclo che sottrae

1, 3, 5, 7, 9...

dall'input e traccia quante volte viene eseguito. Una volta che ha raggiunto 0, la risposta è semplicemente l'ultimo numero che abbiamo sottratto meno uno.

Inizialmente, avevo spinto un segnalino sull'altro stack. Tuttavia, possiamo usare lo stack principale stesso come contatore, aumentando l'altezza dello stack.

#While TOS (top of stack, e.g. input) != 0:
{

    #Push:
    (

      #The negative of the height of the stack (since we're subtracting)
      [[]]

      #Plus the TOS pushed twice. This is like incrementing a counter by two
      (({}))
    )

#Endwhile
}

#Pop one value off the main stack (or in other words, decrement our stack-counter)
{}

#And push the height of the stack onto the alternate stack
([]<>)

In python-y pseudocode, questo è fondamentalmente il seguente algoritmo:

l = [input]
while l[-1] != 0:   #While the back of the list is nonzero
    old_len = len(l)
    l.append(l[-1])
    l.append(l[-1] - old_len)

l.pop()

print(len(l))

2
Il mio cervello è stato letteralmente distrutto da questo, bel lavoro.
Magic Octopus Urn,

9

Mathematica, 8 byte

2Sqrt@#&

Provalo online!(Usando la matematica.)

La differenza tra n 2 e (n + 1) 2 è sempre 2n + 1 ma vogliamo solo i valori tra di loro escludendo entrambe le estremità, che è 2n .

Questo può essere potenzialmente abbreviato in 2#^.5&base ai requisiti di precisione.


1
Che ne dici di 2√ # &?
chyanog,





2

Brain-Flak , 20 byte

Grida alla sorprendente risposta di DJMcMayhem (albiet leggermente più lunga) qui

{({}()[({}()())])}{}

Provalo online!

Spiegazione

Questo codice funziona contando dal numero quadrato con incrementi dispari. Poiché ogni quadrato è la somma di numeri dispari consecutivi, questo raggiungerà 0 con incrementi di n 1/2 . Il trucco è in realtà tenere traccia dei nostri passi in un ancora numero e utilizziamo una statica ()per compensare al numero dispari appropriata. Poiché la risposta è 2n 1/2 , questo numero pari sarà la nostra risposta. Quindi quando arriviamo a 0 rimuoviamo lo zero e la nostra risposta è lì in pila.



1

Ottava , 25 10 byte

@(n)2*n^.5

Provalo online!

Hai salvato 15 byte usando l'approccio molto migliore di Martin. La gamma è composta da 2*sqrt(n)elementi. La funzione fa esattamente questo: si moltiplica 2per la radice dell'input.


1

Gelatina , 7 byte

½‘R²Ṫ_‘

Provalo online!

Spiegazione:

½‘R²Ṫ_    Input:              40
½         Square root         6.32455532...
 ‘        Increment           7.32455532...
  R       Range               [1, 2, 3, 4, 5, 6, 7]
   ²      Square              [1, 4, 9, 16, 25, 36, 49]
    Ṫ     Tail                49
     _‘   Subtract input+1    8

A proposito, l'input sarà sempre un quadrato stesso.
Martin Ender,

1
@JonathanAllan Risolto
scatter il

@MartinEnder Ho letto male la sfida, quindi ... nell'interesse di non copiare la tua risposta (dal momento che è ovvio ora perché funziona) Lascerò questa.
disperde il




1

TI-Basic, 3 byte

2√(Ans

Approccio più semplice ...



1

Aggiungi ++ , 22 20 byte

+?
_
S
+1
^2
-1
-G
O

Provalo online!

Vuoi sapere come funziona? Bene, non temere! Sono qui per educarti!

+?   Add the input to x (the accumulator)
_    Store the input in the input list
S    Square root
+1   Add 1
^2   Square
-1   Subtract 1
-G   Subtract the input
O    Output as number

Avevo la stessa logica per la mia risposta QBIC originale, ma c'è un modo più breve .
steenbergh,

1

MATL ( 8 7 byte)

Sono sicuro che questo può essere ridotto in modo significativo (modifica: grazie Luis), ma una soluzione ingenua è:

X^QUG-q

Provalo online!

Spiegazione:

X^   % Take the square root of the input (an integer)
QU  % Square the next integer to find the next square
G-   % Subtract the input to find the difference
q    % Decrement solution by 1 to count only "in between" values.

1
Puoi sostituirlo 2^ con U(e questo ha funzionato nella versione 20.1.1 , che era la più recente al momento della sfida, quindi la risposta sarebbe ammissibile anche dal nostro vecchio standard)
Luis Mendo,

1
Grazie Luis! Sono sorpreso che il mio approccio ingenuo abbia sprecato solo 1 personaggio rispetto al maestro MATL. :)
DrQuarius,



0

Alice , 10 byte

2/*<ER
o@i

Provalo online!

Spiegazione

Ancora una volta, calcola 2 sqrt (n) . Il layout salva due byte rispetto alla soluzione standard:

/o
\i@/2RE2*

Analisi del codice, escluso il reindirizzamento dell'IP:

2    Push 2 for later.
i    Read all input.
i    Try reading more input, pushes "".
2    Push 2.
R    Negate to get -2.
E    Implicitly discard the empty string and convert the input to an integer.
     Then take the square root of the input. E is usually exponentiation, but
     negative exponents are fairly useless in a language that only understands
     integers, so negative exponents are interpreted as roots instead.
*    Multiply the square root by 2.
o    Output the result.
@    Terminate the program.


0

QBIC , 19 9 byte

?sqr(:)*2

Ho salvato un sacco copiando l'approccio di @ MartinEnder.

Nessun collegamento TIO per QBIC, sfortunatamente.

Spiegazione

?          PRINT
 sqr( )    The square root of
     :     the input
        *2 doubled



0

Retina , 21 byte

.+
$*
(^1?|11\1)+
$1

Provalo online! Spiegazione: Funziona prendendo la radice quadrata del numero in base al risolutore di numeri triangolare di @ MartinEnder. Dopo aver abbinato il numero quadrato, $1la differenza tra il numero quadrato e il numero quadrato precedente, in unario. Vogliamo la differenza successiva, ma esclusiva, che è solo 1 in più. Per raggiungere questo obiettivo, contiamo il numero di stringhe null in $1.



0

Java (OpenJDK 9) / JShell, 17 byte

n->2*Math.sqrt(n)

Provalo online!

Nota: ciò richiederebbe l'accesso import java.util.function.*;a IntFunction<T>Java 8 o Java 9, ma il java.util.functionpacchetto viene importato per impostazione predefinita in JShell.



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.