É quadril ser quadrado


44

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 nfor 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, trueou false, 1ou 0) - verdade se a entrada for um quadrado perfeito, falsey se não for.
  • Isso é 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

@ Neil eu percebi o meu erro. Retiro essa sugestão e, em vez disso, ofereço 18014398509481982( 2**54-2), que é representável com um duplo, e causa respostas que costumam sqrtfalhar.
Mego

@Mego Eu estou provavelmente errado ou apenas mal-entendido que você está dizendo, mas eu tenho certeza que 2**54-2é ainda maior do que a dupla pode lidar com segurança, pelo menos em JavaScript18014398509481982 > 9007199254740991
Tom

@Mego Acho que o valor limite é 9007199515875288. Não é o quadrado de 94906267, porque isso não é representável em um duplo, mas se você pegar sua raiz quadrada, obtém esse número inteiro como resultado.
214 Neil

@ Tom Digite 2**54-2em um console JS e compare o que você obtém 18014398509481982(o valor exato). JS gera o valor exato, portanto 2**54-2é representável com um duplo. Se isso ainda não o convencer, pegue os dados binários 0100001101001111111111111111111111111111111111111111111111111111, interprete-os como um flutuador de precisão dupla IEEE-754 e veja qual valor você obtém.
Mego

3
Desculpe, pessoal, se afastaram para almoçar e ... bem, isso aumentou! E pensei que seria um desafio simples e agradável! Adicionar uma regra que você não precisa manipular entradas que levem a imprecisões de ponto flutuante no idioma escolhido?
Shaggy

Respostas:


27

Neim , 2 bytes

q𝕚

Explicação:

q      Push an infinite list of squares
 𝕚     Is the input in that list?

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!


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Dennis

Interessante. Então, isso faz um pré-buffer da lista ou é um gerador / iterador que continua verificando a existência de entrada até que seja finalizado?
Patrick Roberts

@PatrickRoberts Podemos conversar no chat?
Okx

Claro, basta me ligar no décimo nono byte . Eu estou lá ocasionalmente.
Patrick Roberts

Bem, isso é ... REALMENTE FUNCIONAL
Chromium


8

TI-Basic, 4 bytes

not(fPart(√(Ans

Simplesmente verifica se a raiz quadrada é um número inteiro procurando uma parte fracionária / decimal diferente de zero.


Você pode adicionar um TIO (ou equivalente)?
Shaggy

@ Shagy não acho que exista. O TI-Basic é proprietário e será executado apenas nas calculadoras e emuladores que executam a ROM a partir de uma calculadora, portanto, você não pode usar legalmente o TI-Basic se não possuir uma calculadora.
Adám 8/06

1
@ Shaggy Se você possui ROMs, pode usar um emulador (minha preferência é jstified) para fazer isso online.
Timtech

8

C #, 27 bytes

n=>System.Math.Sqrt(n)%1==0

Uma maneira mais correta / precisa de fazer isso seria:

n=>System.Math.Sqrt(n)%1<=double.Epsilon*100

Épsilon é inútil para esse tipo de verificação . tl; dr: Ao comparar números> 2, o Double.Epsilon é basicamente o mesmo que zero. Multiplicar por 100 atrasará um pouco isso.
Robert Fraser

@RobertFraser Eu só fui pelo post do SO vinculado e não li muito sobre ele. De qualquer forma, não é inútil apenas não ser útil em números mais altos.
TheLethalCoder

...<int>==0é que ...!<int>eu acho
Stan Strum

@StanStrum não está em C # #
TheLethalCoder 13/01

7

JavaScript (ES6), 13 bytes

n=>!(n**.5%1)

Retorna true se a raiz quadrada de n for um número inteiro.

Snippet:

f=
n=>!(n**.5%1)

console.log(f(0));
console.log(f(1));
console.log(f(2));
console.log(f(4));
console.log(f(8));
console.log(f(16));
console.log(f(88));
console.log(f(2147483647));


7

dc, 9

0?dvd*-^p

Saídas 1 para verdade e 0 para falsey.

Experimente online .

0            # Push zero.  Stack: [ 0 ]
 ?           # Push input.  Stack: [ n, 0 ]
  dv         # duplicate and take integer square root.  Stack: [ ⌊√n⌋, n, 0 ]
    d        # duplicate.  Stack: [ ⌊√n⌋, ⌊√n⌋, n, 0 ]
     *       # multiply.  Stack: [ ⌊√n⌋², n, 0 ]
      -      # take difference. Stack: [ n-⌊√n⌋², 0 ]
       ^     # 0 to power of the result.  Stack: [ 0^(n-⌊√n⌋²) ]
        p    # print.

dcO ^comando de exponenciação da nota fornece 0 0 = 1 e 0 n = 0, onde n> 0.


Bela! +1 por usar de dcmaneira tão engenhosa.
Curinga

6

Retina , 18 bytes

.+
$*
(^1?|11\1)+$

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)*$.


Aguardamos a sua explicação por que isso não corresponde 2, 6ou outros números da forma n^2-n. ;) (A maneira de evitar que a explicação para o mesmo número de bytes seria ^(^1|11\1)*$).
Martin Ender

@MartinEnder Mesmo motivo que você não poderia usar (^|1\1)+$, eu acho?
911 Neil

Sim, está certo. Apenas pensei que provavelmente seria bom mencionar, porque a maioria das pessoas provavelmente não leu meu comentário sobre a resposta triangular (e, neste caso, é realmente relevante o porquê da solução estar correta, e não o porquê de não ser possível jogar mais. )
Martin Ender

Para o registro, o +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.
Martin Ender

@MartinEnder De fato, eu quis dizer "agora correspondendo" em vez de "imediatamente correspondido". Fixo.
911 Neil


6

MATL , 5 4 bytes

Obrigado a Luis por reduzir meu código de um byte mais longo em dois bytes, tornando-o o mais curto.

t:Um

Experimente online

Explicação:

         % Implicit input
t        % Duplicate it
 :       % Range from 1 to input value
  U      % Square the range, to get 1 4 9 ... 
   m     % ismember, Checks if the input is a member of the range of perfect squares

Resposta antiga:

X^1\~

Experimente online!

        % Implicit input
X^      % Square root of input
  1\    % Modulus 1. All perfect squares will have 0, the rest will have decimal value
     ~  % Negate, so the 0 becomes 1, and the decimal values become 0

@Ego eu discordo. MATL nem pode fazer mod(2**127-, 1000). A menos que os quatro últimos dígitos sejam 0 ....
Stewie Griffin

Você também pode usar t:Um. Isso funciona para entradas até2^53 , devido à precisão limitada de ponto flutuante
Luis Mendo

Vejo agora que isso é semelhante à sua edição, apenas um pouco mais curto :-)
Luis Mendo

