Es ist hip, quadratisch zu sein

44

Herausforderung

Es scheint also, dass wir zwar viele Herausforderungen haben, die mit quadratischen Zahlen oder Zahlen anderer Formen funktionieren, aber keine, die einfach fragt:

Wenn eine ganze Zahl n(wo n>=0) als Eingabe angegeben wird, wird ein wahrer Wert zurückgegeben, wenn dies nein perfektes Quadrat ist, oder ein falscher Wert, wenn dies nicht der Fall ist.


Regeln

  • Sie können Eingaben auf jede vernünftige und bequeme Weise vornehmen, sofern dies nach den Standard-E / A-Regeln zulässig ist .
  • Sie müssen keine Eingaben verarbeiten, die größer sind als die von Ihnen gewählte Sprache und die auch nicht zu Gleitkommaungenauigkeiten führen.
  • Ausgabe soll ein von zwei konsistenten truthy / Falsey Werten (zB trueoder false, 1oder 0) - truthy , wenn der Eingang ein perfekter Platz, Falsey wenn es nicht.
  • Dies ist also gewinnt die niedrigste Bytezahl.

Testfälle

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false
Zottelig
quelle
@Neil Mir ist mein Fehler aufgefallen. Ich einfahren diesen Vorschlag, und stattdessen bieten 18014398509481982( 2**54-2), das ist mit einem Doppel darstellbaren und verursacht Antworten , die Verwendung sqrtzum Scheitern verurteilt.
Mego
@Mego Ich liege wahrscheinlich falsch oder verstehe einfach nicht, was Sie sagen, aber ich bin mir sicher, dass 2**54-2es immer noch größer ist als ein Double, zumindest in JavaScript18014398509481982 > 9007199254740991
Tom
@Mego Ich denke, der Grenzwert ist 9007199515875288. Es ist nicht das Quadrat von 94906267, weil das nicht in einem Double darstellbar ist, aber wenn Sie seine Quadratwurzel ziehen, erhalten Sie diese Ganzzahl als Ergebnis.
Neil
@Tom Geben Sie 2**54-2in eine JS-Konsole ein und vergleichen Sie, was Sie erhalten 18014398509481982(den genauen Wert). JS gibt den exakten Wert aus, ist also 2**54-2mit einem Double darstellbar. Wenn Sie das immer noch nicht überzeugt, nehmen Sie die Binärdaten 0100001101001111111111111111111111111111111111111111111111111111, interpretieren Sie sie als IEEE-754-Gleitkomma mit doppelter Genauigkeit und sehen Sie, welchen Wert Sie erhalten.
Mego
3
Entschuldigung, Leute, sind zum Mittagessen weggegangen und ... nun, das hat eskaliert! Und da dachte ich, das wäre eine schöne, einfache Herausforderung! Würde das Hinzufügen einer Regel, die keine Eingaben verarbeiten muss, die zu Gleitkommaungenauigkeiten in der von Ihnen ausgewählten Sprache führen, dies abdecken?
Shaggy

Antworten:

27

Neim , 2 Bytes

q𝕚

Erläuterung:

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

Wenn ich 'unendlich' sage, meine ich, bis wir den Maximalwert von longs erreicht haben (2 ^ 63-1). Neim geht jedoch (langsam) zu theoretisch unendlich großen BigIntegers über.

Versuch es!

Okx
quelle
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Dennis
Interessant. Puffert dies also die Liste vor oder handelt es sich um einen Generator / Iterator, der so lange auf das Vorhandensein von Eingaben prüft, bis er endet?
Patrick Roberts
@PatrickRoberts Können wir uns im Chat unterhalten?
Okx
Klar, ping mich einfach auf The Nineteenth Byte an . Ich bin gelegentlich dort.
Patrick Roberts
Nun, das ist ... WIRKLICH FUNKTIONAL
Chrom
8

TI-Basic, 4 Bytes

