广场很时髦


44

挑战

因此,嗯,看来,尽管我们面临着很多挑战,需要处理平方数或其他形状的数,但是我们没有一个简单地问:

给定一个整数n(where n>=0)作为输入,如果n是完美平方,则返回真实值,否则返回假值。


规则

  • 只要标准I / O规则允许,您可以通过任何合理,方便的方式进行输入。
  • 您不需要处理的输入量不能超过您选择的语言可以处理的输入量,也不会导致浮点数错误。
  • 输出应该是两个一致truthy / falsey值(例如,一个truefalse10) - truthy如果输入的是一个完美的正方形,falsey如果它不是。
  • 这是因此最低字节数为准。

测试用例

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false

@尼尔我意识到我的错误。我收回这一建议,而是提供180143985094819822**54-2),它可表示用双,并导致答案在使用sqrt失败。
Mego

@Mego我可能错了,或者只是误解了你在说什么,但是我敢肯定2**54-2,至少在JavaScript中,它仍然可以安全地处理两倍以上的问题18014398509481982 > 9007199254740991
Tom

@Mego我认为限制值是9007199515875288。它不是94906267的平方,因为这不能用双精度数表示,但是如果取其平方根,则得出该整数。
尼尔

@Tom 2**54-2在JS控制台中输入内容,然后比较您得到的内容18014398509481982(准确的值)。JS输出精确值,因此2**54-2可以用双精度表示。如果那仍然不能使您信服,请获取二进制数据0100001101001111111111111111111111111111111111111111111111111111,将其解释为IEEE-754双精度浮点数,然后查看得到的值。
Mego

3
抱歉,伙计们,走开吃午饭了……好吧,那已经升级了!我认为这将是一个不错的,简单的挑战!是否添加一条不需要处理输入会导致所选语言的浮点数不正确的规则呢?
毛茸茸的

Answers:


27

Neim,2个字节

q𝕚

说明:

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

当我说“无限”时,我的意思是直到我们达到多头的最大值(2 ^ 63-1)。但是,Neim正在(缓慢地)过渡到理论上无限大的BigIntegers。

试试吧!


评论不作进一步讨论;此对话已转移至聊天
丹尼斯

有趣。那么,这是对列表进行预缓冲吗?还是继续检查输入是否存在直到终止的生成器/迭代器?
Patrick Roberts

@PatrickRoberts我们可以聊天吗?
Okx

当然可以,只是在第十九个字节上对我执行ping操作。我偶尔在那里。
Patrick Roberts

好吧,这是...真正起作用
Chromium


8

TI基本,4字节

not(fPart(√(Ans

通过寻找非零的分数/小数部分,只需检查平方根是否为整数。


您可以添加TIO(或同等水平)吗?
毛茸茸的

@蓬松我不认为有任何。TI-Basic是专有的,只能在TI的计算器和从计算器运行ROM的仿真器中运行,因此,如果您没有计算器,则不能合法使用TI-Basic。
亚当

1
@Shaggy如果您有任何ROM,可以使用仿真器(我的偏爱是jstified)来在线尝试。
Timtech '17

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

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

注意dc^幂运算命令给出0 0 = 1和0 n = 0,其中n> 0。


美丽!+1以dc这种巧妙的方式使用。
通配符

6

视网膜,18字节

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

在线尝试!无耻地改编自@MartinEnder的答案,这个数字是三角形的吗?但包含基本转换的费用​​为6个字节。

请注意,这个数字是三角形的吗?出于某种无法解释的原因,不需要将零作为三角数来支持,因此改编的一部分是添加a ?以使前导1为可选,从而允许该组与空字符串匹配,从而使输入为零。但是,现在已经匹配了空字符串,+操作员将停止重复操作,以避免在不断贪婪地匹配空字符串时发生无限循环(毕竟,^1?肯定会保持匹配)。这意味着它甚至不尝试匹配组中的另一个替代项,从而避免了2、6、12等的匹配。正如@MartinEnder所指出的那样,避免仍然匹配空字符串的一种更简单的方法是:在组开始时锚定匹配项,同时使该组对于相同的字节数是可选的:^(^1|11\1)*$


期待您的解释为什么这不匹配26或表格的其他数字n^2-n。;)(避免对相同字节数进行解释的一种方法是^(^1|11\1)*$。)
Martin Ender

@MartinEnder (^|1\1)+$我认为您不能使用的原因相同?
尼尔

是啊,没错。只是认为这可能会很值得一提,因为大多数人可能没有读过我对三角答案的评论(在这种情况下,这实际上与解决方案正确的原因有关,而不是为什么不能进一步打高尔夫球的原因。 )。
Martin Ender

作为记录,+如果不再有空的替代项,例如,也将停止循环((?(1)11\1|1?))+。一旦有一个空的迭代,它将不会再尝试任何其他迭代,无论它们是否为空。
Martin Ender

@MartinEnder实际上,我的意思是“现在匹配”而不是“立即匹配”。固定。
尼尔


6

MATL5 4字节

感谢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)。除非最后四位数字为0 ....
Stewie Griffin

您也可以使用t:Um。这作品的投入2^53,由于浮点精度的限制
路易斯Mendo

我现在看到的是,这类似于您的编辑,只是短了一点:-)
Luis Mendo