Comando quadrado bem escondido! U: str2num / string to array / square. Eu sabia que tinha que haver uma função quadrada, mas não consegui encontrá-la ...
Stewie Griffin

1
@cairdcoinheringaahing que foi parcialmente de propósito. Eu tinha duas soluções, uma com 5 bytes e a outra com 6 bytes. Luis tirou dois bytes daquele com 6. Então eu salvei dois bytes graças a ele, mas salvei apenas um byte no placar ...
Stewie Griffin

6

Python 3 , 40 38 bytes

Obrigado ao squid por economizar 2 bytes!

lambda n:n in(i*i for i in range(n+1))

Experimente online!

Lento demais para retornar uma resposta 2147483647em 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 OverflowErrorseja uma possibilidade, rangese você tentar com entradas enormes. (A MemoryErrortambém seria provável no Python 2, também devido a range.)


5

Perl 5 , 14 bytes

13 bytes de código + -psinalizador.

$_=sqrt!~/\./

Experimente online!

Calcula a raiz quadrada e verifica se é um número inteiro (mais precisamente, se não contiver um ponto ( /\./)).


5

05AB1E , 4 bytes

Ln¹å

Experimente online!


Não funciona para grandes números, por exemplo4111817668062926054213257208
Emigna

@ Emigna Oh, porque é considerado um longo? Pensei que 05AB1E usa Python 3.
Erik o Outgolfer

Falha em entradas grandes (a entrada fornecida é 2**127-1um primo de Mersenne).
Mego

Ele usa o python 3. O problema é que a raiz quadrada fornece erros de arredondamento para grandes números.
Emigna

@ Emigna Oh ... Acho que vou ter que descobrir outra maneira, então, não deve ser difícil.
Erik the Outgolfer,

5

Python 3 , 19 bytes

lambda n:n**.5%1==0

Experimente online!


Falha em entradas grandes, por exemplo 4111817668062926054213257208.
precisa saber é o seguinte

Corrigido em 25 bytes:lambda n:int(n**.5)**2==n
L3viathan

4
@ L3viathan Isso (juntamente com qualquer solução que envolva sqrt) falha em valores que estão fora do intervalo de um dobro 2**4253-1.
Mego

@totallyhuman um float depois %1é definitivamente <1, então sua proposta retornaria verdadeira para todas as entradas. Observe que n**.5é um flutuador.
Leaky Nun

5

SageMath , 9 bytes

is_square

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.


5

Japonês , 3 bytes

¬v1

Experimente online!

Parece funcionar bem 2**54-2no Intérprete Japt, mas falha no TIO por algum motivo ...


Falha em entradas grandes (a entrada é 2**127-1um primo Mersenne).
Mego

@Mego, não é a norma que as soluções não precisam lidar com números maiores do que o idioma é capaz de lidar?
Shaggy

O @Shaggy Japt é baseado em JavaScript, que usa flutuadores de precisão dupla. 2**127-1está bem dentro da faixa de um dobro.
Mego

2
@Mego Não é o máximo de int seguro para JavaScript 2**53-1?
Tom