not(fPart(√(Ans

Überprüft einfach, ob die Quadratwurzel eine Ganzzahl ist, indem nach einem Bruchteil / Dezimalteil ungleich Null gesucht wird.

Timtech
quelle
Können Sie ein TIO (oder ein Äquivalent) hinzufügen?
Shaggy
@ Shaggy Ich glaube nicht, dass es welche gibt. TI-Basic ist proprietär und kann nur auf den Taschenrechnern von TI und in Emulatoren ausgeführt werden, auf denen das ROM von einem Taschenrechner ausgeführt wird. Sie können TI-Basic daher nicht legal verwenden, wenn Sie keinen Taschenrechner besitzen.
Adám
1
@ Shaggy Wenn Sie ROMs haben, können Sie einen Emulator (meine Präferenz ist jstified) verwenden, um dies online auszuprobieren.
Timtech
8

C #, 27 Bytes

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

Ein richtigerer / genauerer Weg , dies zu tun, wäre:

n=>System.Math.Sqrt(n)%1<=double.Epsilon*100
TheLethalCoder
quelle
double.Epsilon ist für diese Art der Prüfung unbrauchbar . tl; dr: Beim Vergleich von Zahlen> 2 ist Double.Epsilon im Grunde genommen gleich Null. Das Multiplizieren mit 100 verzögert das nur ein bisschen.
Robert Fraser
@RobertFraser Ich bin nur durch den verknüpften SO-Beitrag gegangen und habe nicht zu viel hineingelesen. In jedem Fall ist es nicht nutzlos, bei höheren Zahlen nicht nützlich zu sein.
TheLethalCoder
...<int>==0ist ...!<int>ich denke
Stan Strum
@StanStrum Nicht in C #
TheLethalCoder
7

JavaScript (ES6), 13 Byte

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

Gibt true zurück, wenn die Quadratwurzel von n eine ganze Zahl ist.

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));

Rick Hitchcock
quelle
7

dc, 9

0?dvd*-^p

Gibt 1 für wahr und 0 für falsch aus.

Probieren Sie es online aus .

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.

dcDer ^Exponentiationsbefehl von Note gibt 0 0 = 1 und 0 n = 0, wobei n> 0 ist.

Digitales Trauma
quelle
Schön! +1 für dcsolch eine geniale Verwendung.
Wildcard
6

Retina , 18 Bytes

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

Probieren Sie es online! Schamlos adaptiert von @ MartinEnders Antwort auf Ist diese Zahl dreieckig? aber mit der Grundkonvertierung zu einem Preis von 6 Bytes enthalten.

Beachten Sie, dass diese Zahl dreieckig ist? war aus irgendeinem unerklärlichen Grund nicht erforderlich, Null als Dreieckszahl zu unterstützen, daher bestand ein Teil der Anpassung darin, a hinzuzufügen ?, um die führende 1 optional zu machen, damit die Gruppe mit der leeren Zeichenfolge übereinstimmt, und daher eine Null-Eingabe. Nachdem der +Operator nun mit der leeren Zeichenfolge übereinstimmt, stoppt er die Wiederholung, um die Endlosschleife zu vermeiden, die auftreten würde, wenn die leere Zeichenfolge weiterhin gierig abgeglichen würde (schließlich ^1?würde sie sicherlich weiterhin übereinstimmen). Dies bedeutet, dass es nicht einmal versucht, die andere Alternative in der Gruppe zu finden, wodurch die Übereinstimmung von 2, 6, 12 usw. vermieden wird. Wie @MartinEnder hervorhebt, ist es eine einfachere Möglichkeit, dies zu vermeiden, während die leere Zeichenfolge noch übereinstimmt Anker , das Spiel zu Beginn , während die Gruppe optional für die gleiche Byteanzahl machen: ^(^1|11\1)*$.

Neil
quelle
Wir freuen uns auf Ihre Erklärung, warum dies nicht passt 2, 6oder auf andere Nummern des Formulars n^2-n. ;) (Eine Möglichkeit, diese Erklärung für die gleiche ^(^1|11\1)*$
Martin Ender
@MartinEnder Derselbe Grund, den du nicht benutzen konntest (^|1\1)+$, denke ich?
Neil
Ja das ist richtig. Ich dachte nur, es wäre wahrscheinlich gut zu erwähnen, weil die meisten Leute meinen Kommentar zu der Dreiecksantwort wahrscheinlich nicht gelesen haben (und in diesem Fall ist es tatsächlich relevant, warum die Lösung korrekt ist, im Gegensatz dazu, warum sie nicht weiter golfen werden kann ).
Martin Ender
Für die Aufzeichnung +würde die Schleife auch dann aufhören, wenn es keine leere Alternative mehr gäbe, z. B. im Fall von ((?(1)11\1|1?))+. Sobald eine leere Iteration stattgefunden hat, werden keine weiteren wiederholt, unabhängig davon, ob sie leer ist oder nicht.
Martin Ender
@MartinEnder In der Tat meinte ich "jetzt übereinstimmen" anstatt "sofort übereinstimmen". Fest.
Neil
6

MATL , 5 4 Bytes

Vielen Dank an Luis, der meinen um ein Byte längeren Code um zwei Byte verkürzt hat, damit er der kürzeste ist.

t:Um

Probieren Sie es online aus

Erläuterung:

         % 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

Alte Antwort:

X^1\~

Probieren Sie es 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
Stewie Griffin
quelle
@Mego Ich stimme nicht zu. MATL kann nicht einmal tun mod(2**127-, 1000). Es sei denn, die vier letzten Ziffern sind 0 ....
Stewie Griffin
Sie können auch verwenden t:Um. Das funktioniert für Eingaben bis zu2^53 , aufgrund der begrenzten Gleitkommapräzision
Luis Mendo
Ich sehe jetzt, dass dies ähnlich zu Ihrer Bearbeitung ist, nur ein wenig kürzer :-)
Luis Mendo
Gut versteckter quadratischer Befehl! U: str2num / string to array / square. Ich wusste, dass es eine quadratische Funktion geben musste, aber ich konnte sie nicht finden ...
Stewie Griffin
1
@cairdcoinheringaahing das war teilweise absichtlich. Ich hatte zwei Lösungen, eine war 5 Bytes, die andere 6 Bytes. Luis hat zwei Bytes von dem mit 6 entfernt. Also habe ich dank ihm zwei Bytes gespart, aber ich habe nur ein Byte für die Punktzahl gespart ...
Stewie Griffin
6

