仅使用加法和减法计算所有x的平方


11

目标是计算所有平方,直到x加减乘。

规则:

  1. 该代码必须是一个函数,该函数使用要生成的平方总数,并返回包含所有这些平方的数组。
  2. 不能使用字符串,结构,乘法,除法或内置函数来计算平方。
  3. 您只能使用数组,整数(整数),加法,减法。禁止其他运算符!

这是一个问题,因此以字节为单位的最短代码胜出!


从本质上讲,这是用于递增平方的最优化算法 -或至少将获得几乎相同的答案。
彼得·泰勒

2
@PeterTaylor不,这是不一样的,因为这是最优化的平方递增算法,但是我的问题只要求加减。
牙刷

这是同一回事。见证人:此问题的当前答案与上一个问题的绝大多数答案完全相同。
彼得·泰勒

@PeterTaylor我可能会有偏见,但我真的不认为这完全相同。
牙刷

3
这个问题可能已经在其他地方有了答案,但这并不能使该问题重复另一个问题。
Blacklight Shining

Answers:



6

C,55 52字节

int s(int n,int*r){for(int i=0,j=-1;n--;*r++=i+=j+=2);}

只是求和奇数

  • n:要计算的平方数
  • r:用于存储结果的输出数组
  • j:取连续值1,3,5,7,...
  • ij在每次迭代时增加

编辑

使用隐式int声明(> C99)可以保存4个字符,但是这花费1个字符,因为for初始化程序不能在> C99中包含声明。然后代码变成

s(int n,int*r){int i=0,j=-1;for(;n--;*r++=i+=j+=2);}

用法

void main() {
    int r[20];
    s(20, r);
    for (int i = 0; i < 20 ; ++i) printf("%d\n", r[i]);
}  

输出量

1
4
9
16
25
36
49
(...)
361
400

1
那个逻辑很棒!您应得+1
Mukul Kumar 2014年

5

GolfScript,17个字符

