スクエアになるのはヒップ


44

チャレンジ

つまり、平方数や他の形状の数を扱う多くの課題がある一方で、単純に尋ねる課題はないようです。

整数n(where n>=0)が入力として与えられるnと、完全な正方形の場合は真の値を返し、そうでない場合は偽の値を返します。


ルール

  • 標準のI / Oルールで許可されている限り、合理的で便利な手段で入力を取得できます
  • 選択した言語がネイティブに処理できる以上の入力を処理する必要はなく、浮動小数点の不正確さを引き起こすこともありません。
  • 出力は、2つの一貫した真実/偽の値(たとえば、trueまたはfalse1または0)のいずれかでなければなりません。入力が完全な正方形の場合は真実、そうでない場合は偽です。
  • これはので、バイト数が最も少なくなります。

テストケース

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false

@Neil私は自分の間違いに気付いた。その提案を撤回し、代わりに180143985094819822**54-2)を提供します。これ doubleで表現可能であり、使用sqrtする回答を失敗させます。
メゴ

私はおそらく間違っているか@Megoちょうどあなたが言っている誤解が、私は確信している2**54-2、少なくともJavaScriptで、二重の缶が安全に取り扱うよりもまだ大きい18014398509481982 > 9007199254740991
トム・

@Mego制限値は9007199515875288であると思います。94906267の2乗ではありません。これはdoubleで表現できないためですが、その平方根を取得すると、その整数が結果として得られます。
ニール

@Tom 2**54-2JSコンソールに入力し、取得したもの18014398509481982(正確な値)と比較します。JSは正確な値を出力するため2**54-2、doubleで表現できます。それでも納得できない場合は、バイナリデータを取得0100001101001111111111111111111111111111111111111111111111111111し、IEEE-754倍精度浮動小数点数として解釈し、取得する値を確認してください。
メゴ

3
申し訳ありませんが、昼食のために立ち去りました...そして、それはエスカレートしました!そこで、これは素晴らしく、簡単な挑戦だと思いました!選択した言語で浮動小数点の不正確さを引き起こす入力を処理する必要がないというルールを追加することで対応できますか?
シャギー

回答:


27

ニーム、2バイト

q𝕚

説明:

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

「無限」と言うとき、longsの最大値(2 ^ 63-1)に達するまでを意味します。ただし、Neimは(ゆっくりと)理論的に無限に大きなBigIntegerに移行しています。

それを試してみてください!


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
デニス

面白い。したがって、これはリストを事前にバッファリングしますか、それとも終了するまで入力の存在をチェックし続けるジェネレータ/イテレータですか?
パトリックロバーツ

@PatrickRobertsチャットで話せますか?
Okx

確かに、The Nineteenth Byteで pingしてください。私は時々そこにいます。
パトリックロバーツ

まあ、これは...本当に機能
クロム


8

TI-Basic、4バイト