Python 3 , 40 38 Bytes

Danke an squid für das Speichern von 2 Bytes!

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

Probieren Sie es online!

Zu langsam, um eine Antwort 2147483647innerhalb eines angemessenen Zeitraums zurückzugeben. (Aber geschrieben mit einem Generator, um Speicher zu sparen, da es keine Bytes kostet.)

Funktioniert auch in Python 2, obwohl OverflowErroreine Möglichkeit besteht, rangewenn Sie es mit großen Eingaben versuchen. (A MemoryErrorwäre wahrscheinlich auch in Python 2, auch wegen range.)

mathmandan
quelle
5

Perl 5 , 14 Bytes

13 Byte Code + -pFlag.

$_=sqrt!~/\./

Probieren Sie es online!

Berechnet die Quadratwurzel und prüft, ob es sich um eine Ganzzahl handelt (genauer gesagt, wenn sie keinen Punkt enthält ( /\./).

Dada
quelle
5

05AB1E , 4 Bytes

Ln¹å

Probieren Sie es online!

Erik der Outgolfer
quelle
Funktioniert beispielsweise nicht für große Zahlen4111817668062926054213257208
Emigna
@Emigna Oh, weil es als lang angesehen wird? Ich dachte, dass 05AB1E Python 3 verwendet.
Erik the Outgolfer
Schlägt bei großen Eingaben fehl (die angegebene Eingabe ist 2**127-1eine Mersenne-Primzahl).
Mego
Es wird Python 3 verwendet. Das Problem ist, dass die Quadratwurzel Rundungsfehler für große Zahlen liefert.
Emigna
@Emigna Oh ... Ich denke, ich muss dann einen anderen Weg finden, sollte nicht schwer sein.
Erik der Outgolfer
5

Python 3 , 19 Bytes

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

Probieren Sie es online!

sagiksp
quelle
Bei großen Eingaben, z 4111817668062926054213257208.
L3viathan
In 25 Bytes lambda n:int(n**.5)**2==n
behoben
4
@ L3viathan Das scheitert (zusammen mit jeder involvierten Lösung sqrt) an Werten, die außerhalb des Bereichs eines Doppelten liegen, wie 2**4253-1.
Mego
@totallyhuman ein float danach %1ist definitiv <1, also würde dein vorschlag für alle eingaben true zurückgeben. Beachten Sie, dass dies n**.5ein Schwimmer ist.
Undichte Nonne
5

SageMath , 9 Bytes

is_square

Probieren Sie es online aus

Die eingebaute Funktion macht genau das, was es verspricht. Da Sage symbolische Berechnungen verwendet, ist es frei von Rechengenauigkeitsfehlern, die IEEE-754-Floats plagen.

Mego
quelle
5

Japt , 3 Bytes

¬v1

Probieren Sie es online!

Scheint 2**54-2im Japt Interpreter gut zu funktionieren , schlägt aber auf TIO aus irgendeinem Grund fehl ...

Tom
quelle
Schlägt bei großen Eingaben fehl (Eingabe ist 2**127-1eine Mersenne-Primzahl).
Mego
@Mego, ist es nicht die Norm, dass Lösungen keine Zahlen verarbeiten müssen, die größer sind als die Sprache, die verarbeitet werden kann?
Shaggy
@Shaggy Japt basiert auf JavaScript, das Floats mit doppelter Genauigkeit verwendet. 2**127-1liegt gut im Bereich eines Doppels.
Mego
2
@Mego Ist der max safe int nicht für JavaScript 2**53-1?
Tom
3
@Mego Die Zahlen in JavaScript haben jedoch nur eine Genauigkeit von 53 Bit, sodass JS den Wert nicht genau 2**127-1als Zahl darstellen kann. Der nächste, den es bekommen kann, ist 2**127.
ETHproductions
5

Haskell, 26 24 Bytes

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

Probieren Sie es online!

Prüft, ob n in der Liste aller Quadrate von 0bis enthalten ist n.

nimi
quelle
1
Gleiche f n=or[i*i==n|i<-[0..n]]
Byteanzahl
5

Prolog (SWI) , 27 Bytes

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

Probieren Sie es online!

Erläuterung

Durchsucht alle Zahlen, die größer oder gleich 0und kleiner oder gleich sind, Nund prüft, ob diese Zahl im Quadrat gleich ist N.

0 '
quelle
1
@ DLosc fertig !
0 '15.
5

MathGolf , 1 Byte

°

Probieren Sie es online!

Ich denke nicht, dass eine Erklärung benötigt wird. Ich habe die Notwendigkeit eines "is perfect square" -Operators erkannt, bevor ich diese Herausforderung sah, da die Sprache für mathematikbezogene Golfherausforderungen ausgelegt ist. Gibt 0 oder 1 zurück, da MathGolf Ganzzahlen zur Darstellung von Booleschen Werten verwendet.

maxb
quelle
4

PHP, 21 Bytes

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

Wenn die Quadratwurzel keine ganze Zahl ist, (-1)**$argn**.5ist NAN.

user63956
quelle
Wie führe ich das aus?
Titus
@Titus Mit der -FFlagge und Pipeline: echo 144 | php -F script.php.
user63956
Ah, ich fhabe diesen Brief geschrieben. Vielen Dank.
Titus
4

Ruby, 25 Bytes

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

Es gibt wahrscheinlich einen kürzeren Weg, aber das ist alles, was ich gefunden habe.

Probieren Sie es online!

Gregory
quelle
Willkommen bei PPCG :) Könnten Sie bitte ein TIO (oder ein Äquivalent) hinzufügen ?
Shaggy
Vielen Dank, dass Sie das TIO hinzugefügt haben. Es scheint jedoch keine Ausgabe zu liefern.
Shaggy
Mein schlechtes, ich habe es aktualisiert.
Gregory
Nein, funktioniert immer noch nicht.
Shaggy
3