{[,{.+(1$+}*]}:F;

用法(另请参见在线示例):

10 F     # => [0 1 4 9 16 25 36 49 64 81]

注意: *是循环,而不是乘法运算符。


好; 它是如何工作的?
牙刷

@toothbrush ,接受输入并将其转换为数组[0 1 ... n-1]。然后*将给定的代码块注入数组。该块首先将当前项加倍(.+)减去一个((),然后加上先前的结果1$+(换句话说,2j-1加到先前的平方数)。[]封装所有内容以返回新数组。
霍华德

大!我不了解GolfScript,所以我想知道它是如何工作的。
牙刷

5

Windows Batch,115字节

setlocal enabledelayedexpansion&for /l %%i in (1 1 %1)do (set a=&for /l %%j in (1 1 %%i)do set /a a+=%%i
echo.!a!)

应该将其放置在批处理文件中,而不是从cmd运行,并将列表输出到控制台。它需要从第一个命令行参数创建的平方数。在大多数情况下,它&代替换行符使用,但是仍然需要一个,它算作两个字节。

需要启用延迟变量扩展,可以使用来完成cmd /v:on。假设不是,setlocal enabledelayedexpansion&则在开始时需要额外的内容(没有脚本,脚本为83字节)。


4

哈斯克尔-30

f n=scanl1(\x y->x+y+y-1)[1..n]

这利用了以下事实: (n+1)^2=n^2+2n+1


4

Perl,27个字节

sub{map{$a+=$_+$_-1}1..pop}

数学:

数学

调用该函数以打印10个正方形的脚本:

#!/usr/bin/env perl
$square = sub{map{$a+=$_+$_-1}1..pop};
use Data::Dumper;
@result = &$square(10);
print Dumper \@result;

结果:

$VAR1 = [
          1,
          4,
          9,
          16,
          25,
          36,
          49,
          64,
          81,
          100
        ];

编辑:

  • 匿名函数(−2个字节,感谢skibrianski
  • pop而不是shift(−2个字节,感谢skibiranski

我认为没有理由需要为您的潜艇命名。IOW“ sub {map {$ a + = $ _ + $ _- 1} 1..shift}”在我看来是合法的,并且为您节省了两个字符。
skibrianski 2014年

@skibrianski:匿名函数也是一个函数。缺点是该函数的调用比较麻烦。
Heiko Oberdiek

是的,但是就在呼叫者身上。其他语言中也有定义匿名子的条目,所以我认为您很安全=)
skibrianski 2014年

而且,由于只有一个参数,因此可以使用pop()而不是shift()节省另外2个字符。
skibrianski 2014年

@skibrianski:好的,谢谢。
Heiko Oberdiek 2014年

4

JavaScript-32个字符

for(a=[k=i=0];i<x;)a[i]=k+=i+++i

假设x存在一个变量,并a为值创建一个正方形数组1..x

ECMAScript 6-27个字符

b=[f=i=>b[i]=i&&i+--i+f(i)]

调用f(x)b使用值的平方填充数组0..x


我要问... i+++i最后...?
WallyWest'3

2
k+=i+++i是相同的k += i + (++i),其是相同的k+=i+i+1,随后i=i+1
MT0

哦,这真是个天才……如果需要,我必须在下一个代码高尔夫中实现!:)
WallyWest 2014年

您可以通过将函数声明移到数组内部来保存一个字符(例如b=[f=i=>b[i]=i&&i+--i+f(i)])。
牙刷

谢谢-通过将内容四舍五入以删除分号,也将一个字符保存在最佳答案中。
MT0

4

朱莉娅-33

任何平方数都可以用奇数之和写成:

julia> f(x,s=0)=[s+=i for i=1:2:(x+x-1)];f(5)
5-element Array{Int64,1}:
  1
  4
  9
 16
 25

嗨,欢迎来到CG.se!答案很简洁。从未听说过朱莉娅,但看起来很有趣。
乔纳森·范·马特雷

朱莉娅不是“ 2x”乘法吗?您可以说x + x,这只会花费您一个字节。
Glenn Randers-Pehrson,2014年

您是正确的(没有通知),已编辑。
CCP

我对julia尚不熟悉,但在docs.julialang.org/en/release-0.2在线手册中进行了查询,发现“数值字面系数:为了使常用的数字公式和表达式更清晰,Julia允许使用变量紧跟在数字文字之后,表示相乘。” 是的,2x是一个乘法。
2014年

2

C ++ 99 81 78 80 78

int* f(int x){int a[x],i=1;a[0]=1;while(i<x)a[i++]=a[--i]+(++i)+i+1;return a;}  

我第一次尝试代码高尔夫球

该代码基于
a = 2 xn-1
,其中n是项数,而a是第n
,3、5、9、11、13,..........
的前2个项之和= 2平方

前3个项的总和= 3的平方
,依此类推...


2
我认为您可以{}for循环后删除括号,因为只有一条语句。这样可以将您的字符数减少2
user12205 2014年

1
如果您在除main()之外的某些函数中声明了非恒定大小的数组,则可以接受
Mukul Kumar 2014年

1
此代码具有未定义的行为。
Kerrek SB 2014年

1
并返回指向在返回过程中被破坏的堆栈上数据的指针。
VX 2014年

1
@MukulKumar addition, subtraction,我只使用这些
mniip

2

DCPU-16汇编(90字节)

我在汇编中为一个虚构的处理器编写了此程序,因为为什么不呢?

:l
ADD I,1
SET B,0
SET J,0
:m
ADD J,1
ADD B,I
IFL J,I
SET PC,m
SET PUSH,B
IFL I,X
SET PC,l

该数字预期在X寄存器中,而其他寄存器预期为0。结果被压入堆栈,由于16位体系结构,一旦达到65535,它将中断。您可能想SUB PC, 1在最后添加一个进行测试。编译后,程序应为20字节(10个字)。


2

哈斯克尔

f x=take x [iterate (+y) 0 !! y | y<- [0..]]

这基本上是发明乘法,自己使用乘法,并将其映射到所有数字上。f 10= [0,1,4,9,16,25,36,49,64,81]。也f 91= [0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681,1764,1849,1936,2025,2116,2209,2304,2401,2500,2601,2704,2809,2916,3025,3136,3249,3364,3481,3600,3721,3844,3969,4096,4225,4356,4489,4624,4761,4900,5041,5184,5329,5476,5625,5776,5929,6084,6241,6400,6561,6724,6889,7056,7225,7396,7569,7744,7921,8100]


您可以将演示扩展到略大于10的大小吗?
Glenn Randers-Pehrson 2014年

2

哈斯克尔,34/23

n#m=m+n:(n+2)#(m+n)
f n=take n$1#0

或者,如果可以的话:

f n=scanl1(+)[1,3..n+n]

输出:

λ> f 8
[1,4,9,16,25,36,49,64]

1

Javascript 47

function f(n,a){return a[n]=n?f(n-1,a)+n+n-1:0}

r=[];f(12,r);console.log(r) 返回:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144]


大!在EcmaScript 6中:f=(n,a)=>a[n]=n?f(n-1,a)+n+n-1:0
牙刷

1
我真的等不及ECMAScript 6真正进入主流用途了。那将是学习它的完美借口。
Isiah Meadows'2

1
因为22.版本的ECMAScript 6规范的箭功能部分已经在FireFox
MT0

1

Smalltalk,52岁

f:=[:n||s|(s:=1)to:n collect:[:i|x:=s.s:=s+i+i+1.x]]

返回一个新数组(即不填充或添加到现有数组)。

呼叫:

f值:10

->#(1 4 9 16 25 36 49 64 81 100)


1

蟒蛇-39

a=0
for i in range(5):a+=i+i+1;print(a)

5用任何值替换。有什么建议么?


1

重击- 92 85 62 61 59 57

declare -i k=1;for((i=0;i++<$1;k+=i+i+1));do echo $k;done

结果:

$ ./squares.sh 10
1
4
9
16
25
36
49
64
81
100

编辑:我用@mniip的Haskell解决方案中的算法替换了内部循环。


1

与上述相同,在APL和J中:

APL:F←{+\1+V+V←¯1+⍳⍵}(17个字符)适用于大多数APL变体(在此处尝试)

NGN APL甚至更少(只有14个字符):(F←{+\1+V+V←⍳⍵}请参阅此处

J:f=:+/\@(>:@+:@:i.)(18个字符)

编辑: APL中的更好解决方案:F←{+\¯1+V+V←⍳⍵}(15个字符)


1

C#(82)

int[] s(int n){int i,p=0;var r=new int[n];while(i<n){p+=i+i+1;r[i++]=p;}return r;}

1

C#-93

int[]s(int l){int[]w=new int[l];while(l>=0){int i=0;while(i<l){w[l-1]+=l;i++;}l--;}return w;}

当从同一类的另一个方法调用时,将返回数组- [1,4,9,16,25,36...],直到l第th个元素。


你尝试之间移除空间int[]sq?我不了解C#,但我认为它应该可以工作。
user12205 2014年

不,那行不通。第一个int []是方法“ sq”的返回类型。我可以将方法名称简化为“ s” :)
Rajesh

我的意思是使用int[]sq代替int[] sqint[]res代替int[] res。这可以帮助您节省两个字符,与此同时我也没有遇到任何编译错误。你也应该使用单字符标识符sq,并res为你的建议。
user12205 2014年

您的答案似乎有问题
user12205 2014年

缩进4个空格的代码,以将其放入具有等宽字体的代码块中。
luser droog 2014年

1

Fortran II | IV | 66 | 77, 134 122 109 105

  SUBROUTINES(N,M)
  INTEGERM(N)
  K=0
  DO1I=1,N
  K=K+I+I-1
1 M(I)=K
  END

编辑:删除内部循环,并使用@mniip的Haskell算法。

编辑:验证子例程和驱动程序是有效的Fortran II和IV

司机:

  INTEGER M(100)
  READ(5,3)N
  IF(N)5,5,1
1 IF(N-100)2,2,5
2 CALLS(N,M)
  WRITE(6,4)(M(I),I=1,N)
3 FORMAT(I3)
4 FORMAT(10I6)
  STOP  
5 STOP1
  END

结果:

$ echo 20 | ./a.out
   1     4     9    16    25    36    49    64    81   100
 121   144   169   196   225   256   289   324   361   400

@mniip,谢谢,我用您的代码替换了我的内循环。
2014年

1

的Python-51

在这里,我根据规则定义了一个函数。

使用sum奇数:

f=lambda n:[sum(range(1,i+i+3,2))for i in range(n)]

这仅使用sum(执行加法的内置函数)和range(使用加法创建数组的内置函数)。如果您反对sum,我们可以通过以下方式实现reduce

def g(n):v=[];reduce(lambda x,y:v.append(x) or x+y,range(1,i+i+3,2));return v

1

PHP,92字节

当然,这需要启用“短标签”选项(在开始时删除3个字节)。

<? $x=100;$a=1;$r=0;while($r<=$x){if($r){echo"$r ";}for($i=0,$r=0;$i<$a;$i++){$r+=$a;}$a++;}

输出:

1 4 9 16 25 36 49 64 81 100 

1

第四-48个字节

: f 1+ 0 do i 0 i 0 do over + loop . drop loop ;

用法:

7 f

输出:

0 1 4 9 16 25 36 49
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.