目標はx、加算と減算を使用して、すべての平方を計算することです。
ルール:
- コードは、生成する正方形の総数を取得し、それらすべての正方形を含む配列を返す関数でなければなりません。
- 文字列、構造、乗算、除算、または組み込み関数を使用して平方を計算することはできません。
- 配列、整数(整数)、加算、減算のみを使用できます。他のオペレーターは許可されていません!
これはコードゴルフの質問なので、バイト単位の最短コードが勝ちです!
目標はx、加算と減算を使用して、すべての平方を計算することです。
ルール:
これはコードゴルフの質問なので、バイト単位の最短コードが勝ちです!
回答:
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文字を保存できますが、forイニシャライザーが> C99に宣言を含めることができないため、1文字のコストがかかります。その後、コードは
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$+}*]}:F;
使用方法(オンラインの例を参照):
10 F # => [0 1 4 9 16 25 36 49 64 81]
注: *は乗算演算子ではなくループです。
,は入力を受け取り、それを配列に変換し[0 1 ... n-1]ます。次に*、指定されたコードブロックを配列に挿入します。このブロックは、最初に現在のアイテムを2倍にし.+(()、1を減算し()、次に前の結果を加算します1$+(つまり、2j-1前の平方数に加算します)。[]新しい配列を返すためにすべてを囲みます。
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から実行するのではなく、バッチファイルに配置する必要があり、コンソールにリストを出力します。最初のコマンドライン引数から作成する正方形の数を取ります。ほとんどの場合、&改行の代わりに使用されますが、まだ1つ必要であり、2バイトとしてカウントされます。
遅延変数の展開を有効にする必要があります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;}
コードゴルフでの私の最初の試み
このコードに基づいている
= 2 XN - 1
ここで、N用語数であり、であり、Nシリーズ以下で番目の用語
1、3、5、9、11、13、···
第2の用語= 2の和二乗
最初の3つの項の合計= 3の2乗
など...
{}、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要素までを返します。
int[]との間のスペースを削除してみましたsqか?私はC#を知りませんが、うまくいくと思います。
int[]sq代わりにint[] sqとのint[]res代わりに使用することを意味しint[] resます。これは2つの文字を保存するのに役立ちますが、コンパイルエラーは発生しませんでした。また、提案されたとおりに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