CJam , 8 Bytes

ri_mQ2#=

Probieren Sie es online!

Erläuterung

Ganzzahlige Quadratwurzel, Quadrat, vergleiche mit der ursprünglichen Zahl.

Luis Mendo
quelle
Ich denke , nach diesem , müssen Sie nicht die ersten 2 Bytes
Chromium
Und alternativ die Idee der Verwendung dieser Antwort können Sie tun mq1%0=, die auch 6 Bytes
Chromium
@ Chromium Danke, aber in diesem Fall muss ich {... }den Code zu einer Funktion machen, damit die gleiche Bytezahl
Luis Mendo
Eigentlich bin ich ein bisschen verwirrt, ob ich geschweifte Klammern anfügen soll oder nicht. Denn wenn Sie sie nicht hinzufügen, handelt es sich tatsächlich um ein Programm, das zulässig ist.
Chromium
@Chromium Ein Programm muss seine Eingaben übernehmen, riin diesem Fall ist dies erforderlich
Luis Mendo
3

Mathematica, 13 Bytes

AtomQ@Sqrt@#&

Probieren Sie es online!

J42161217
quelle
Nein eingebaut? Odd ....
TheLethalCoder
1
Sie können AtomQanstelle von verwenden IntegerQ.
Martin Ender
1
Natürlich zottelig ...
J42161217
1
Sie können immer noch verwenden @*.
Martin Ender
4
AtomQ@*Sqrtist ein Synonym für AtomQ@Sqrt@#&. Zum Beispiel, AtomQ@*Sqrt@4kehrt zurück Trueund AtomQ@*Sqrt@5kehrt zurück False. (Aus Gründen des Vorrangs AtomQ@*Sqrt[4]funktioniert nicht richtig und kehrt zurück AtomQ@*2.)
Greg Martin
3