3
@Mego Mas os números do JavaScript têm apenas 53 bits de precisão, então o JS não pode representar exatamente o valor 2**127-1como um número. O mais próximo que pode chegar é 2**127.
ETHproductions

5

Haskell, 26 24 bytes

f n=elem n$map(^2)[0..n]

Experimente online!

Verifica se n está na lista de todos os quadrados de 0até n.


1
mesma contagem de bytes: f n=or[i*i==n|i<-[0..n]]:)
vroomfondel

5

Prolog (SWI) , 27 bytes

+N:-between(0,N,I),N=:=I*I.

Experimente online!

Explicação

Pesquisa todos os números maiores ou iguais a 0e menores ou iguais a Ne testa se esse número ao quadrado é igual a N.


1
@DLosc done !
0

5

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.


4

PHP, 21 bytes

<?=(-1)**$argn**.5<2;

Se a raiz quadrada não for um número inteiro, (-1)**$argn**.5é NAN.


Como eu executo isso?
Titus

@Titus Com a -Fbandeira e gasodutos: echo 144 | php -F script.php.
user63956

Ah, eu fescrevi essa carta. Obrigado.
Titus

4

Ruby, 25 bytes

Math.sqrt(gets.to_i)%1==0

Provavelmente existe um caminho mais curto, mas foi tudo o que encontrei.

Experimente online!


Bem-vindo ao PPCG :) Você pode adicionar um TIO (ou equivalente) a isso, por favor?
Shaggy

Obrigado por adicionar o TIO, no entanto, isso não parece retornar nenhuma saída.
Shaggy

Meu mal, eu atualizei.
Gregory

Não, ainda não está funcionando.
Shaggy

3

CJam , 8 bytes

ri_mQ2#=

Experimente online!

Explicação

Raiz quadrada inteira, quadrada, compare com o número original.


Eu acho que de acordo com este , você não precisa dos primeiros 2 bytes
Cromo

E, alternativamente, usando a idéia de esta resposta , você pode fazer mq1%0=, que também é de 6 bytes
Cromo

@Chromium Graças, mas nesse caso eu necessidade {... }para tornar o código de uma função, por isso mesmo contagem de bytes
Luis Mendo

Na verdade, estou um pouco confuso sobre adicionar ou não chaves. Porque se você não adicioná-los, na verdade é um programa que é permitido.
Cromo

@Chromium Um programa precisa de ter sua entrada, por isso rié necessária nesse caso
Luis Mendo



3

AWK , 27 + 2 bytes

{x=int($0^0.5);$0=x*x==$1}1

Experimente online!

Adicione +2bytes para usar o -Msinalizador para precisão arbitrária. Originalmente, usei a comparação de cadeias porque um grande número era igual, mesmo que não fossem, mas sqrttambém retornava valores imprecisos. 2^127-2não deve ser um quadrado perfeito.


3

T-SQL, 38 bytes

SELECT IIF(SQRT(a)LIKE'%.%',0,1)FROM t

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 .


3

Ohm , 2 bytes

Ʋ

Usa CP-437codificação.

Explicação

Entrada implícita -> Quadrado perfeito embutido -> Saída implícita ...


3

Java 8, 20 bytes

n->Math.sqrt(n)%1==0

Entrada é um int.

Experimente aqui.


Não discutível: a pergunta diz explicitamente "Dado um número inteiro n (onde n> = 0)". A resposta mais curta é a melhor. Edit: não vai +1 até que a resposta mais curta não é a primeira: p
Olivier Grégoire

@ OlivierGrégoire Hmm, essa é uma boa maneira de ver as coisas. Mas você ainda não sabe se é um 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 usar n->é 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, passar int c(int n){return ...;}para (int n)->...faz mais sentido do que n->...(embora eu pessoalmente prefira o segundo, pois é mais curto, é claro).
Kevin Cruijssen

2
@ OlivierGrégoire Ok, eu mudei. Depois de ler a discussão nesta resposta , cheguei à conclusão de que afirmar que a entrada é um número inteiro em Java, não há diferença do que afirmar que a entrada é uma lista de duas Strings no CJam ou uma matriz de células no MATL .
Kevin Cruijssen


3

Adicionar ++ , 24 13 11 bytes

+?
S
%1
N
O

Experimente 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

S   Square root
%1  Modulo by 1. Produced 0 for integers and a decimal for floats
N   Logical NOT

Versão antiga, 24 bytes

D,i,@,1@%!
+?
^.5
$i,x
O

Experimente online!

A função no topo ( D,i,@,1@%!) é a parte principal do programa, então vamos entrar em mais detalhes.

D,     Create a function...
  i,   ...called i...
  @,   ...that takes 1 argument (for this example, let's say 3.162 (root 10))
    1  push 1 to the stack; STACK = [1, 3.162]
    @  reverse the stack;   STACK = [3.162, 1]
    %  modulo the stack;    STACK = [0.162]
    !  logical NOT;         STACK = [False]

+?     Add the input to accumulator (x)
^.5    Square root (exponent by 0.5)
$i,x   Apply function i to x
O      Output the result

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.