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

@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!


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.


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

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


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.


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


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

@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.)


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 ( /\./).


5

05AB1E , 4 Bytes

LnÂčĂ„

Probieren Sie es online!


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!


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.


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


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

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.


4

PHP, 21 Bytes

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

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


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!


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.


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!


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.


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 .


3

Ohm , 2 Bytes

ÆÂČ

Verwendet CP-437 Codierung.

ErlÀuterung

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


3

Java 8, 20 Bytes

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

Input ist ein int .

Probieren Sie es hier aus.


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

Durch die Nutzung unserer Website bestÀtigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.