Su tarea es calcular la raíz cuadrada de un entero positivo sin utilizar ningún operador matemático para cambiar el número, como:
- Establecer una variable (ej. SquareRoot = 5)
- Suma (A + B)
- Resta (AB)
- Multiplicación (A * B)
- División (A / B)
- Raíces cuadradas, cúbicas, cuarta, etc.
- Exponentes
Los operadores de comparación (como <,>, ==, etc.) no se consideran "operadores matemáticos" a los fines de esta pregunta y se permiten siempre que no cambien el valor de una variable.
El único operador que puede usar es ++. Se establecen las siguientes excepciones:
- Si lo desea, puede inicializar una variable estableciéndola en 0.
- Si su idioma no incluye la sintaxis ++, puede usar una sintaxis equivalente, como foo + = 1 o foo = foo + 1
- La raíz cuadrada se debe calcular al menos a 6 dígitos más allá del decimal (el lugar de los cientos de miles) y se debe emitir como un número entero de los decimales (por ejemplo, si ingreso 2 podría salir como 14142135624 o 1414213 dependiendo del redondeo) . Redondear hacia arriba o hacia abajo no es importante.
Las funciones definidas por el usuario no están permitidas. Además, la simulación de funciones con goto tampoco está permitida.
¡Estoy interesado en ver lo que todos envían! ¡Feliz codificación!
ACLARACIÓN
Aclare que el número es un entero positivo. Puede hacer un código que haga cualquier número, pero no es necesario.
ACLARACIÓN # 2
Aclare que los operadores de comparación están permitidos.
ACLARACIÓN # 3
La suma, resta, multiplicación, división y funciones a los números de cambio no se permiten en absoluto , independientemente de que se guardan en una variable o no. Lamento que esto invalide un par de respuestas existentes, pero tenía la intención de definir este grupo de operadores con "cambiar el número" para evitar respuestas troll (por ejemplo, acabo de usar la función sqrt (), solo prohibió la suma, multiplicación, división y resta). Perdón por la confusion.
ACLARACIÓN # 4
Aclare que necesitamos al menos 5 dígitos. 10 dígitos hicieron que el código se ejecutara durante mucho tiempo.
fuente
while r*r<n*10e20:r+=1
, bastante trivial? Además, puede considerar reducir la salida requerida a 10 ^ 8 más o menos. Primero, porque 10 ^ 10 es mayor que 2 ^ 31, y segundo, porque tomará un tiempo incrementar ese valor.Respuestas:
Python 66
Salida
fuente
int(...*1e10)
, de lo contrario, muy agradable. Aunque, tomarabs
un valor complejo está más o menossqrt
disfrazado.*1e10
...Python, 184 caracteres
La siguiente solución de Python usa solo el operador de incremento y ningún otro operador aritmético. Sin embargo, con la precisión requerida (10 dígitos), se tarda un tiempo increíblemente largo en ejecutarse. Puede probarlo con menor precisión (3 dígitos) reduciéndolo
1e20
a1e6
.Sin golf:
fuente
Fortran 73
Podría tomar mucho tiempo para determinar realmente una respuesta para ciertos valores, pero funcionará con seguridad. Mientras uso
*
y-
, estos no están cambiando ningún valor , solo els=s+1
realmente cambia cualquier cosa.fuente
*
operador, que claramente no está permitido. ¿O de alguna manera estoy malentendido las restricciones dadas?*
operador para cambiar un número, simplemente no está guardando el resultado en ningún lado. Si el OP quería simplemente no permitir asignaciones (que no seans=s+1
), entonces ¿por qué mencionar todos los operadores aritméticos no permitidos?CJam, 26 bytes
Pruébalo en línea. Pegue el Código , escriba el número entero deseado en Entrada y haga clic en Ejecutar . Antes de hacerlo, sugiero cambiar
1e10
a1e4
aunque.El intérprete de Java maneja
1e6
con la entrada "2" en aproximadamente 15 segundos.1e20
requerirá una gran cantidad de RAM.Ejemplos
Antecedentes
Dado que no se nos permite a los operadores matemáticos cambiar los números, vamos a usar operadores setwise para cambiar las matrices.
El código comienza "multiplicando" la entrada ("i") por 1e20, pero sin ninguna multiplicación real. En cambio, empujamos una matriz que contiene enteros "i", una matriz que contiene enteros 1e20, tomamos su producto cartesiano y calculamos su longitud.
Luego, presionamos cero e incrementamos hasta que el producto del entero por sí mismo (calculado como arriba) ya no es menor que
i * 1e20
. Esto hace que la raíz cuadrada se redondee hacia arriba.Cómo funciona
fuente
Cobra - 62
Publicado antes de la tercera edición, ya no es válido.
No solo es corto, sino que debe estar libre de desbordamiento si
n < Decimal.maxValue
fuente
r/e*r/e
, que es claramente un++
operador no matemático ...Scala, 117
No termina en un período de tiempo razonable, incluso para 2 como entrada, pero funciona. Puede notar que lo estoy haciendo
_+_
, pero eso solo agrega 1, y Scala no tiene un++
operador de todos modos. Podría guardar dos caracteres reemplazando el Stream interno con List, pero luego se quedaría sin memoria. Tal como está escrito, creo que se escala solo en tiempo de procesamiento, no en uso de memoria.fuente
Haskell, 70 bytes
f
da la raíz cuadrada entera al encontrar el número más grande cuyo cuadrado es menor o igual que la entrada. La función de cuadratura ses i
incrementa en uno por cada elemento de una(i,i)
matriz. (Escrito en el teléfono, por lo que podría tener errores tipográficos).fuente
PHP, 124 bytes
Es un algoritmo exhaustivo. Simplemente intenta números hasta que el cuadrado de ese número sea mayor que el número de "meta" (que es la entrada multiplicada por 1E al
number of decimals
cuadrado (10.000 para un resultado de 2 decimales). Luego imprime ese último número.Ejecutar así (
-d
agregado solo por razones estéticas):No recomiendo probar esto con más de 3 decimales o un número superior a 10.
fuente