加算と減算のみを使用して、xまでのすべての平方を計算します


11

目標はx、加算と減算を使用して、すべての平方を計算することです。

ルール:

  1. コードは、生成する正方形の総数を取得し、それらすべての正方形を含む配列を返す関数でなければなりません。
  2. 文字列、構造、乗算、除算、または組み込み関数を使用して平方を計算することできません
  3. 配列、整数(整数)、加算、減算のみを使用できます。他のオペレーターは許可されていません!

これは質問なので、バイト単位の最短コードが勝ちです!


これは基本的に、正方形をインクリメントするための最も最適化されたアルゴリズムです -または、少なくともほぼ同じ答えが得られます。
ピーターテイラー14

2
@PeterTaylorいいえ、それは同じではありません。これは、平方を増分するための最も最適化されたアルゴリズムの場合と同じですが、私の質問では加算と減算のみを求めています。
歯ブラシ14

それは同じことです。証人として:この質問に対する現在の答えは、前の質問に対する答えの大部分とまったく同じです。
ピーターテイラー14

@PeterTaylor私は偏見があるかもしれませんが、それはまったく同じだとは本当に思いません。
歯ブラシ14

3
この質問は、すでに他の場所で答えを持っているかもしれませんが、ことはありませんので質問他の質問の重複。
ブラックライトシャイニング14

回答:



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文字を保存できますが、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
その論理はすばらしい!+1に値する
ムクルクマール14

5

GolfScript、17文字

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

使用方法(オンラインの例を参照):

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

注: *は乗算演算子ではなくループです。


OK; どのように機能しますか?
歯ブラシ14

@toothbrush ,は入力を受け取り、それを配列に変換し[0 1 ... n-1]ます。次に*、指定されたコードブロックを配列に挿入します。このブロックは、最初に現在のアイテムを2倍にし.+()、1を減算し()、次に前の結果を加算します1$+(つまり、2j-1前の平方数に加算します)。[]新しい配列を返すためにすべてを囲みます。
ハワード14

すごい!私はGolfScriptを知らないので、どのように機能するのか疑問に思いました。
歯ブラシ14

5

Windowsバッチ、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から実行するのではなく、バッチファイルに配置する必要があり、コンソールにリストを出力します。最初のコマンドライン引数から作成する正方形の数を取ります。ほとんどの場合、&改行の代わりに使用されますが、まだ1つ必要であり、2バイトとしてカウントされます。

遅延変数の展開を有効にする必要があります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}"は私にとって正当なものであり、2文字節約できます。
skibrianski

@skibrianski:無名関数も関数です。欠点は、関数の呼び出しが少し面倒になることです。
ヘイコオベルディク14年

正しいが、それは呼び出し側にある。匿名の潜水艦を定義する他の言語のエントリがあるので、私はあなたが安全だと思う=)
skibrianski 14年

引数が1つしかないため、shift()ではなくpop()を使用して、さらに2文字を保存できます。
skibrianski 14年

@skibrianski:そう、ありがとう。
ハイコOberdiek

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

2
k+=i+++i同じであるk += i + (++i)ように同じであるk+=i+i+1が続くi=i+1
MT0

それは天才です...必要に応じて、次のcodegolfでそれを実装する必要があります!:)
WallyWest 14

関数宣言を配列内に移動することにより、1文字を保存できます(例:)b=[f=i=>b[i]=i&&i+--i+f(i)]
歯ブラシ14

ありがとう-セミコロンを削除するために物事を移動することにより、トップアンサーの1文字も保存しました。
MT0 14

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へようこそ!素晴らしく簡潔な答え。ジュリアのことは聞いたことがありませんが、興味をそそるように見えます。
ジョナサンヴァンマトレ14

「2x」はジュリアの掛け算ではありませんか?代わりにx + xと言うこともできますが、これには1バイトしかかかりません。
グレンランダース-パーソン14

あなたは正しい(断りのない通知)、編集されています。
CCP 14

私は(まだ)juliaに精通していませんが、docs.julialang.org / en / release-0.2のオンラインマニュアルで調べ、「数値リテラル係数:一般的な数値式と式をより明確にするために、Juliaは変数を許可します」数値リテラルが直前にあり、乗算を意味します。」ええ、2xは乗算です。
グレンランダース-パーソン14

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;}  

コードゴルフでの私の最初の試み

このコードに基づいている
= 2 XN - 1
ここで、N用語数であり、であり、Nシリーズ以下で番目の用語 1、3、5、9、11、13、··· 第2の用語= 2の和二乗

最初の3つの項の合計= 3の2乗
など...


2
ステートメントが1つしかないため{}forループの後に中括弧を削除できると思います。これは2で、あなたの文字の数を減らすことができます
user12205

1
あなたは、メイン以外のいくつかの機能は非定数サイズの配列を()を宣言した場合、それは許容範囲だ
Mukulクマール

1
このコードには未定義の動作があります。
ケレックSB 14

1
リターン中に破壊されたスタック上のデータへのポインタを返します。
VX

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最後にaを追加してテストすることもできます。コンパイルすると、プログラムは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より少し大きくすることはできますか?
グレンランダース-パーソン14年

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
歯ブラシ14

1
私はECMAScript 6が本当に主流になっていくのを待ちきれません。それはそれを学ぶための完璧な言い訳になります。
イサイアメドウズ14

1
ECMAScript 6仕様のArrow Function部分は、バージョン22以降FireFoxに含まれています。
MT0 14

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 81100)


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要素までを返します。


int[]との間のスペースを削除してみましたsqか?私はC#を知りませんが、うまくいくと思います。
user12205 14

いいえ、うまくいきません。最初のint []は、メソッド "sq"の戻り型です。メソッド名を "s"に減らすことができます:)
ラジェッシュ14

int[]sq代わりにint[] sqとのint[]res代わりに使用することを意味しint[] resます。これは2つの文字を保存するのに役立ちますが、コンパイルエラーは発生しませんでした。また、提案されたとおりにsq、単一文字の識別子を使用する必要がありresます。
user12205 14

あなたの答えとそこの何かが間違っているように思える
user12205

コードを4スペースでインデントして、等幅フォントのコードブロックに入れます。
luserはドローグ

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、ありがとう、内側のループをあなたのコードに置き換えました。
グレンランダース-パーソン14

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

Forth-48バイト

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

使用法:

7 f

出力:

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