Escreva um código que, quando dado um número positivo como entrada, produz o maior divisor positivo de x menor ou igual à raiz quadrada de x .
Em outras palavras, encontre o maior tal que
(Existe maior ou igual a n, de modo que m vezes n é x )
Por exemplo, se a entrada fosse os divisores serão 1 , 2 , 3 , 4 , 6 e 12 . 1 , 2 e 3 multiplicam-se por números maiores para obter 12 , mas como 3 é o maior, retornamos 3 .
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo considerados melhores.
Casos de teste
(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)
Respostas:
Python3 ,
4947 bytesExplicação
l=x**.5//1
→ Atribual
o maior número inteiro menor que igual à raiz quadrada dex
while x%l:l-=1
→ Emboral
não se divida uniformementex
, diminual
.Editar% s
...//1
para salvar dois bytes. (Decimais estão bem! Obrigado @Rod)fonte
input
/ emprint
vez dedef
/return
, também pode substituirint(...)
por...//1
para salvar mais bytes, como você pode ver aqui #MATL , 7 bytes
Experimente online!
Para esta explicação, usaremos '12' como uma entrada de amostra. Explicação:
Isso funciona devido a muitas coincidências de sorte.
<n>)
indexaremosfonte
Z\J2/)
(J2/
ou equivalentemente.5j
significaend/2
quando usado como um índice)C (gcc)
-lm
, 35 bytesExperimente online!
fonte
sqrt
como uma função interna. Com-fno-builtin-sqrt
, o gcc assumeint sqrt(int)
e não passa adouble
. Em x86-64,double
é passado em um registro diferente de um número inteiro. Em 32 bits, umdouble
levaria 2 slots na pilha, então você também passaria lixo (ou um subnormal com o número inteiro como parte inferior da mantissa, se os 32 bits superiores fossem zero). Isso também é interrompido, a menos que você esteja fazendo uma compilação de depuração, porque se baseia no código-gen não otimizado padrão de avaliação de expressões do gcc no registro de valor de retorno.sqrt()
questão é diferente: eu estava curioso para saber como que conseguiu trabalho, porque o chamador tem que de alguma forma sabe converterint
paradouble
. Eu postei a resposta para isso como um comentário, caso alguém mais estivesse curioso. Efetivamente gcc temsqrt
(incluindo protótipo) como um built-in, caso contrário, este seria um fracasso por razões às vezes vemos no SO asm Qsi;f(n){for(i=0;++i<n/i||n%i;);}
é 31B e funciona comgcc -O
x86-64 (custando 2 ou 3 bytes a mais para a opção de linha de comando.) Usar em||
vez de|
faz com que o gcc deixe on/i
resultadoidiv
no EAX, o registro de valor de retorno ( godbolt.org/g/RJYeui ) O comportamento indefinido de++i
sem um ponto de sequência funciona. (O asm produzido é basicamente o mesmo que a minha resposta código de máquina x86 ). Com-O0
, gcc sempre parece deixari
em EAX, mas talvez possamos usar isso ...05AB1E , 5 bytes
Experimente online! ou como um conjunto de testes
Explicação
fonte
APL (Dyalog Unicode) ,
161412 bytesFico feliz por ter conseguido escrever alguma resposta no APL, pois apenas o aprendi. Muito, muito obrigado a Adám pela ajuda no golfe. Sugestões de golfe muito bem-vindas.Experimente online!
Para saber mais sobre o APL, dê uma olhada no The APL Orchard .
EDIT: -2 bytes para corrigir um problema com o meu código. Agradecemos a H.PWiz por apontar esse problema. -2 bytes de encurtar tudo novamente.
Ungolfing
fonte
Casca , 4 bytes
Experimente online!
Explicação
fonte
R ,
4533 bytesExperimente online!
Original:
Experimente online!
fonte
código da máquina x86 de 32 bits (IA32):
1816 byteschangelog: manipule o
n=1
caso de teste corretamente, salve 2 bytes e retorne no EAX.Conte até
n/i <= i
(ou seja, quando atingirmos o sqrt) e use o primeiro divisor exato depois disso.Uma versão de 64 bits pode ser chamada de C com a convenção de chamada do System V x86-64, como
int squarish_root_countup(int edi)
.nasm -felf32 -l/dev/stdout squarish-root.asm
:Experimente online! com um chamador asm que usa o primeiro byte de argv [1] como um número inteiro diretamente e usa o resultado como status de saída do processo.
fonte
Japonês
-h
,86 bytesTente
2 bytes salvos graças a Oliver
Explicação
fonte
Gelatina , 5 bytes
Experimente online!
fonte
JavaScript ES7,
3331 bytesExperimente online
fonte
Boneco de neve , 38 bytes
Experimente online!
fonte
dc , 24
Experimente online!
Explicação:
fonte
J,
2419 bytes-5 bytes graças à ideia GCD de Sherlock
Experimente online!
resposta original
Experimente online!
analisado
explicação
1 + i.@<.@%:
dá o intervalo1 .. floor(sqrt)
.(A) B
forma um gancho, com o intervalo acima passado como o argumento da direita]
para A e o número original como o argumento da esquerda[
. Portanto...] | [
fornece o restante de cada item no intervalo dividido no argumento original.0 = ] | [
fornece os divisores sem resto.] #~ ...
depois filtra o intervalo, deixando apenas esses.{:
fornece o último item da lista, ou seja, o maior.fonte
Gelatina , 5 bytes
Experimente online!
fonte
Haskell , 36 bytes
Experimente online!
Bem, esta é a minha resposta para este desafio. Isso usa uma compreensão específica da lista para encontrar a resposta. Em nossa compreensão de lista, escolhemosy da lista infinita z da lista ( y, z) são todos os pares ordenados, de modo que y≥ z .
[1..]
que é os números inteiros positivos, e escolhemos[1..y]
. Isso significa queEm seguida, selecionamos apenas os pares de modo quey⋅ z= x , o que significa que fazemos a lista de todos os pares de números que se multiplicam para x . Agora, já que nossa compreensão é baseada primeiro emy e depois z isso significa que nossos pares estão em ordem crescente de y , ou mais útil em ordem decrescente de z .
Então, para obter o maiorz nós pegamos o z pertencente ao primeiro elemento. Este é o nosso resultado.
fonte
QBasic (4.5), 52 bytes
fonte
Quarto (gforth) , 53 bytes
A maneira mais curta parece estar usando a pilha de ponto flutuante e
fsqrt
, a menor possível sem 62 bytes/mod
e usando e verificando se o quociente era maior que o divisor.Experimente online!
Explicação
Código Explicação
fonte
F #,
5549 bytesExperimente online!
Seq.findBack
: Retorna o último elemento para o qual a função especificada retornaTrue
. A função neste caso verifica se um número é um fator do valor.fonte
Flacidez cerebral , 144 bytes
Experimente online!
Não tenho certeza se essa resposta é muito boa. Sinto que pode haver uma boa maneira de resolver essa tarefa, mas não sou inteligente o suficiente.
Explicação
Tentei fazer uma visão detalhada da resposta, mas há tantas partes móveis que não foram muito esclarecedoras, então aqui está uma explicação do que o código faz.
A primeira parte importante é essa
Isso pega os dois números no topo da pilha e, se forem desiguais, incrementa o segundo, se forem iguais, incrementa o primeiro e substitui o segundo por zero. Se repetirmos esse código várias vezes, obteremos todos os pares( x , y) de tal modo que x ≥ y .
A próxima parte é a multiplicação, tirada com modificação do wiki . Essa multiplicação é especial porque preserva os valores existentes sem destruí-los. É assim:
Então, nós estamos multiplicando todos esses pares ordenados. Para cada resultado, verificamos se é igual à entrada. Nesse caso, encerramos e devolvemos o item menor do par.
fonte
Python 2 , 41 bytes
Experimente online!
fonte
Jelly, 6 bytes
Try it online!
fonte
Perl 5
-p
, 26 bytesTry it online!
fonte
Rust,
7170 bytesPre-uglified version
Edits
> 0
over!= 0
. (Thanks to @CatWizard)fonte
!=
be replaced with>
?Japt, 8 bytes
Try it online!
fonte
Triangularity, 49 bytes
Try it online!
fonte
Pyret, 93 bytes
You can try this online by copying it into the online Pyret editor!
The above evaluates to an anonymous function. When it is applied to an integer, it returns a result according to the specification.
fonte
Actually, 7 bytes
Based on my APL answer here. Golfing suggestions welcome! Try it online!
Ungolfing
fonte
A port of this Mathematica answer.
Jelly, 11 bytes
Try it online!
This (11 bytes) also works, and don't depend on
³
:Unfortunately
½Ḟ÷@Ċ÷@ʋÐL
(10 bytes) doesn't work. And apparentlyƬ
andÐĿ
is not exactly the same (when the link is dyadic)Method: (letn be the input)
fonte
Java 8,
6554 bytesPort of @hunteke's Python 3 answer.
Try it online.
Old 65 bytes answer:
Try it online.
Explanation:
fonte