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 n
ein 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
true
oderfalse
,1
oder0
) - truthy , wenn der Eingang ein perfekter Platz, Falsey wenn es nicht. - Dies ist Codegolf, 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
code-golf
math
number
decision-problem
Zottelig
quelle
quelle
18014398509481982
(2**54-2
), das ist mit einem Doppel darstellbaren und verursacht Antworten , die Verwendungsqrt
zum Scheitern verurteilt.2**54-2
es immer noch größer ist als ein Double, zumindest in JavaScript18014398509481982 > 9007199254740991
2**54-2
in eine JS-Konsole ein und vergleichen Sie, was Sie erhalten18014398509481982
(den genauen Wert). JS gibt den exakten Wert aus, ist also2**54-2
mit einem Double darstellbar. Wenn Sie das immer noch nicht überzeugt, nehmen Sie die Binärdaten0100001101001111111111111111111111111111111111111111111111111111
, interpretieren Sie sie als IEEE-754-Gleitkomma mit doppelter Genauigkeit und sehen Sie, welchen Wert Sie erhalten.Antworten:
Neim , 2 Bytes
Erläuterung:
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!
quelle
Gelee , 2 Bytes
Probieren Sie es online!
quelle
TI-Basic, 4 Bytes
Überprüft einfach, ob die Quadratwurzel eine Ganzzahl ist, indem nach einem Bruchteil / Dezimalteil ungleich Null gesucht wird.
quelle
C #, 27 Bytes
Ein richtigerer / genauerer Weg , dies zu tun, wäre:
quelle
...<int>==0
ist...!<int>
ich denkeJavaScript (ES6), 13 Byte
Gibt true zurück, wenn die Quadratwurzel von n eine ganze Zahl ist.
Snippet:
quelle
dc, 9
Gibt 1 für wahr und 0 für falsch aus.
Probieren Sie es online aus .
dc
Der^
Exponentiationsbefehl von Note gibt 0 0 = 1 und 0 n = 0, wobei n> 0 ist.quelle
dc
solch eine geniale Verwendung.Retina , 18 Bytes
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)*$
.quelle
2
,6
oder auf andere Nummern des Formularsn^2-n
. ;) (Eine Möglichkeit, diese Erklärung für die gleiche^(^1|11\1)*$
(^|1\1)+$
, denke ich?+
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.C (gcc), 30 Bytes
Probieren Sie es online!
C 34 Bytes
Probieren Sie es online!
C 33 Bytes
Probieren Sie es online!
quelle
MATL ,
54 BytesVielen Dank an Luis, der meinen um ein Byte längeren Code um zwei Byte verkürzt hat, damit er der kürzeste ist.
Probieren Sie es online aus
Erläuterung:
Alte Antwort:
Probieren Sie es online!
quelle
mod(2**127-, 1000)
. Es sei denn, die vier letzten Ziffern sind 0 ....t:Um
. Das funktioniert für Eingaben bis zu2^53
, aufgrund der begrenzten GleitkommapräzisionU: str2num / string to array / square
. Ich wusste, dass es eine quadratische Funktion geben musste, aber ich konnte sie nicht finden ...Python 3 ,
4038 BytesDanke an squid für das Speichern von 2 Bytes!
Probieren Sie es online!
Zu langsam, um eine Antwort
2147483647
innerhalb 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
OverflowError
eine Möglichkeit besteht,range
wenn Sie es mit großen Eingaben versuchen. (AMemoryError
wäre wahrscheinlich auch in Python 2, auch wegenrange
.)quelle
Perl 5 , 14 Bytes
13 Byte Code +
-p
Flag.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 (
/\./
).quelle
05AB1E , 4 Bytes
Probieren Sie es online!
quelle
4111817668062926054213257208
2**127-1
eine Mersenne-Primzahl).Python 3 , 19 Bytes
Probieren Sie es online!
quelle
4111817668062926054213257208
.lambda n:int(n**.5)**2==n
sqrt
) an Werten, die außerhalb des Bereichs eines Doppelten liegen, wie2**4253-1
.%1
ist definitiv<1
, also würde dein vorschlag für alle eingaben true zurückgeben. Beachten Sie, dass diesn**.5
ein Schwimmer ist.SageMath , 9 Bytes
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.
quelle
Japt , 3 Bytes
Probieren Sie es online!
Scheint
2**54-2
im Japt Interpreter gut zu funktionieren , schlägt aber auf TIO aus irgendeinem Grund fehl ...quelle
2**127-1
eine Mersenne-Primzahl).2**127-1
liegt gut im Bereich eines Doppels.2**53-1
?2**127-1
als Zahl darstellen kann. Der nächste, den es bekommen kann, ist2**127
.Haskell,
2624 BytesProbieren Sie es online!
Prüft, ob n in der Liste aller Quadrate von
0
bis enthalten istn
.quelle
f n=or[i*i==n|i<-[0..n]]
Prolog (SWI) , 27 Bytes
Probieren Sie es online!
Erläuterung
Durchsucht alle Zahlen, die größer oder gleich
0
und kleiner oder gleich sind,N
und prüft, ob diese Zahl im Quadrat gleich istN
.quelle
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.
quelle
PHP, 21 Bytes
Wenn die Quadratwurzel keine ganze Zahl ist,
(-1)**$argn**.5
istNAN
.quelle
-F
Flagge und Pipeline:echo 144 | php -F script.php
.f
habe diesen Brief geschrieben. Vielen Dank.Ruby, 25 Bytes
Es gibt wahrscheinlich einen kürzeren Weg, aber das ist alles, was ich gefunden habe.
Probieren Sie es online!
quelle
CJam , 8 Bytes
Probieren Sie es online!
Erläuterung
Ganzzahlige Quadratwurzel, Quadrat, vergleiche mit der ursprünglichen Zahl.
quelle
mq1%0=
, die auch 6 Bytes{
...}
den Code zu einer Funktion machen, damit die gleiche Bytezahlri
in diesem Fall ist dies erforderlichMathematica, 13 Bytes
Probieren Sie es online!
quelle
AtomQ
anstelle von verwendenIntegerQ
.@*
.AtomQ@*Sqrt
ist ein Synonym fürAtomQ@Sqrt@#&
. Zum Beispiel,AtomQ@*Sqrt@4
kehrt zurückTrue
undAtomQ@*Sqrt@5
kehrt zurückFalse
. (Aus Gründen des VorrangsAtomQ@*Sqrt[4]
funktioniert nicht richtig und kehrt zurückAtomQ@*2
.)APL (Dyalog) , 8 Bytes
Probieren Sie es online!
0=
[ist] Null gleich1|
der Modul-1 (dh der Bruchteil) von*∘.5
das Argument wurde auf die Hälfte angehobenquelle
AWK , 27 + 2 Bytes
Probieren Sie es online!
Fügen Sie
+2
Bytes hinzu, um das-M
Flag für eine beliebige Genauigkeit zu verwenden. Ursprünglich habe ich den Zeichenfolgenvergleich verwendet, weil große verglichene Zahlen gleich sind, obwohl dies nicht dersqrt
Fall war , aber auch ungenaue Werte zurückgaben.2^127-2
sollte kein perfektes Quadrat sein.quelle
T-SQL, 38 Bytes
Sucht nach einem Dezimalpunkt in der Quadratwurzel.
IIF
ist 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 .
quelle
Ohm , 2 Bytes
Verwendet
CP-437
Codierung.Erläuterung
Implizite Eingabe -> Integriertes perfektes Quadrat -> Implizite Ausgabe ...
quelle
Java 8, 20 Bytes
Input ist ein
int
.Probieren Sie es hier aus.
quelle
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 Verwendungn->
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, vonint c(int n){return ...;}
zu (auch wenn ich persönlich den zweiten vorzuziehen habe, da dieser natürlich kürzer ist).(int n)->...
n->...
R, 15
^ .5 ist weniger Bytes als sqrt (). %% 1, der Modul, ergibt 0, wenn die Antwort ein Interger ist. scan () nimmt Benutzereingaben entgegen.
http://www.tutorialspoint.com/execute_r_online.php?PID=0Bw_CjBb95KQMSm1qVktIOUdSSDg
quelle
Add ++ ,
241311 BytesProbieren 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
Alte Version, 24 Bytes
Probieren Sie es online!
Die Funktion oben (
D,i,@,1@%!
) ist der Hauptteil des Programms. Gehen wir also näher darauf ein.quelle
Python 3 ,
28 2725 BytesProbieren Sie es online!
quelle