È hip essere quadrato


44

Sfida

Quindi, ehm, sembra che, mentre abbiamo molte sfide che funzionano con numeri quadrati o numeri di altre forme, non ne abbiamo una che chiede semplicemente:

Dato un numero intero n(dove n>=0) come input restituisce un valore di verità se nè un quadrato perfetto o un valore di falsa in caso contrario.


Regole

  • È possibile accettare input con qualsiasi mezzo ragionevole e conveniente purché consentito dalle regole I / O standard .
  • Non è necessario gestire input maggiori di quelli che la lingua scelta può gestire in modo nativo né che porterebbero a imprecisioni in virgola mobile.
  • L'output dovrebbe essere uno dei due valori di verità / falsità coerenti (ad esempio, trueo false, 1o 0) - verità se l'input è un quadrato perfetto, false se non lo è.
  • Questo è quindi vince il conteggio di byte più basso.

Casi test

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false

@Neil ho capito il mio errore. Ritiro quel suggerimento e invece offer 18014398509481982( 2**54-2), che è rappresentabile con un doppio, e fa sì che le risposte che usano sqrtfalliscano.
Mego

@Mego probabilmente sbaglio o sto solo fraintendendo quello che stai dicendo, ma sono sicuro che 2**54-2è ancora più grande di un doppio che può tranquillamente gestire, almeno in JavaScript18014398509481982 > 9007199254740991
Tom

@Mego Penso che il valore limite sia 9007199515875288. Non è il quadrato di 94906267, perché non è rappresentabile in un doppio, ma se prendi la sua radice quadrata, otterrai quel numero intero come risultato.
Neil,

@Tom Digita 2**54-2in una console JS e confronta ciò che ottieni 18014398509481982(il valore esatto). JS emette il valore esatto, quindi 2**54-2è rappresentabile con un doppio. Se ciò non ti convince ancora, prendi i dati binari 0100001101001111111111111111111111111111111111111111111111111111, interpretali come un float a doppia precisione IEEE-754 e vedi quale valore ottieni.
Mego

3
Scusate ragazzi, mi sono allontanato per pranzo e ... beh, è ​​aumentato! E lì ho pensato che sarebbe stata una bella, semplice sfida! L'aggiunta di una regola che non è necessaria per gestire input che portano a imprecisioni in virgola mobile nella lingua prescelta lo coprirebbe?
Shaggy,

Risposte:


27

Neim , 2 byte

q𝕚

Spiegazione:

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

Quando dico "infinito" intendo fino a quando non raggiungiamo il valore massimo di long (2 ^ 63-1). Tuttavia, Neim sta (lentamente) passando a BigInteger teoricamente infinitamente grandi.

Provalo!


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Dennis,

Interessante. Quindi, questo pre-buffer l'elenco o è un generatore / iteratore che continua a verificare l'esistenza di input fino a quando non termina?
Patrick Roberts,

@PatrickRoberts Possiamo parlare in chat?
Okx,

Certo, chiamami al The Nineteenth Byte . Ci sono di tanto in tanto.
Patrick Roberts,

Bene, questo è ... DAVVERO FUNZIONALE
Cromo


8

TI-Basic, 4 byte