AWK , 27 + 2 Bytes

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

Probieren Sie es online!

Fügen Sie +2Bytes hinzu, um das -MFlag für eine beliebige Genauigkeit zu verwenden. Ursprünglich habe ich den Zeichenfolgenvergleich verwendet, weil große verglichene Zahlen gleich sind, obwohl dies nicht der sqrtFall war , aber auch ungenaue Werte zurückgaben. 2^127-2sollte kein perfektes Quadrat sein.

Robert Benson
quelle
3

T-SQL, 38 Bytes

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

Sucht nach einem Dezimalpunkt in der Quadratwurzel. IIFist MS SQL-spezifisch, getestet und funktioniert in MS SQL Server 2012.

Die Eingabe erfolgt gemäß unseren Eingaberegeln in Spalte a der bereits vorhandenen Tabelle t .

BradC
quelle
3

Ohm , 2 Bytes

Ʋ

Verwendet CP-437 Codierung.

Erläuterung

Implizite Eingabe -> Integriertes perfektes Quadrat -> Implizite Ausgabe ...

Roman Gräf
quelle
3

Java 8, 20 Bytes

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

Input ist ein int .

Probieren Sie es hier aus.

Kevin Cruijssen
quelle
Nicht umstritten: In der Frage steht explizit "Bei einer Ganzzahl n (wobei n> = 0)". Die kürzeste Antwort ist die beste. Bearbeiten: wird nicht +1, bis die kürzeste Antwort nicht die erste ist: p
Olivier Grégoire
@ OlivierGrégoire Hmm, das ist eine gute Sichtweise. Aber man würde immer noch nicht wissen , ob es eine ist int, long, short. Und bei Fragen, bei denen nach einer Ganzzahl gefragt wird, das Eingabeformat jedoch flexibel ist, verwende ich manchmal eine Zeichenfolge-Eingabe, um einige Bytes zu speichern. Persönlich denke ich, dass die Verwendung n->in Ordnung ist, und Sie sollten nur angeben, was der Typ ist, aber anscheinend sind nicht alle damit einverstanden. Auf der anderen Seite ist es sinnvoller , von einem Java 7-Antwortverlauf zu kommen, von int c(int n){return ...;}zu (auch wenn ich persönlich den zweiten vorzuziehen habe, da dieser natürlich kürzer ist). (int n)->...n->...
Kevin Cruijssen
2
@ OlivierGrégoire Ok, ich habe es geändert. Nachdem ich die Diskussion in dieser Antwort gelesen hatte , kam ich zu dem Schluss, dass die Angabe, dass die Eingabe eine Ganzzahl in Java ist, keinen Unterschied dazu darstellt, dass die Eingabe eine Liste von zwei Strings in CJam oder ein Zellenarray von Strings in MATL ist .
Kevin Cruijssen
3

Add ++ , 24 13 11 Bytes

+?
S
%1
N
O

Probieren Sie es online!

Ich habe die klobige Funktion oben entfernt und sie in den Hauptteil der Frage geschrieben, um 11 Bytes zu entfernen.

Da der erste Abschnitt bereits weiter unten erläutert wird, wollen wir nur herausfinden, wie das neue Teil funktioniert

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

Alte Version, 24 Bytes

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

Probieren Sie es online!

Die Funktion oben ( D,i,@,1@%!) ist der Hauptteil des Programms. Gehen wir also näher darauf ein.

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
Caird Coinheringaahing
quelle
3

Python 3 , 28 27 25 Bytes

  • Dank an @mdahmoune für 1 Byte: Vergleiche int von root squared mit original
  • 2 Bytes gespart: Lambda verkürzt
lambda x:int(x**.5)**2==x

Probieren Sie es online!

officialaimm
quelle
1
was ist mit f = lambda x: int (x **. 5) ** 2 == x 27bytes
mdahmoune