Escriba el código que cuando se le da un número positivo como entrada, genera el mayor divisor positivo de menor o igual que la raíz cuadrada de x .
En otras palabras, encuentre el n> 0 más grande de manera
(Existe mayor que o igual a tales que veces es )
Por ejemplo, si la entrada fuera los divisores son , , , , y . , y multiplican por números más grandes para obtener , pero es el más grande, por lo que devolvemos .
Este es el código de golf, por lo que las respuestas se puntuarán en bytes, con menos bytes que se consideren una mejor puntuación.
Casos de prueba
(1,1)
(2,1)
(3,1)
(4,2)
(5,1)
(6,2)
(7,1)
(8,2)
(9,3)
(10,2)
(11,1)
(12,3)
(13,1)
(14,2)
(15,3)
(16,4)
(17,1)
(18,3)
(19,1)
(20,4)
(21,3)
(22,2)
(23,1)
(24,4)
(25,5)
(26,2)
(27,3)
(28,4)
(29,1)
(30,5)
(31,1)
(32,4)
(33,3)
(34,2)
(35,5)
(36,6)
(37,1)
(38,2)
(39,3)
(40,5)
(41,1)
(42,6)
(43,1)
(44,4)
(45,5)
(46,2)
(47,1)
(48,6)
(49,7)
(50,5)
Respuestas:
Python3 ,
4947 bytesExplicación
l=x**.5//1
→ Asignel
el entero más grande menor que igual a la raíz cuadrada dex
while x%l:l-=1
→ Mientrasl
no se divide equitativamentex
, decrementel
.Ediciones
...//1
para guardar dos bytes. (¡Los decimales están bien! Gracias @ Rod)fuente
input
/print
lugardef
/return
, también puede reemplazarint(...)
con...//1
ahorrar más bytes como se puede ver aquíMATL , 7 bytes
Pruébalo en línea!
Para esta explicación, utilizaremos '12' como entrada de muestra. Explicación:
Esto funciona debido a muchas coincidencias afortunadas.
<n>)
indexaráfuente
Z\J2/)
(J2/
o.5j
significa equivalenteend/2
cuando se usa como índice)C (gcc)
-lm
, 35 bytesPruébalo en línea!
fuente
sqrt
como una función incorporada. Con-fno-builtin-sqrt
, gcc asumeint sqrt(int)
, y no pasa adouble
. En x86-64,double
se pasa en un registro diferente que un entero. En 32 bits, adouble
ocuparía 2 ranuras en la pila, por lo que también pasaría basura (o una subnormal con el entero como la parte inferior de la mantisa, si los 32 bits superiores fueran cero). Esto también se rompe a menos que esté realizando una compilación de depuración porque se basa en el código gen-gen no optimizado predeterminado de gcc para evaluar expresiones en el registro de valor de retorno.sqrt()
tema es diferente: tenía curiosidad cómo conseguido trabajo, porque la persona que llama tiene que saber de alguna manera para convertirint
adouble
. Publiqué la respuesta a eso como un comentario en caso de que alguien más tuviera curiosidad. Efectivamente, gcc tienesqrt
(incluido el prototipo) como incorporado, de lo contrario, esto fallaría por razones que a veces vemos en SO asm Qsi;f(n){for(i=0;++i<n/i||n%i;);}
es 31B y funciona congcc -O
x86-64 (cuesta 2 o 3 bytes más para la opción de línea de comando). En||
lugar de hacer|
que gcc deje eln/i
resultadoidiv
en EAX, el registro de valor de retorno ( godbolt.org/g/RJYeui ) El comportamiento indefinido++i
sin un punto de secuencia funciona. (El asm producido es básicamente el mismo que mi respuesta de código de máquina x86 .) Con-O0
, gcc siempre parece saliri
en EAX, pero tal vez podamos usar eso ...05AB1E , 5 bytes
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
APL (Dyalog Unicode) ,
161412 bytesMe alegro de haber podido escribir alguna respuesta en APL ya que solo la aprendí. Muchas, muchas gracias a Adám por su ayuda con el golf. Sugerencias de golf muy bienvenidas. Pruébalo en línea!
Para obtener más información sobre APL, eche un vistazo a The APL Orchard .
EDITAR: -2 bytes para solucionar un problema con mi código. Gracias a H.PWiz por señalar ese problema. -2 bytes de acortar todo de nuevo.
Ungolfing
fuente
Casco , 4 bytes
Pruébalo en línea!
Explicación
fuente
R ,
4533 bytesPruébalo en línea!
Original:
Pruébalo en línea!
fuente
Código de máquina x86 de 32 bits (IA32):
1816 bytesregistro de cambios: maneje el
n=1
caso de prueba correctamente, guarde 2 bytes y regrese en EAX.Cuente hasta
n/i <= i
(es decir, cuando alcancemos el sqrt), y use el primer divisor exacto después de eso.Una versión de 64 bits de esto es invocable desde C con la convención de llamadas del sistema V x86-64, como
int squarish_root_countup(int edi)
.nasm -felf32 -l/dev/stdout squarish-root.asm
:Pruébalo en línea! con una llamada asm que usa el primer byte de argv [1] como un entero directamente, y usa el resultado como estado de salida del proceso.
fuente
Japt
-h
,86 bytesIntentalo
2 bytes guardados gracias a Oliver
Explicación
fuente
Jalea , 5 bytes
Pruébalo en línea!
fuente
JavaScript ES7,
3331 bytesPruébalo en línea
fuente
Muñeco de nieve , 38 bytes
Pruébalo en línea!
fuente
dc , 24
Pruébalo en línea!
Explicación:
fuente
J,
2419 bytes-5 bytes gracias a la idea GCD de Sherlock
Pruébalo en línea!
respuesta original
Pruébalo en línea!
analizado
explicación
1 + i.@<.@%:
da el rango1 .. floor(sqrt)
.(A) B
forma un gancho, con el rango anterior pasado como el argumento derecho]
a A y el número original pasado como su argumento izquierdo[
. Así...] | [
da el resto de cada elemento en el rango dividido en el argumento original.0 = ] | [
le da a los divisores sin resto.] #~ ...
luego filtra el rango, dejando solo esos.{:
da el último elemento de la lista, es decir, el más grande.fuente
Jalea , 5 bytes
Pruébalo en línea!
fuente
Haskell , 36 bytes
Pruébalo en línea!
[1..]
[1..y]
fuente
QBasic (4.5), 52 bytes
fuente
Adelante (gforth) , 53 bytes
La forma más corta parece estar usando la pila de punto flotante y
fsqrt
, la más corta que pude obtener sin ella fue 62 bytes usando/mod
y comprobando si el cociente era mayor que el divisor.Pruébalo en línea!
Explicación
Explicación del código
fuente
F #,
5549 bytesPruébalo en línea!
Seq.findBack
: Devuelve el último elemento para el que devuelve la función dadaTrue
. La función en este caso verifica si un número es un factor del valor.fuente
Brain-Flak , 144 bytes
Pruébalo en línea!
No estoy realmente seguro de que esta respuesta sea muy buena. Siento que puede haber una buena manera de resolver esta tarea, pero no soy lo suficientemente inteligente.
Explicación
Traté de hacer una vista ampliada de la respuesta, pero hay tantas partes móviles que no fue muy esclarecedora, así que aquí hay una explicación de lo que hace el código.
El primer bit importante es este
La siguiente parte es la multiplicación, tomada con modificación de la wiki . Esta multiplicación es especial porque conserva los valores existentes sin destruirlos. Va como:
Entonces estamos multiplicando todos estos pares ordenados. Para cada resultado verificamos si es igual a la entrada. Si es así, terminamos y devolvemos el artículo más pequeño en el par.
fuente
Python 2 , 41 bytes
Pruébalo en línea!
fuente
Jalea , 6 bytes
Pruébalo en línea!
fuente
Perl 5
-p
, 26 bytesPruébalo en línea!
fuente
Óxido,
7170 bytesVersión pre-uglified
Ediciones
> 0
más!= 0
. (Gracias a @CatWizard)fuente
!=
puede reemplazar con>
?Japt , 8 bytes
Pruébalo en línea!
fuente
Triangularidad , 49 bytes.
Pruébalo en línea!
fuente
Pyret , 93 bytes
¡Puede probar esto en línea copiándolo en el editor de Pyret en línea !
Lo anterior se evalúa como una función anónima. Cuando se aplica a un entero, devuelve un resultado de acuerdo con la especificación.
fuente
En realidad , 7 bytes
Basado en mi respuesta APL aquí . Sugerencias de golf bienvenidas! Pruébalo en línea!
Ungolfing
fuente
Un puerto de esta respuesta de Mathematica .
Jalea , 11 bytes
Pruébalo en línea!
Esto (11 bytes) también funciona y no depende de
³
:Lamentablemente
½Ḟ÷@Ċ÷@ʋÐL
(10 bytes) no funciona. Y aparentementeƬ
yÐĿ
no es exactamente lo mismo (cuando el enlace es diádico)Método: (letnorte ser la entrada)
fuente
Java 8,
6554 bytesPort of @hunteke 's Python 3 respuesta .
Pruébalo en línea.
Antigua respuesta de 65 bytes:
Pruébalo en línea.
Explicación:
fuente