Número de valores entre la entrada y el siguiente cuadrado más alto


9

Dado un número cuadrado positivo como entrada. Muestra el número de valores entre la entrada y el siguiente cuadrado más alto.

Ejemplo

Entrada: 1

Salida: 2

Motivo: los números 2 y 3 están entre 1 y 4, el siguiente cuadrado más alto

Entrada: 4

Salida: 4

Motivo: los números 5, 6, 7, 8 están entre 4 y 9


1
¿Qué rango de valores de entrada tenemos que soportar?
Martin Ender

16
Creo que esto habría sido más interesante si la entrada no tuviera que ser un cuadrado.
xnor

1
@xnor Retrospectiva, definitivamente estoy de acuerdo.
Shayne03

Respuestas:


8

Jalea , 2 bytes

½Ḥ

Pruébalo en línea!

Puerto de mi respuesta de Mathematica (sacar raíz cuadrada, luego doble). Esto se limita a las entradas que se pueden representar exactamente como un número de punto flotante. Si eso es un problema, la solución de tres bytes ƽḤfunciona para cuadrados arbitrarios (que Dennis publicó primero pero luego eliminó).


1
Oh, me perdí toda la "entrada será un cuadrado" oops.
Jonathan Allan

1
@JonathanAllan Yo también. Extraña especificación IMO.
Trauma digital

¿Hay cuadrados que no se puedan representar exactamente en coma flotante?
dispersión

@Christian Claro, los números de coma flotante tienen un tamaño fijo, por lo que solo hay un número finito de valores que pueden representar.
Martin Ender

@MartinEnder En ese caso, dado el apoyo de Jelly para enteros de precisión arbitraria y la falta de un límite superior de las especificaciones, voto que debería admitir todas las entradas válidas.
dispersión

12

Brain-Flak , 38 , 22 bytes

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

Pruébalo en línea!

Estoy muy orgulloso de esta respuesta. OMI, uno de mis mejores campos de golf.

¿Como funciona?

Como muchos otros usuarios han señalado, la respuesta es simplemente sqrt (n) * 2 . Sin embargo, calcular la raíz cuadrada en el ataque cerebral no es muy trivial. Como sabemos que la entrada siempre será un cuadrado, podemos optimizar. Entonces escribimos un ciclo que resta

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

desde la entrada y realizar un seguimiento de cuántas veces se ejecuta. Una vez que llega a 0, la respuesta es simplemente el último número que restamos menos uno.

Originalmente, había empujado un contador a la otra pila. Sin embargo, podemos usar la pila principal en sí misma como contador, aumentando la altura de la pila.

#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
([]<>)

En el seudocódigo python-y, este es básicamente el siguiente 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
Literalmente, mi cerebro ha sido criticado por este, buen trabajo.
Magic Octopus Urn

9

Mathematica, 8 bytes

2Sqrt@#&

Pruébalo en línea! (Usando matemáticas).

La diferencia entre n 2 y (n + 1) 2 siempre es 2n + 1, pero solo queremos que los valores entre ellos excluyan ambos extremos, que es 2n .

Potencialmente, esto puede acortarse 2#^.5&según los requisitos de precisión.


1
¿Qué tal 2√ # &?
chyanog





2

Brain-Flak , 20 bytes

Grita a la increíble respuesta de DJMcMayhem (aunque un poco más de tiempo) aquí

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

Pruébalo en línea!

Explicación

Este código funciona contando desde el número cuadrado en incrementos impares. Como cada cuadrado es la suma de números impares consecutivos, alcanzará 0 en n 1/2 pasos. El truco aquí es que realmente hacemos un seguimiento de nuestros pasos en un número par y usamos una estática ()para compensarlo al número impar apropiado. Como la respuesta es 2n 1/2 , este número par será nuestra respuesta. Entonces, cuando llegamos a 0, eliminamos el cero y nuestra respuesta está allí en la pila.



1

Octava , 25 10 bytes

@(n)2*n^.5

Pruébalo en línea!

Ahorró 15 bytes utilizando el enfoque mucho mejor de Martin. La gama consta de 2*sqrt(n)elementos. La función hace exactamente eso: se multiplica 2con la raíz de la entrada.


1

Jalea , 7 bytes

½‘R²Ṫ_‘

Pruébalo en línea!

Explicación:

½‘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

Por cierto, la entrada siempre será un cuadrado en sí.
Martin Ender

1
@JonathanAllan Corregido
dispersión

@MartinEnder Leí totalmente el desafío, entonces ... con el interés de no copiar su respuesta (ya que ahora es obvio por qué funciona), dejaré esta respuesta.
dispersión







1

MATL ( 8 7 bytes)

Estoy seguro de que esto se puede reducir significativamente (editar: gracias Luis), pero una solución ingenua es:

X^QUG-q

Pruébalo en línea!

Explicación:

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
Puede reemplazar 2^ por U(y esto funcionó en la versión 20.1.1 , que era la más reciente en el momento del desafío, por lo que la respuesta sería elegible incluso según nuestro estándar anterior)
Luis Mendo

1
Gracias luis Me sorprende que mi enfoque ingenuo solo haya desperdiciado 1 personaje en relación con el maestro MATL. :)
DrQuarius



0

Alice , 10 bytes

2/*<ER
o@i

Pruébalo en línea!

Explicación

De nuevo, calcula 2 sqrt (n) . El diseño ahorra dos bytes sobre la solución estándar:

/o
\i@/2RE2*

Desglose del código, excluyendo la redirección de la 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 bytes

?sqr(:)*2

Ahorré un montón copiando el enfoque de @ MartinEnder.

No hay enlace TIO para QBIC, desafortunadamente.

Explicación

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



0

Retina , 21 bytes

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

Pruébalo en línea! Explicación: Funciona tomando la raíz cuadrada del número basado en el solucionador de números triangulares de @ MartinEnder. Después de hacer coincidir el número cuadrado, $1es la diferencia entre el número cuadrado y el número cuadrado anterior, en unario. Queremos la próxima diferencia, pero exclusiva, que es solo 1 más. Para lograr esto, contamos el número de cadenas nulas $1.





Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.