目标是计算所有平方,直到x
加减乘。
规则:
- 该代码必须是一个函数,该函数使用要生成的平方总数,并返回包含所有这些平方的数组。
- 您不能使用字符串,结构,乘法,除法或内置函数来计算平方。
- 您只能使用数组,整数(整数),加法,减法。禁止其他运算符!
这是一个代码问题,因此以字节为单位的最短代码胜出!
目标是计算所有平方,直到x
加减乘。
规则:
这是一个代码问题,因此以字节为单位的最短代码胜出!
Answers:
int s(int n,int*r){for(int i=0,j=-1;n--;*r++=i+=j+=2);}
只是求和奇数
n
:要计算的平方数r
:用于存储结果的输出数组j
:取连续值1,3,5,7,...i
:j
在每次迭代时增加使用隐式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
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字节)。
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
];
编辑:
pop
而不是shift
(−2个字节,感谢skibiranski)for(a=[k=i=0];i<x;)a[i]=k+=i+++i
假设x
存在一个变量,并a
为值创建一个正方形数组1..x
。
b=[f=i=>b[i]=i&&i+--i+f(i)]
调用f(x)
将b
使用值的平方填充数组0..x
。
i+++i
最后...?
k+=i+++i
是相同的k += i + (++i)
,其是相同的k+=i+i+1
,随后i=i+1
b=[f=i=>b[i]=i&&i+--i+f(i)]
)。
任何平方数都可以用奇数之和写成:
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
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的平方
,依此类推...
{}
在for
循环后删除括号,因为只有一条语句。这样可以将您的字符数减少2
addition, subtraction
,我只使用这些
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]
。
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]
f=(n,a)=>a[n]=n?f(n-1,a)+n+n-1:0
。
重击- 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解决方案中的算法替换了内部循环。
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#,但我认为它应该可以工作。
int[]sq
代替int[] sq
和int[]res
代替int[] res
。这可以帮助您节省两个字符,与此同时我也没有遇到任何编译错误。你也应该使用单字符标识符sq
,并res
为你的建议。
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