Definições
- Um quadrado perfeito é um número inteiro que pode ser expresso como o quadrado de outro número inteiro. Por exemplo,
36
é um quadrado perfeito porque6^2 = 36
. - Um número sem quadrados é um número inteiro que não é divisível por nenhum quadrado perfeito, exceto por
1
. Por exemplo,10
é um número sem quadrados. No entanto,12
não é um número sem quadrados, porque12
é divisível por4
e4
é um quadrado perfeito.
Tarefa
Dado um número inteiro positivo n
, produza o maior número sem quadrados que divide n
.
Casos de teste
n output
1 1
2 2
3 3
4 2
5 5
6 6
7 7
8 2
9 3
10 10
11 11
12 6
13 13
14 14
15 15
16 2
17 17
18 6
19 19
20 10
21 21
22 22
23 23
24 6
25 5
26 26
27 3
28 14
29 29
30 30
31 31
32 2
33 33
34 34
35 35
36 6
37 37
38 38
39 39
40 10
41 41
42 42
43 43
44 22
45 15
46 46
47 47
48 6
49 7
50 10
Pontuação
Isso é código-golfe . A resposta mais curta em bytes vence.
Aplicam-se brechas padrão .
Referência
code-golf
math
arithmetic
number-theory
Freira Furada
fonte
fonte
Respostas:
05AB1E , 2 bytes
Experimente online!
Como funciona
fonte
Braquilog , 3 bytes
Experimente online!
Uma resposta muito original ...
Explicação
fonte
JavaScript (ES6),
55545046 bytesCitando OEIS :
a (n) é o menor divisor u de n de modo que n divide u ^ n
Implementação atualizada:
a (n) é o menor
divisor u de ninteiro positivo u, de modo que n divide u ^ nfonte
MATL ,
64 bytes2 bytes salvos com a ajuda de @LeakyNun
Experimente online!
Explicação
Considere entrada
48
.fonte
Gelatina , 4 bytes
Experimente online!
fonte
CJam , 8 bytes
Por que todas as operações neste programa precisam ter 2 bytes -_-
Experimente online!
fonte
Retina ,
363028 bytesEntrada e saída em unário .
Experimente online! (Inclui um cabeçalho e rodapé para conversão decimal <-> unária e para executar vários casos de teste de uma só vez.)
Explicação
A idéia é combinar a entrada como um quadrado vezes algum fator. O regex básico para corresponder a um quadrado usa uma referência direta para corresponder a somas de números inteiros ímpares consecutivos:
Como não queremos combinar quadrados perfeitos, mas números que são divisíveis por um quadrado, substituímos isso
1
por uma referência própria:Portanto, agora o grupo externo
1
será usado n vezes em que n 2 é o quadrado maior que divide a entrada e o grupo2
armazena o fator restante. O que queremos é dividir o número inteiro por n para remover o quadrado. O resultado pode ser expresso como o número de iterações do grupo de1
tempos do grupo2
, mas isso é um pouco complicado de fazer. O Retina$*
provavelmente será aprimorado em breve para receber um token sem caractere como argumento à direita; nesse caso, poderíamos simplesmente substituí-lo por$#1$*$2
, mas isso ainda não funciona.Em vez disso, decompomos os números ímpares de maneira diferente. Vamos voltar ao exemplo mais simples de combinar quadrados perfeitos com
(^1|11\1)+$
. Em vez de ter um contador\1
que é inicializado para 1 e incrementado por 2 em cada iteração, teremos dois contadores. Um é inicializado em 0 e um é inicializado em 1 , e ambos são incrementados em 1 em cada iteração. Então, decompusemos basicamente os números ímpares 2n + 1 em (n) + (n + 1) . O benefício é que acabaremos com n em um dos grupos. Na sua forma mais simples, fica assim:Onde
\2
é n e\3
é n + 1 . No entanto, podemos fazer isso com mais eficiência, observando que o n + 1 de uma iteração é igual ao n da próxima iteração, para que possamos economizar1
aqui:Agora só precisamos voltar a usar um fator inicial em vez de
1
combinar entradas divididas por um quadrado perfeito:Agora tudo o que precisamos fazer é substituir essa coisa inteira por
$3
no final, que armazena o fator inicial vezes o número de etapas, o que retira um fator do quadrado da entrada.Isso é feito repetidamente
+
no início do programa, para contabilizar entradas que contêm potências mais altas que quadrados.fonte
Oitava, 27 bytes
Abordagem semelhante às outras respostas. A diferença é: As funções têm nomes muito mais longos. Acredito que o código se explica realmente: toma o resultado
prod
dasunique
primosfactor
s de um número.fonte
Wolfram Language,
2928 bytes-1 Obrigado a @Martin Ender ♦
Explicação:
fonte
Times@@(#&@@@FactorInteger@#)&
Most
deixa como uma lista. Você precisaFirst
obter o valor.Python , 37 bytes
Experimente online!
O maior divisor de zero
n
é o menor númeror
com todosn
os fatores primos. Podemos verificar isso comor**n%n==0
, desde quer**n
façan
cópias de cada fator principal der
, e é divisíveln
apenas se cada um dosn
fatores primos estiver representado.O
1>>r**n%n
é equivalente aint(r**n%n==0)
. SeTrue
pode ser usada a saída 1, são 2 bytes mais curtos.fonte
Matemática , 40 bytes
Experimente online!
fonte
Times@@#&@@Transpose@FactorInteger@#&
economiza 3 bytes (#&@@
é um truque padrão para,[[1]]
e em casos como esse, geralmente é possível salvar alguns bytes extras entre parênteses).Thread
vez deTranspose
. No Mathematica, também existe um operador de 3 bytesTranspose
, mas não sei se o Mathics suporta isso.#&@@(1##&@@FactorInteger@#)&
evita a necessidade deTranspose
completamente. (1##&@@
está apenasTimes@@
disfarçado, o que funciona muito bem com os pares ordenados gerados porFactorInteger
; e'#&@@
estáFirst@
disfarçado.) #Alice , 4 bytes
Experimente online!
A entrada e a saída são fornecidas como o ponto de código de um caractere (funciona para todos os pontos de código Unicode válidos).
Explicação
Bem, Alice tem um built-in
D
cuja definição é "fatores principais com redução de redundância". Ou seja, desde que um valor seja divisível por alguns p 2 para um p primo , divida esse valor por p . Essa é exatamente a função necessária neste desafio. O resto é apenas entrada, saída e finalização do programa.A razão pela qual isso foi adicionado a Alice, na verdade, nada tem a ver com essa sequência inteira. Eu estava tentando manter um tema de associação de divisores com substrings e fatores primos com caracteres. E eu precisava de uma função que inclua "caracteres com desduplicação" (que é muito mais útil em geral, porque vamos tratar as strings como conjuntos, especialmente quando usadas em conjunto com os vários operadores de vários conjuntos).
fonte
Haskell , 31 bytes
Experimente online!
fonte
Pyke , 3 bytes
Experimente online!
fonte
Prolog (SWI) ,
8439 bytesExperimente online!
Adaptou a idéia da resposta Haskell de @ xnor para Prolog.
fonte
PHP, 70 bytes
Experimente online!
fonte
Pitão,
86 bytes* -2 bytes graças a @LeakyNun
Seria 3 se Pyth tivesse um built-in para produtos de listas ...
Tente!
fonte
*F+1{P
lugar.C,
6550 bytesObrigado a Ørjan Johansen por remover a necessidade
r
. Graças a este e outros truques sujos, consegui extrair 15 bytes!while
desapareceu e foi substituído por um||
indexador.<=
deveria ter sido o tempo<
todo.<=
ativado<
movendo o incremento para obtern%(++d*d)
(deve ser bem definido devido à precedência do operador).Código original:
fonte
r
e usandowhile(n%(d*d)<1)n/=d;
.++d*d
absolutamente não está bem definido pelos padrões C - é um caso clássico de comportamento explicitamente indefinido. Mas estamos indo por implementações aqui, de qualquer maneira.d++<n
que está bem definido, ainda não deveria funcionar? Eu acho que a versão antiga foi até o finaln+1
(inofensiva).d++<n
estar correto, por algum motivo eu não vi isso quando reescrevi o código.Axioma, 89 bytes
teste e resultados
essa é a função que não usa factor ()
mas são apenas 125 bytes
fonte
R, 52 bytes
lê
n
de stdin. Requer que agmp
biblioteca seja instalada (para que o TIO não funcione). Usa a mesma abordagem que muitas das respostas acima, mas trava em uma entrada de1
, porquefactorize(1)
retorna um vetor vazio de classebigz
, que travaunique
, infelizmente.fonte
Na verdade , 2 bytes
Experimente online!
Explicação:
fonte
Pari / GP , 28 bytes
Experimente online!
fonte
Pyt , 3 bytes
Explicação:
fonte