not(fPart(√(Ans

ゼロ以外の小数/小数部分を探すことで、平方根が整数かどうかを単純にチェックします。


TIO(または同等のもの)を追加できますか?
シャギー

@Shaggy私は何もないと思います。TI-Basicはプロプライエタリであり、TIの電卓および電卓からROMを実行するエミュレータでのみ実行されるため、電卓を所有していない場合は合法的にTI-Basicを使用できません。
アダム

1
@Shaggy ROMがある場合は、エミュレータ(私の好みはjstified)を使用して、これをオンラインで試すことができます。
ティムテック

8

C#、27バイト

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

これを行うためのより正確で正確な方法は次のとおりです。

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

double.Epsilonは、このタイプのチェックには役に立ちません。tl; dr:2以上の数値を比較する場合、Double.Epsilonは基本的にゼロと同じです。100で乗算しても、それは少しだけ遅延します。
ロバートフレイザー

@RobertFraser私はリンクされたSOの投稿を読んだだけで、あまり読みませんでした。いずれにせよ、数字が大きいほど役に立たないだけでは役に立たないわけではありません。
TheLethalCoder

...<int>==0である...!<int>私が考える
スタン・ストラム

@StanStrum C#ではありません
TheLethalCoder

7

JavaScript(ES6)、13バイト

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

nの平方根が整数の場合、trueを返します。

スニペット:

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

真実の場合は1、偽の場合は0を出力します。

オンラインでお試しください

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.

Note dc^累乗コマンドは0 0 = 1と0 n = 0 を与えます(n> 0)。


綺麗な!dcそのような独創的な方法で使用するための+1 。
ワイルドカード

6

網膜、18バイト

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

オンラインでお試しください!@MartinEnderのこの数字は三角形ですか?ただし、6バイトのコストで基本変換が含まれます。

この数字は三角形ですか?ゼロを三角数としてサポートするために必要な何らかの不可解な理由ではなかったので、適応の一部は?、先頭の1をオプションにするためにa を追加し、グループが空の文字列と一致するようにして、入力をゼロにすることでした。ただし、空の文字列に一致すると、+演算子は繰り返しを停止し、空の文字列に貪欲に一致し続けると発生する無限ループを回避します(結局、^1?一致し続けるでしょう)。これは、グループ内の他の選択肢と一致することさえもしないため、2、6、12などの一致を回避することを意味します。@ MartinEnderが指摘しているように、空の文字列と一致しながら、同じバイトカウントに対してグループをオプションにしながら、開始時に一致を固定します^(^1|11\1)*$


これがなぜ一致しないのか26またはフォームの他の数字の説明を楽しみにしているn^2-n。;)(同じバイトカウントの説明を避ける方法は、^(^1|11\1)*$。)
Martin Ender

@MartinEnderあなたが使用できなかったのと同じ理由(^|1\1)+$、私は思う?
ニール

はい、そのとおり。ほとんどの人はおそらく三角形の答えに関する私のコメントを読んでいないので、おそらく言及するのが良いだろうと思った)。
マーティンエンダー

レコード+の場合、の場合など、空の代替が存在しなくなった場合にもループは停止し((?(1)11\1|1?))+ます。空の反復があると、空かどうかに関係なく、それ以上の反復は試行されません。
マーティンエンダー

@MartinEnder確かに、「すぐに一致した」のではなく、「一致した」という意味でした。一定。
ニール


6

MATL5 4バイト

1バイト長いコードを2バイト減らして最短にしたLuisに感謝します。

t:Um

オンラインで試す

説明:

         % 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

古い答え:

X^1\~

オンラインでお試しください!

        % 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私は同意しません。MATLはできませんmod(2**127-, 1000)。ない限り4つの最後の桁は0です ....
Stewieグリフィン

を使用することもできますt:Um。入力のためのその作品まで2^53による浮動小数点限ら精度、
ルイスMendo

これはあなたの編集に似ており、少し短くなっているようです:
ルイスメンドー

よく隠された正方形のコマンド!U: str2num / string to array / square。...私は、正方形の機能があるとは知っていましたが、私はそれを見つけることができませんでした
Stewieグリフィン

1
@cairdcoinheringaahingそれは部分的に意図的でした。私は2つのソリューションがありました。1つは5バイトで、もう1つは6バイトでした。6.だから私は彼に2つのバイトのおかげで保存されたとルイスは1から2つのバイトオフgolfedが、私は唯一の...スコアにバイトを保存
Stewieグリフィン

6

Pythonの340の 38バイト

2バイトを節約してくれたsquidに感謝します!

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

オンラインでお試しください!

2147483647妥当な時間内に回答を返すのが遅すぎる。(ただし、バイトを消費しないため、メモリを節約するためにジェネレータを使用して記述されています。)

Python 2でも動作しますが、巨大な入力で試してみるとOverflowError可能性がありrangeます。(A MemoryErrorはPython 2でも同様である可能性が高いでしょうrange。)



5

たとえば、多数では機能しません4111817668062926054213257208
-Emigna

@Emignaああ、それは長いと考えられているからですか?私は05AB1Eは、Python 3を使用することを考えた
エリックOutgolfer

大きな入力では失敗します(指定された入力は2**127-1、メルセンヌ素数です)。
メゴ

Python 3を使用します。問題は、平方根が大きな数値に対して丸め誤差を与えることです。
エミグナ

@エミグナああ...私はそれから別の方法を理解する必要があると思いますが、難しいことではないはずです。
エリックアウトゴルファー

5

入力が大きい場合は失敗し4111817668062926054213257208ます。
L3viathan

25バイトで修正:lambda n:int(n**.5)**2==n
L3viathan

4
@ L3viathanそれは(を含む解決策とともにsqrt)のようにdoubleの範囲外の値で失敗します2**4253-1
メゴ

@totallyhumanの後のフロート%1は間違いなく<1ですので、あなたの提案はすべての入力に対してtrueを返します。n**.5はフロートであることに注意してください。
リーキー修道女

5

SageMath、9バイト

is_square

オンラインで試す

組み込み関数は、ブリキに書かれていることを正確に行います。Sageはシンボリック計算を使用しているため、IEEE-754フロートを悩ます計算精度エラーはありません。


5

Japt、3バイト

¬v1

オンラインでお試しください!

以下のための仕事の罰金に思える2**54-2JAPT通訳が、何らかの理由でTIOに失敗しました...


大きな入力(入力は2**127-1、メルセンヌ素数)に対して失敗します。
メゴ

@Mego、言語が処理できるよりも大きな数値をソリューションで処理する必要はないのではないでしょうか?
シャギー

@Shaggy Japtは、倍精度浮動小数点数を使用するJavaScriptに基づいています。2**127-1ダブルの範囲内です。
メゴ

2
@Mego JavaScriptの最大の安全な整数ではありません2**53-1か?
トム

3
@Megoただし、JavaScriptの数値の精度は53ビットしかないため、JS は値を数値2**127-1として正確に表すことができません。取得できる最も近いのは2**127です。
-ETHproductions



5

MathGolf、1バイト

°

オンラインでお試しください!

説明は必要ないと思います。言語は数学に関連するゴルフの課題を処理するように設計されているため、この課題を目にする前に、「完璧な正方形」演算子が必要であることがわかりました。MathGolfは整数を使用してブール値を表すため、0または1を返します。


4

PHP、21バイト

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

平方根が整数でない場合は、(-1)**$argn**.5ですNAN


これを実行するにはどうすればよいですか?
タイタス

@Titus -Fフラグとパイプライン:echo 144 | php -F script.php
user63956

ああf、その手紙を書いた ありがとう。
タイタス

4

ルビー、25バイト

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

おそらくもっと短い方法がありますが、それは私が見つけたすべてです。

オンラインでお試しください!


PPCGへようこそ:) これにTIO(または同等のもの)を追加してください。
シャギー