好隐方命令!U: str2num / string to array / square。我知道必须有一个平方函数,但我找不到它……
Stewie Griffin

1
@cairdcoinheringaahing部分出于故意。我有两种解决方案,一种是5字节,另一种是6字节。路易斯用6打出了两个字节。所以多亏了他,我节省了两个字节,但是我只保留了一个字节……
Stewie Griffin

6

Python 340 38个字节

感谢鱿鱼节省了2个字节!

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

在线尝试!

2147483647在合理的时间内返回答案太慢。(但是使用生成器来节省内存,因为它不占用任何字节。)

作品在Python 2还,虽然一个OverflowError是由于一种可能性range,如果你有巨大的投入尝试。(MemoryError由于,在Python 2中也可能会出现A。range


5

Perl 5、14个字节

13个字节的代码+ -p标志。

$_=sqrt!~/\./

在线尝试!

计算平方根,并查看它是否为整数(更精确地说,如果它不包含点(/\./)。


5

05AB1E,4个字节

Ln¹å

在线尝试!


不适用于大量数字,例如4111817668062926054213257208
Emigna

@Emigna哦,因为它被认为很长?我认为05AB1E使用Python 3
埃里克Outgolfer

大型输入失败(给定输入为2**127-1Mersenne素数)。
Mego

它确实使用python3。问题是平方根给出了大数的舍入误差。
Emigna

@Emigna哦...我想那我必须找出另一种方式,应该不难。
暴民埃里克(Erik the Outgolfer)'17年

5

Python 3,19个字节

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

在线尝试!


大量输入失败,例如4111817668062926054213257208
L3viathan

固定为25个字节:lambda n:int(n**.5)**2==n
L3viathan

4
@ L3viathan那(以及所有涉及的解决方案sqrt)在超出double范围之外的值上失败,例如2**4253-1
Mego

@totallyhuman %1绝对是一个浮点数<1,因此您的提案将对所有输入返回true。请注意,这n**.5是一个浮点数。
Leaky Nun

5

SageMath,9个字节

is_square

在线尝试

内置功能完全可以满足锡盒上的要求。由于Sage使用符号计算,因此不会出现困扰IEEE-754浮动的计算精度错误。


5

Japt,3个字节

¬v1

在线尝试!

似乎可以2**54-2Japt解释器中正常工作,但由于某些原因在TIO上失败...


大量输入失败(输入为2**127-1Mersenne素数)。
Mego

@Mego,不是解决方案不需要处理大于该语言能够处理的数字的规范吗?
毛茸茸的

@Shaggy Japt基于JavaScript,它使用双精度浮点数。2**127-1处于两倍范围内。
Mego

2
@Mego JavaScript的最大安全整数不是2**53-1吗?
汤姆(Tom)

3
@Mego但是JavaScript的数字只有53位精度,因此JS 无法将值精确表示2**127-1为数字。它可以获得的最接近的是2**127
ETHproductions

5

Haskell,26个 24字节

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

在线尝试!

检查n是否在从0到的所有正方形的列表中n


1
相同的字节数:f n=or[i*i==n|i<-[0..n]]:)
vroomfondel


5

MathGolf,1个字节

°

在线尝试!

我认为不需要解释。在看到这一挑战之前,我已经意识到需要“完美的平方”运算符,因为该语言旨在处理与数学相关的高尔夫挑战。返回0或1,因为MathGolf使用整数表示布尔值。




3

CJam,8个字节

ri_mQ2#=

在线尝试!

说明

整数平方根,平方,与原始数字比较。


我估计按照这个,你不需要前2个字节

而且,或者,使用此答案的思想,您可以做的mq1%0=也是6个字节
Chromium

@Chromium谢谢,但是在那种情况下,我需要{... }使代码成为函数,所以字节数相同
Luis Mendo

实际上,是否添加花括号让我有些困惑。因为如果您不添加它们,则实际上是一个允许的程序。
Chromium

@Chromium一个程序需要接受其输入,因此ri在这种情况下是必需的
Luis Mendo



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

在平方根中查找小数点。 IIF特定于MS SQL,经过测试,可在MS SQL Server 2012中使用。

根据我们的输入规则输入位于预先存在的表t的a列中。



3

Java 8,20字节

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

输入为int

在这里尝试。


不可争议:问题明确指出“给出整数n(其中n> = 0)”。最短的答案是最好的。编辑:直到最短的答案不是第一个答案时,才会+1:p
OlivierGrégoire17年

@OlivierGrégoire嗯,这是一个很好的观察方法。但你仍然不知道它是否是一个intlongshort。对于他们要求输入整数但输入格式灵活的问题,我有时使用String输入来保存一些字节。我个人认为使用n->是可以的,您应该只声​​明类型是什么,但显然并非所有人都对此表示赞同。另一方面,从Java 7的回答历史来看,从int c(int n){return ...;}(int n)->...n->...(从我个人更喜欢第二个,因为当然较短)更有意义。
凯文·克鲁伊森

2
@OlivierGrégoire好,我已经更改了。在阅读了这个答案中的讨论之后,我得出的结论是,在Java中声明输入是整数,与声明输入是CJam中两个String的列表MATL中字符串的单元格数组没有什么不同。
凯文·克鲁伊森


3

添加++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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.