Desafio
Parece que, embora tenhamos muitos desafios que trabalham com números quadrados ou de outras formas, não temos um que simplesmente pergunte:
Dado um número inteiro n
(onde n>=0
) como entrada, retorne um valor verdadeiro se n
for um quadrado perfeito ou um valor falsey se não.
Regras
- Você pode receber informações por qualquer meio razoável e conveniente, desde que seja permitido pelas regras de E / S padrão .
- Você não precisa manipular entradas maiores do que o idioma escolhido pode manipular nativamente nem o que levaria a imprecisões de ponto flutuante.
- A saída deve ser um dos dois valores consistentes de verdade / falsey (por exemplo,
true
oufalse
,1
ou0
) - verdade se a entrada for um quadrado perfeito, falsey se não for. - Isso é código-golfe, e a menor contagem de bytes ganha.
Casos de teste
Input: 0
Output: true
Input: 1
Output: true
Input: 64
Output: true
Input: 88
Output: false
Input: 2147483647
Output: false
code-golf
math
number
decision-problem
Shaggy
fonte
fonte
18014398509481982
(2**54-2
), que é representável com um duplo, e causa respostas que costumamsqrt
falhar.2**54-2
é ainda maior do que a dupla pode lidar com segurança, pelo menos em JavaScript18014398509481982 > 9007199254740991
2**54-2
em um console JS e compare o que você obtém18014398509481982
(o valor exato). JS gera o valor exato, portanto2**54-2
é representável com um duplo. Se isso ainda não o convencer, pegue os dados binários0100001101001111111111111111111111111111111111111111111111111111
, interprete-os como um flutuador de precisão dupla IEEE-754 e veja qual valor você obtém.Respostas:
Neim , 2 bytes
Explicação:
Quando digo 'infinito', quero dizer até atingirmos o valor máximo de longos (2 ^ 63-1). No entanto, Neim está (lentamente) fazendo a transição para BigIntegers teoricamente infinitamente grandes.
Tente!
fonte
Geléia , 2 bytes
Experimente online!
fonte
TI-Basic, 4 bytes
Simplesmente verifica se a raiz quadrada é um número inteiro procurando uma parte fracionária / decimal diferente de zero.
fonte
C #, 27 bytes
Uma maneira mais correta / precisa de fazer isso seria:
fonte
...<int>==0
é que...!<int>
eu achoJavaScript (ES6), 13 bytes
Retorna true se a raiz quadrada de n for um número inteiro.
Snippet:
fonte
dc, 9
Saídas 1 para verdade e 0 para falsey.
Experimente online .
dc
O^
comando de exponenciação da nota fornece 0 0 = 1 e 0 n = 0, onde n> 0.fonte
dc
maneira tão engenhosa.Retina , 18 bytes
Experimente online! Desavergonhadamente adaptado da resposta de @ MartinEnder para Este número é triangular? mas com a conversão básica incluída a um custo de 6 bytes.
Observe que esse número é triangular? por algum motivo inexplicável necessário para suportar zero como um número triangular, parte da adaptação foi adicionar a
?
para tornar o 1 inicial opcional, permitindo que o grupo correspondesse à sequência vazia e, portanto, uma entrada zero. No entanto, depois de corresponder à string vazia, o+
operador para de repetir, para evitar o loop infinito que aconteceria se continuasse correspondendo avidamente à string vazia (afinal,^1?
certamente continuaria correspondendo). Isso significa que ele nem tenta corresponder à outra alternativa do grupo, evitando a correspondência de 2, 6, 12 etc. Como aponta @MartinEnder, uma maneira mais simples de evitar isso, enquanto ainda corresponde à sequência vazia, é: ancorar o jogo no início, tornando o opcional grupo para a mesma contagem de bytes:^(^1|11\1)*$
.fonte
2
,6
ou outros números da forman^2-n
. ;) (A maneira de evitar que a explicação para o mesmo número de bytes seria^(^1|11\1)*$
).(^|1\1)+$
, eu acho?+
também interromperia o loop se não houvesse mais uma alternativa vazia, por exemplo, no caso de((?(1)11\1|1?))+
. Uma vez que houve uma iteração vazia, ela não tentará outras, independentemente de elas estarem ou não vazias.C (gcc), 30 bytes
Experimente online!
C, 34 bytes
Experimente online!
C, 33 bytes
Experimente online!
fonte
MATL ,
54 bytesObrigado a Luis por reduzir meu código de um byte mais longo em dois bytes, tornando-o o mais curto.
Experimente online
Explicação:
Resposta antiga:
Experimente online!
fonte
mod(2**127-, 1000)
. A menos que os quatro últimos dígitos sejam 0 ....t:Um
. Isso funciona para entradas até2^53
, devido à precisão limitada de ponto flutuanteU: str2num / string to array / square
. Eu sabia que tinha que haver uma função quadrada, mas não consegui encontrá-la ...Python 3 ,
4038 bytesObrigado ao squid por economizar 2 bytes!
Experimente online!
Lento demais para retornar uma resposta
2147483647
em um período de tempo razoável. (Mas escrito usando um gerador para economizar memória, pois não custa bytes.)Também funciona em Python 2, embora
OverflowError
seja uma possibilidade,range
se você tentar com entradas enormes. (AMemoryError
também seria provável no Python 2, também devido arange
.)fonte
Perl 5 , 14 bytes
13 bytes de código +
-p
sinalizador.Experimente online!
Calcula a raiz quadrada e verifica se é um número inteiro (mais precisamente, se não contiver um ponto (
/\./
)).fonte
05AB1E , 4 bytes
Experimente online!
fonte
4111817668062926054213257208
2**127-1
um primo de Mersenne).Python 3 , 19 bytes
Experimente online!
fonte
4111817668062926054213257208
.lambda n:int(n**.5)**2==n
sqrt
) falha em valores que estão fora do intervalo de um dobro2**4253-1
.%1
é definitivamente<1
, então sua proposta retornaria verdadeira para todas as entradas. Observe quen**.5
é um flutuador.SageMath , 9 bytes
Experimente online
A função interna faz exatamente o que diz na lata. Como o Sage usa computação simbólica, está livre de erros de precisão computacional que afetam os flutuadores IEEE-754.
fonte
Japonês , 3 bytes
Experimente online!
Parece funcionar bem
2**54-2
no Intérprete Japt, mas falha no TIO por algum motivo ...fonte
2**127-1
um primo Mersenne).2**127-1
está bem dentro da faixa de um dobro.2**53-1
?2**127-1
como um número. O mais próximo que pode chegar é2**127
.Haskell,
2624 bytesExperimente online!
Verifica se n está na lista de todos os quadrados de
0
atén
.fonte
f n=or[i*i==n|i<-[0..n]]
:)Prolog (SWI) , 27 bytes
Experimente online!
Explicação
Pesquisa todos os números maiores ou iguais a
0
e menores ou iguais aN
e testa se esse número ao quadrado é igual aN
.fonte
MathGolf , 1 byte
Experimente online!
Não acho que seja necessária uma explicação. Vi a necessidade de um operador "é quadrado perfeito" antes de enfrentar esse desafio, pois o idioma foi projetado para lidar com os desafios de golfe relacionados à matemática. Retorna 0 ou 1, pois MathGolf usa números inteiros para representar booleanos.
fonte
PHP, 21 bytes
Se a raiz quadrada não for um número inteiro,
(-1)**$argn**.5
éNAN
.fonte
-F
bandeira e gasodutos:echo 144 | php -F script.php
.f
escrevi essa carta. Obrigado.Ruby, 25 bytes
Provavelmente existe um caminho mais curto, mas foi tudo o que encontrei.
Experimente online!
fonte
CJam , 8 bytes
Experimente online!
Explicação
Raiz quadrada inteira, quadrada, compare com o número original.
fonte
mq1%0=
, que também é de 6 bytes{
...}
para tornar o código de uma função, por isso mesmo contagem de bytesri
é necessária nesse casoMathematica, 13 bytes
Experimente online!
fonte
AtomQ
vez deIntegerQ
.@*
.AtomQ@*Sqrt
é um sinônimo paraAtomQ@Sqrt@#&
. Por exemplo,AtomQ@*Sqrt@4
retornosTrue
eAtomQ@*Sqrt@5
retornosFalse
. (Por causa da precedência,AtomQ@*Sqrt[4]
não funciona direito, retornandoAtomQ@*2
.)APL (Dyalog) , 8 bytes
Experimente online!
0=
[é] zero igual a1|
o módulo-1 (isto é, a parte fracionária) de*∘.5
o argumento levantado ao poder da metadefonte
AWK , 27 + 2 bytes
Experimente online!
Adicione
+2
bytes para usar o-M
sinalizador para precisão arbitrária. Originalmente, usei a comparação de cadeias porque um grande número era igual, mesmo que não fossem, massqrt
também retornava valores imprecisos.2^127-2
não deve ser um quadrado perfeito.fonte
T-SQL, 38 bytes
Procura um ponto decimal na raiz quadrada.
IIF
é específico para o MS SQL, testado e funciona no MS SQL Server 2012.A entrada está na coluna a da tabela t existente , de acordo com nossas regras de entrada .
fonte
Ohm , 2 bytes
Usa
CP-437
codificação.Explicação
Entrada implícita -> Quadrado perfeito embutido -> Saída implícita ...
fonte
Java 8, 20 bytes
Entrada é um
int
.Experimente aqui.
fonte
int
,long
,short
. E com perguntas em que eles solicitam um número inteiro, mas o formato de entrada é flexível, às vezes uso uma entrada String para salvar alguns bytes. Pessoalmente, acho que usarn->
é bom, e você deve apenas indicar qual é o tipo, mas aparentemente nem todos concordam com isso. Por outro lado, vindo de um histórico de respostas do Java 7, passarint c(int n){return ...;}
para(int n)->...
faz mais sentido do quen->...
(embora eu pessoalmente prefira o segundo, pois é mais curto, é claro).R, 15
^ .5 é menos bytes que sqrt (). %% 1, o módulo, resultará em 0 se a resposta for um intergerador. scan () recebe a entrada do usuário.
http://www.tutorialspoint.com/execute_r_online.php?PID=0Bw_CjBb95KQMSm1qVktIOUdSSDg
fonte
Adicionar ++ ,
241311 bytesExperimente online!
Eu removi a função desajeitada na parte superior e a reescrevi no corpo da pergunta para remover 11 bytes.
Como a primeira seção já está explicada abaixo, vamos descobrir apenas como a nova peça funciona
Versão antiga, 24 bytes
Experimente online!
A função no topo (
D,i,@,1@%!
) é a parte principal do programa, então vamos entrar em mais detalhes.fonte
Python 3 ,
28 2725 bytesExperimente online!
fonte