ただし、TIOを追加してくれてありがとう、これは出力を返さないようです。
シャギー

私の悪い、私はそれを更新しました。
グレゴリー

いいえ、まだ動作していません。
シャギー

3

CJam、8バイト

ri_mQ2#=

オンラインでお試しください!

説明

整数の平方根、平方、元の数と比較します。


私はによると推測これ、あなたが最初の2つのバイトを必要としない
クロム

そして、その代わりに、アイデアの使用して、この答えを、あなたが行うことができますmq1%0=また、6バイトである、
クロム

おかげで@Chromiumが、その場合のIを必要としている{... }コードの機能なので、同じバイト数にする
ルイスMendo

実際、中括弧を追加するかどうかは少し混乱しています。Cuzを追加しない場合、それは実際にはプログラムであり、許可されています。
クロム

@Chromium Aプログラムので、その入力を取る必要があるriような場合に必要とされている
ルイスMendo

3

Mathematica、13バイト

AtomQ@Sqrt@#&

オンラインでお試しください!


組み込まれていませんか?奇数....
TheLethalCoder

1
AtomQ代わりに使用できますIntegerQ
マーティンエンダー

1
もちろんシャギー
...-J42161217

1
引き続き使用できます@*
マーティンエンダー

4
AtomQ@*Sqrtはの同義語ですAtomQ@Sqrt@#&。たとえば、をAtomQ@*Sqrt@4返しTrue、をAtomQ@*Sqrt@5返しますFalse。(優先順位のため、AtomQ@*Sqrt[4]正しく動作せず、戻るAtomQ@*2。)
グレッグマーティン


3

AWK、27 + 2バイト

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

オンラインでお試しください!

任意の精度でフラグ+2を使用するためのバイトを追加します-M。私はもともと文字列比較を使用していました。なぜなら、そうではなかったとしても、大きな数が等しいと比較したからsqrtです。2^127-2完全な正方形であってはなりません。


3

T-SQL、38バイト

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

平方根で小数点を探します。 IIFMS SQLに固有であり、テスト済みであり、MS SQL Server 2012で動作します。

入力規則に従って、入力は既存のテーブルtのaにあります



3

Java 8、20バイト

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

入力はintです。

ここで試してみてください。


議論の余地はありません:質問は「整数n(n> = 0)を与える」と明示的に述べています。最短の答えが最高です。編集:最短回答が最初の回答になるまで+1しません:p
オリビエグレゴワール

@OlivierGrégoireうーん、それはそれを見る良い方法です。しかし、あなたはまだそれはだかどうかはわかりませんintlongshort。また、整数を要求するが入力形式は柔軟であるという質問があるため、文字列入力を使用してバイトを節約することがあります。個人的に私は使用することn->は問題ないと思います、そしてあなたはタイプが何であるかを述べるべきですが、明らかに誰もがこれに同意するわけではありません。一方、行くから、Javaの7の回答履歴から来るint c(int n){return ...;}(int n)->...なります以上の意味n->...(私は個人的に当然の短いため、二を好むにもかかわらず)。
ケビンCruijssen

2
@OlivierGrégoireわかりました、変更しました。この答えの議論を読んだ後、私は入力がJavaの整数であると述べることは、入力がCJamの2つの文字列のリストまたはMATL の文字列のセル配列であると述べることと違いがないという結論に達しました
ケビンCruijssen


3

Add ++24 13 11バイト

+?
S
%1
N
O

オンラインでお試しください!

上部の不格好な関数を削除し、質問の本文に書き直して11バイトを削除しました。

最初のセクションはすでに以下で説明されているため、新しい部分がどのように機能するかだけを見てみましょう

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

古いバージョン、24バイト

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

オンラインでお試しください!

上部の関数(D,i,@,1@%!)はプログラムの主要部分であるため、さらに詳しく説明します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.