not(fPart(√(Ans

Controlla semplicemente se la radice quadrata è un numero intero cercando una parte frazionaria / decimale diversa da zero.


Puoi aggiungere un TIO (o equivalente)?
Shaggy,

@Shaggy Non credo ce ne siano. TI-Basic è proprietario e funzionerà solo su calcolatori TI e su emulatori che eseguono la ROM da una calcolatrice, quindi non è possibile utilizzare legalmente TI-Basic se non si possiede una calcolatrice.
Adám,

1
@Shaggy Se hai qualche ROM puoi usare un emulatore (la mia preferenza è jsified) per provare questo online.
Timtech,

8

C #, 27 byte

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

Un modo più corretto / accurato per farlo sarebbe:

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

double.Epsilon è inutile per questo tipo di controllo . tl; dr: quando si confrontano numeri> 2, Double.Epsilon è sostanzialmente uguale a zero. Moltiplicare per 100 ritarderà solo un po '.
Robert Fraser,

@RobertFraser Sono andato solo dal post SO collegato e non ho letto molto in esso. Ad ogni modo non è inutile solo non utile a numeri più alti.
TheLethalCoder

...<int>==0è ...!<int>Credo
Stan Strum

@StanStrum Not in C #
TheLethalCoder

7

JavaScript (ES6), 13 byte

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

Restituisce vero se la radice quadrata di n è un numero intero.

Frammento:

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

Uscite 1 per verità e 0 per falsità.

Provalo 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.

dcIl ^comando di esponenziazione della nota fornisce 0 0 = 1 e 0 n = 0, dove n> 0.


Bellissimo! +1 per l'utilizzo dcin modo così ingegnoso.
Wildcard il

6

Retina , 18 byte

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

Provalo online! Spudoratamente adattato dalla risposta di @ MartinEnder a Questo numero è triangolare? ma con la conversione di base inclusa al costo di 6 byte.

Si noti che questo numero è triangolare? non era per qualche motivo inspiegabile necessario per supportare zero come numero triangolare, quindi parte dell'adattamento era aggiungere a ?per rendere facoltativo il 1 iniziale, consentendo al gruppo di abbinare la stringa vuota e quindi un input zero. Tuttavia, dopo aver abbinato la stringa vuota, l' +operatore smette di ripetere, per evitare il ciclo infinito che si verificherebbe se continuasse a far corrispondere avidamente la stringa vuota (dopotutto, ^1?continuerebbe sicuramente a corrispondere). Ciò significa che non cerca nemmeno di abbinare l'altra alternativa nel gruppo, evitando così la corrispondenza di 2, 6, 12 ecc. Come sottolinea @MartinEnder, un modo più semplice per evitare che mentre si abbina ancora la stringa vuota è ancorare il match all'inizio rendendo opzionale gruppo per lo stesso numero di byte: ^(^1|11\1)*$.


In attesa della vostra spiegazione del perché questo non corrisponde 2, 6o altri numeri della forma n^2-n. ;) (Un modo per evitare quella spiegazione per lo stesso conteggio dei byte sarebbe ^(^1|11\1)*$.)
Martin Ender

@MartinEnder Lo stesso motivo che non potevi usare (^|1\1)+$, penso?
Neil,

Si, è esatto. Ho solo pensato che probabilmente sarebbe bello menzionarlo perché la maggior parte delle persone probabilmente non ha letto il mio commento sulla risposta triangolare (e in questo caso è in realtà rilevante per il motivo per cui la soluzione è corretta, al contrario del motivo per cui non è possibile giocare a golf ulteriormente ).
Martin Ender,

Per la cronaca, +smetterebbe anche di eseguire il loop se non esistesse più un'alternativa vuota, ad esempio nel caso di ((?(1)11\1|1?))+. Una volta che c'è stata un'iterazione vuota, non ci proverà più, indipendentemente dal fatto che possano essere vuoti o meno.
Martin Ender,

@MartinEnder In effetti, intendevo "aver abbinato ora" invece di "aver subito abbinato". Fisso.
Neil,


6

MATL , 5 4 byte

Grazie a Luis per aver ridotto il mio codice più lungo di un byte di due byte, rendendolo il più breve.

t:Um

Provalo online

Spiegazione:

         % 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

Vecchia risposta:

X^1\~

Provalo 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

@Mego non sono d'accordo. MATL non può nemmeno fare mod(2**127-, 1000). A meno che le ultime quattro cifre non siano 0 ....
Stewie Griffin,

Puoi anche usare t:Um. Funziona con input fino a2^53 causa della precisione limitata in virgola mobile
Luis Mendo,

Vedo ora che questo è simile alla tua modifica, solo un po 'più breve :-)
Luis Mendo,

Comando quadrato ben nascosto! U: str2num / string to array / square. Sapevo che doveva esserci una funzione quadrata, ma non riuscivo a trovarla ...
Stewie Griffin

1
@cairdcoinheringaahing che era parzialmente intenzionale. Avevo due soluzioni, una da 5 byte, l'altra da 6 byte. Luis ha sfiorato due byte da quello con 6. Quindi ho salvato due byte grazie a lui, ma ho salvato solo un byte sul punteggio ...
Stewie Griffin

6

Python 3 , 40 38 byte

Grazie a calamari per aver salvato 2 byte!

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

Provalo online!

Troppo lento per restituire una risposta 2147483647entro un ragionevole lasso di tempo. (Ma scritto usando un generatore per risparmiare memoria, dal momento che non costa alcun byte.)

Funziona anche in Python 2, anche se OverflowErrorè una possibilità dovuta rangese lo provi con input enormi. (A MemoryErrorsarebbe probabilmente anche in Python 2, anche a causa di range.)


5

Perl 5 , 14 byte

13 byte di codice + -pflag.

$_=sqrt!~/\./

Provalo online!

Calcola la radice quadrata e osserva se è un numero intero (più precisamente, se non contiene un punto ( /\./).


5

05AB1E , 4 byte

Ln¹å

Provalo online!


Non funziona per grandi numeri, ad esempio4111817668062926054213257208
Emigna l'

@Emigna Oh perché è considerato lungo? Pensavo che 05AB1E usasse Python 3.
Erik the Outgolfer l'

Non riesce per input di grandi dimensioni (l'input specificato è 2**127-1, un primo di Mersenne).
Mego

Usa python 3. Il problema è che la radice quadrata fornisce errori di arrotondamento per grandi numeri.
Emigna,

@Emigna Oh ... Immagino che dovrò trovare un altro modo, non dovrebbe essere difficile.
Erik the Outgolfer,

5

Python 3 , 19 byte

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

Provalo online!


Non riesce per ingressi di grandi dimensioni, ad es 4111817668062926054213257208.
L3viathan,

Risolto in 25 byte:lambda n:int(n**.5)**2==n
L3viathan l'

4
@ L3viathan That (insieme a qualsiasi soluzione che coinvolge sqrt) fallisce su valori che sono al di fuori dell'intervallo di un doppio, come 2**4253-1.
Mego

@totallyhuman dopo float %1è sicuramente <1, quindi la tua proposta tornerà vera per tutti gli input. Nota che n**.5è un float.
Leaky Nun,

5

SageMath , 9 byte

is_square

Provalo online

La funzione integrata fa esattamente ciò che dice sulla scatola. Poiché Sage utilizza il calcolo simbolico, è privo di errori di precisione computazionale che affliggono i galleggianti IEEE-754.


5

Japt , 3 byte

¬v1

Provalo online!

Sembra funzionare bene 2**54-2nell'interprete Japt ma non riesce su TIO per qualche motivo ...


Non riesce per input di grandi dimensioni (input è 2**127-1, un primo di Mersenne).
Mego

@Mego, non è la norma che le soluzioni non devono gestire numeri più grandi di quelli che la lingua è in grado di gestire?
Shaggy,

@Shaggy Japt si basa su JavaScript, che utilizza float a doppia precisione. 2**127-1è ben all'interno della gamma di un doppio.
Mego

2
@Mego Il massimo int sicuro per JavaScript 2**53-1?
Tom,

3
@Mego Ma i numeri di JavaScript hanno solo 53 bit di precisione, quindi JS non può rappresentare esattamente il valore 2**127-1come un numero. Il più vicino che può ottenere è 2**127.
ETHproductions


5

Prolog (SWI) , 27 byte

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

Provalo online!

Spiegazione

Cerca tra tutti i numeri maggiori o uguali 0e inferiori o uguali a Ne verifica se quel numero al quadrato è uguale a N.


1
@DLosc fatto !
0

5

MathGolf , 1 byte

°

Provalo online!

Non credo sia necessaria una spiegazione. Ho visto la necessità di un operatore "è quadrato perfetto" prima di vedere questa sfida, poiché il linguaggio è progettato per gestire le sfide del golf legate alla matematica. Restituisce 0 o 1, poiché MathGolf utilizza numeri interi per rappresentare i booleani.


4

PHP, 21 byte

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

Se la radice quadrata non è un numero intero, lo (-1)**$argn**.5è NAN.


Come eseguo questo?
Tito

@Titus Con la -Fbandiera e gasdotti: echo 144 | php -F script.php.
user63956

Ah io forgot quella lettera. Grazie.
Tito

4

Rubino, 25 byte

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

Probabilmente esiste un modo più breve, ma è tutto ciò che ho trovato.

Provalo online!


Benvenuto in PPCG :) Potresti aggiungere un TIO (o equivalente) a questo, per favore?
Shaggy,

Grazie per aver aggiunto il TIO, tuttavia, questo non sembra restituire alcun output.
Shaggy,

Mio male, l'ho aggiornato.
Gregory,

No, ancora non funziona.
Shaggy,

3

CJam , 8 byte

ri_mQ2#=

Provalo online!

Spiegazione

Radice quadrata intera, quadrata, confronta con il numero originale.


Immagino che, in base a questo , non siano necessari i primi 2 byte
Chromium,

E, in alternativa, usando l'idea di questa risposta , puoi fare mq1%0=, che è anche 6 byte
Chromium

@Chromium Grazie, ma in quel caso ho bisogno {... }di rendere il codice una funzione, quindi lo stesso conteggio dei byte
Luis Mendo,

In realtà, sono un po 'confuso se aggiungere o meno parentesi graffe. Perché se non li aggiungi, in realtà è un programma, che è permesso.
Chromium,

@Chromium Un programma deve prendere il suo contributo, quindi riè necessario in quel caso
Luis Mendo,



3

AWK , 27 + 2 byte

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

Provalo online!

Aggiungi +2byte per l'utilizzo del -Mflag per una precisione arbitraria. Inizialmente usavo il confronto delle stringhe perché un numero elevato comparava uguale, anche se non lo erano, ma sqrtrestituiva anche valori imprecisi. 2^127-2non dovrebbe essere un quadrato perfetto.


3

T-SQL, 38 byte

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

Cerca un punto decimale nella radice quadrata. IIFè specifico per MS SQL, testato e funziona in MS SQL Server 2012.

L'input è nella colonna a della tabella t preesistente , secondo le nostre regole di input .


3

Ohm , 2 byte

Ʋ

Usa la CP-437codifica.

Spiegazione

Input implicito -> Perfect square built-in -> Output implicito ...


3

Java 8, 20 byte

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

L'input è un int.

Provalo qui.


Non discutibile: la domanda dice esplicitamente "Dato un numero intero n (dove n> = 0)". La risposta più breve è la migliore. Modifica: non farà +1 fino a quando la risposta più breve non è la prima: p
Olivier Grégoire,

@ OlivierGrégoire Hmm, è un buon modo per vederlo. Ma ancora non si sa se si tratta di un int, long, short. E con domande in cui chiedono un numero intero ma il formato di input è flessibile, a volte uso un input String per salvare alcuni byte. Personalmente penso che usare n->vada bene, e dovresti semplicemente indicare quale sia il tipo, ma a quanto pare non tutti sono d'accordo con questo. D'altra parte, proveniente da una cronologia delle risposte di Java 7, passare da int c(int n){return ...;}a (int n)->...ha più senso di n->...(anche se preferisco personalmente il secondo poiché ovviamente più breve).
Kevin Cruijssen,

2
@ OlivierGrégoire Ok, l'ho cambiato. Dopo aver letto la discussione in questa risposta , sono giunto alla conclusione che affermare che l'input è un numero intero in Java, non fa differenza che affermare che l'input è un elenco di due stringhe in CJam o una matrice di celle di stringhe in MATL .
Kevin Cruijssen,


3

Aggiungi ++ , 24 13 11 byte

+?
S
%1
N
O

Provalo online!

Ho rimosso la funzione goffo in alto e l'ho riscritta nel corpo della domanda per rimuovere 11 byte.

Poiché la prima sezione è già spiegata di seguito, scopriamo solo come funziona la nuova parte

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

Vecchia versione, 24 byte

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

Provalo online!

La funzione in alto ( D,i,@,1@%!) è la parte principale del programma, quindi andiamo più nel dettaglio.

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

3

Python 3 , 28 27 25 byte

  • Grazie a @mdahmoune per 1 byte: confronta int di radice quadrata con originale
  • 2 byte salvati: lambda abbreviata
lambda x:int(x**.5)**2==x

Provalo online!


1
che dire di f = lambda x: int (x **. 5) ** 2 == x 27bytes
mdahmoune
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.