上下、上下


34

チャレンジ:

正の整数入力nを指定すると、次のパターンに従うベクトルを作成します。

0  1  0 -1 -2 -1  0  1  2  3  2  1  0 -1 -2 -3 -4 -3 -2 -1 ... ±(n-1) ±n

または、言葉で説明します:ベクトルは、0で始まり1、シーケンスの一部ではない最小の奇数の正の整数に達するまで増分し、それから最小の(大きさで)偶数の負の整数に達するまで減分しますシーケンスの一部ではありません。n到達するまでこのように継続します。シーケンスが奇数のn場合nは正で終了し、偶数のn場合nは負で終了します。

出力形式は柔軟です。

テストケース:

n = 1
0  1
-----------
n = 2
0  1  0 -1 -2
-----------
n = 3
0  1  0 -1 -2 -1  0  1  2  3
-----------
n = 4
0  1  0 -1 -2 -1  0  1  2  3  2  1  0 -1 -2 -3 -4
-----------
n = 5
0  1  0 -1 -2 -1  0  1  2  3  2  1  0 -1 -2 -3 -4 -3 -2 -1  0  1  2  3  4  5

n個のゼロインデックスを選択できます。n = 1その後、与えるだろう0 1 0 -1 -2

これはなので、各言語で最も短いコードが勝ちです!説明はいつものように奨励されます!


回答:



8

Perl 6の 60の  26バイト

{flat {((1,-*...*)ZX*(-$++...0...$++)xx$_)}(),$_*($_%2||-1)}

それを試してみてください

{[...] (-1,-*...*)Z*0..$_}

それを試してみてください

拡張:

{  # bare block lambda with implicit parameter $_

  [...]  # reduce using &infix:«...» (sequence generator)

          ( -1, -* ... * ) # (-1, 1, -1, 1 ... *)

      Z*                   # zip multiplied with

          0 .. $_          # range up to and including input
}

(-1,-*...*)Z*0..$_ シーケンスを生成します 0 1 -2 3 -4 5



7

05AB1E9 7バイト

@Emignaのおかげで2バイト節約

Ýā®sm*Ÿ

オンラインでお試しください!

私の最初の05AB1Eの回答(私は思う)、だから私はいくつかのトリックを見逃しているかもしれない...

説明

Ý         # push range [0 ... n]   stack: [[0 ... n]]
 ā        # push range [1 ... len(prev)]  [[0 ... n], [1 ... n+1]]
  ®       # push value of register        [[0 ... n], [1 ... n+1], -1]
   s      # swap top two values           [[0 ... n], -1, [1 ... n+1]]
    m     # power                         [[0 ... n], [-1, 1, -1, 1, ...]]
     *    # multiply                      [[0, 1, -2, 3, -4, 5, ...]]
      Ÿ   # range interpolation           [[0, 1, 0, -1, -2, -1, ...]]

私はのために@Dennisを感謝しなければならないの本来の用法Ÿそうでない場合、私は、ないかもしれない、おそらくそれについて知らなかったでしょう...


いいね:)!私はÝεDÈi®*}}Ÿチェックせずに得た、ā®smクレイジースマートです(笑)。
魔法のタコUr


6

JavaScript(ES6)、56バイト

f=(n,b=d=1,k=0)=>[k,...k-d*n?f(n,k-b?b:(d=-d)-b,k+d):[]]

オンラインでお試しください!

コメント済み

f = (               // f = recursive function taking:
  n,                //   n = input
  b =               //   b = boundary value, initialized to 1
  d = 1,            //   d = current direction, initialized to 1
  k = 0             //   k = current sequence value, initialized to 0
) =>                //
  [                 // update the sequence:
    k,              //   append the current value
    ...k - d * n ?  //   if |k| is not equal to |n|:
      f(            //     append the (spread) result of a recursive call:
        n,          //       use the original input
        k - b ?     //       if k has not reached the boundary value:
          b         //         leave b unchanged
        :           //       else:
          (d = -d)  //         reverse the direction
          - b,      //         and use a boundary of higher amplitude and opposite sign
        k + d       //       update k
      )             //     end of recursive call
    :               //   else:
      []            //     stop recursion and append nothing
  ]                 // end of sequence update


6

ゼリー11 9バイト

²Ḷƽ-*0;Ä

オンラインでお試しください!

使い方

²Ḷƽ-*0;Ä  Main link. Argument: n

²          Square; yield n².
 Ḷ         Unlength; yield [0, ..., n²-1].
  ƽ       Take the integer square root of each k in the range.
    -*     Compute (-1)**r for each integer square root r.
      0;   Prepend a zero.
        Ä  Accumulate; take the sums of all prefixes.

6

Haskell48 42バイト

f n=0:[(-1)^i*x|i<-[0..n-1],x<-[1-i..i+1]]

オンラインでお試しください!

-1バイトのΟurousのおかげで

後知恵では明らか(-1)^i*xですがx、いつi偶数になり、-xいつi奇数になるかに到達するまでに時間がかかりました。前の反復:

(-1)^i*x
x-2*mod i 2*x
(-1)^mod i 2*x
[x,-x]!!mod i 2
(1-sum[2|odd i])*x

1
あなたは使用してバイトを保存することができます1-i代わりに-i+1して..表現。
Οurous

4

C#(.NET Core)300  167バイト

私はこれらのことを一度もやったことがありませんが、これは楽しいようでした。167他の回答よりもはるかに高いように思われるので、なぜこれらの「ゴルフ」言語を使用するのかがわかります。しかし、あなたはあなたが知っていることで行かなければなりません。

static int[] f(int n){if (n==1) return new int[]{0,1};var a=f(n-1);return a.Concat(a.Skip(a.Length-(n-1)*2).Select(x=>-x)).Concat(new int[]{(n%2)!=0?n:-n}).ToArray();}

オンラインでお試しください!

// Recursive Worker Function
static public int[] f( int n )
{
    // Start with the simple case
    if ( n == 1 ) return new int[]{0,1};

    // Recusively build off of that
    var a = f(n-1);

    // To be added at the end
    int[] b = { (n%2) !=0 ? n : -n };

    // Skip some based on length
    int s = a.Length - (n-1)*2;

    // With the rest, multiply by -1 and then append to the end
    // And append the part
    return a.Concat( a.Skip(s).Select( x => -x ) ).Concat( b ).ToArray();
}

1
usingステートメントと関数のみを数える場合、これを大幅に短くすることができます。これは、チャレンジで完全なプログラムである必要があると指定されていない限り、デフォルトで許可されています(たとえそうであっても、収容クラス名を短縮できます)。
Οurous

ありがとうございました!あなたの提案のおかげで、TIOサイトの「ヘッダー」セクションと「フッター」セクションの意味がわかりました。それにより、提出サイズが半分になりました!
ダリンカロップ

2
PPCGへようこそ!(これはあなたの最初の投稿のように見えます。)他の言語について心配する必要はありません。あなたの言語で可能な限り良くなるようにしてください。/ヒント:不要なスペースを削除します。C#では、シンボルを(周囲のすべてのスペースを削除することができます[](){};.(n-1)*2だけである2*n-2といくつかの並べ替えであなたがそこに括弧を削除することができます。
user202729

また、!=優先度が低い%ため、ペアのペアを削除できます。そして>0、 `!= 0の代わりに使用して、バイトを節約できます。
user202729

1
私からも:PPCGへようこそ!C#でゴルフをするためのヒント、すべての言語でのゴルフのためのヒントをお読みも面白いかもしれません。:)いくつかのゴルフのヒントについては:static int[] f(int n)なることができますf=n=>(再帰的)ラムダを使用することによって、および(n-1)*2になることができ~-n*2括弧を節約します。私はそれを降りて、オンラインでそれを試してみてください:バイト155(137 + 18) 。18バイトはusing System.Linq;、バイトカウントに必要なインポートが必須であるためです。滞在を楽しんで!
ケビンクルーイッセン

4

J、25バイト

FrownyFrogのおかげで-5バイト!

>:@*:$i.;@(<@i:@*_1&^)@,]

オンラインでお試しください!

J、30バイト

>:@*:{.;@([:(i:@*_1&^)&.>i.,])

説明:

i.,] リスト0..nを作成します

&.> リスト内の各番号に対して(...)の動詞を実行し、結果をボックス化します(結果の長さが異なるため、ボクシングが必要です)

[:( _1&^)-1のiべき乗(-1または1)を求める

i:@* 上記の符号に応じて、リスト-n..nまたはn ..- nを作成します

;@ 開封

>:@*: n ^ 2 + 1を見つける

}. そしてリストから非常に多くの数字を取ります

オンラインでお試しください!


1
ゼロベースのnバージョンと同じコードを書くことを検討しますか?例*:{.;@([:(i:@*_1&^)&.>i.)..仕様ではそれが許可されています
jayprich

「n = 1は0 1 0 -1 -2を与える」
-FrownyFrog

@FrownyFrog-うーん、私はチェックしなかった。私は最初の解決策に戻りました。観察ありがとうございました!
ガレンイワノフ

1
25$カットオフに 使用します。ランク0 &.>なので不要です*
FrownyFrog


3

Java 8、85 83 79バイト

n->{for(int p=0,i=0;i<=n*n;p+=1-(int)Math.sqrt(i++)%2*2)System.out.println(p);}

@OlivierGrégoireのおかげで-6バイト。

オンラインでお試しください。

説明:

n->{                            // Method with integer parameter and no return-type
  for(int p=0,                  //  Set both `p` to 0
      i=0;i<=n*n;               //  Loop `i` in the range [0, `n*n`]
      p+=                       //    After every iteration, increase `p` by:
         1-                     //     1, minus:
           (int)Math.sqrt(i++)  //     The square-root of `i`, truncated to its integer
           %2*2)                //     Modulo 2, and multiplied by 2
     System.out.println(p);}    //   Print integer `p` with a trailing new-line

いいアプローチ。私は答えを改善するために、今そのようなアプローチに取り組んでいましたが、あなたは(あなたの会議にもかかわらず)私にそれを打ちました、よくやった!;-)
オリビエグレゴワール

1
83バイト(削除したばかりですj)。
オリビエグレゴワール

1
79バイトi冗長を削除するためにダウンではなくアップしましたn*n
オリビエグレゴワール

こんにちは。これを書いて、あなたの答えを基本的にはぎ取ったことを教えてください。(JavaScriptへのポート)。大丈夫だと思います
ムハンマドサルマン

@MuhammadSalman確かに、np。他の人からの回答もかなり頻繁に移植しています。:)元の答えが言及されている限り、あなたがしたように、それは私によってすべて大丈夫です。
ケビンクルーッセン

3

R48 46 42バイト

for(i in 1:scan())F=c(F,-(-1)^i*(2-i):i);F

オンラインでお試しください!

Kirill L.によるRuby回答の移植版-同じKirill L.のおかげで6バイト節約できました!ジュゼッペのソリューションよりも短くなりました;)

このオクターブ回答の移植版Luis Mendoが使用してapproxいるは、それほどゴルフ的ではありません。n=n^2+1に置き換えることができます,,n^2+1; またはによって 0:n^2+1(位置引数xoutと同じバイト数のために):

R、56バイト

f=function(n)approx((0:n)^2+1,-(-1)^(0:n)*0:n,n=n^2+1)$y

オンラインでお試しください!


approxここでも、Luis MendoのOctaveソリューションと同様に機能すると思います。
ジュゼッペ

@ジュゼッペありがとう!長くなりますが動作します。私が学んだdiffinvし、approxこの質問から...
JayCe

私はまた、(Rで行うには-1パワーをgolfierの仕方を知らないが~、あなたは別のセーブまだすることができ補数演算子:(として仕事をしません)2バイトのフルプログラムに切り替えることもできます。
キリルL.

...そしてそれは完全なプログラムなので、事前定義された組み込みの42バイトを使用して台無しにすることもできます -最後に、ジュゼッペのものよりも短いです!
キリルL.

3

APL(Dyalog Unicode)、17バイト

+\01*⍳(/⍨)1+2×⍳

オンラインでお試しください!

@FrownyFrogのおかげで、電車に変換して2バイトのゴルフをしました。以下の古い回答とその説明を参照してください。


APL(Dyalog Unicode)、19バイト

+\0,∊⊢∘-\⍴1¨1+2×⍳⎕

オンラインでお試しください!

(用途⎕IO←0

私の最初のアプローチは、複数の範囲を構築し、それらを連結することでした。これは簡単に30バイトを超えました。その後、シーケンスの分析を開始しました

      +\⍣¯10  1  0 ¯1 ¯2 ¯1  0  1  2  3  2  1  0 ¯1 ¯2 ¯3 ¯4
0 1 ¯1 ¯1 ¯1 1 1 1 1 1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1

+\⍣¯1 逆累積和を示します

1sと¯1sの繰り返しパターンがあり、1sまたは¯1sの各連続シーケンスの長さは1 + 2×nです。また、各サブシーケンスは1と¯1の間で交互に切り替わります。今できることは、1と¯1のリストを作成し、+でスキャンすることです

      4  creates range 0..4
0 1 2 3
      2×⍳4
0 2 4 6
      1+2×⍳4
1 3 5 7
      ⍴∘1¨1+2×⍳4  for-each create that many 1s
┌─┬─────┬─────────┬─────────────┐
11 1 11 1 1 1 11 1 1 1 1 1 1
└─┴─────┴─────────┴─────────────┘
      ⊢∘-\⍴1¨1+2×⍳4  alternate signs
┌─┬────────┬─────────┬────────────────────┐
1│¯1 ¯1 ¯11 1 1 1 1│¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1
└─┴────────┴─────────┴────────────────────┘
      ∊⊢∘-\⍴1¨1+2×⍳4  flatten
1 ¯1 ¯1 ¯1 1 1 1 1 1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1
      0,∊⊢∘-\⍴1¨1+2×⍳4
0 1 ¯1 ¯1 ¯1 1 1 1 1 1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1
      +\0,∊⊢∘-\⍴1¨1+2×⍳4  cumulative sum
0 1 0 ¯1 ¯2 ¯1 0 1 2 3 2 1 0 ¯1 ¯2 ¯3 ¯4

今、他の答えを確認すると、多くは+ \メソッドも使用していますが、少なくとも1バイト短い¯1* sequence.5 *⍨×⍨⍳で1と¯1sのシーケンスを生成しています。
Kritixi Lithos

+\0,¯1*⍳(/⍨)1+2×⍳17
FrownyFrog

私の解決策が長く感じることを知っていた
ザカリー



2

MATL17 15バイト

ルイスメンドーのおかげで2バイト!

0i:oEqG:EqY"Ysh

オンラインでお試しください!

の説明n=3

0		% push 0
 i:		% read input as integer, push range
		% stack: [0, [1 2 3]]
   o		% modulo 2, stack: [0, [1 0 1]]
    Eq		% double and decrement, stack: [0, [1 -1 1]]
      G:	% push input and range again
		% stack: [0, [1 -1 1], [1 2 3]]
        Eq	% double and decrement,
		% stack: [0, [1 -1 1], [1 3 5]]
	  Y"	% run-length decoding
		% stack: [0, [1 -1 -1 -1 1 1 1 1 1]]
	    Ys	% cumulative sum
		% stack: [0, [1  0 -1 -2 -1  0  1  2  3]]
	      h	% horizontally concatenate
		% end of program, automatically print the stack


2

ルビー52 47バイト

f=->n{n<1?[0]:f[n-1]+(2-n..n).map{|x|-~0**n*x}}

オンラインでお試しください!

以下に、説明付きの元の52バイトバージョンを示します。

f=->n{n<1?[0]:f[n-1]+[(r=*2-n..n).map(&:-@),r][n%2]}

オンラインでお試しください!

ウォークスルー

f=->n{           #Recursive approach
 n<1?[0]         #Init with 0 if n=0
 :f[n-1]         #else make a recursive call
 +               #and append an array of numbers
 [(r=*2-n..n)    #Init r as splatted range from 2-n to n
 .map(&:-@)      #"-@" is unary minus, so this a fancy way to do map{|x|-x} for -1 byte
                 #For even n use this negated r, e.g. for n=4: [2, 1, 0, -1, -2, -3, -4]
 ,r]             #For odd n use r directly, e.g. for n=3: [-1, 0, 1, 2, 3]
 [n%2]           #Odd/even selector
}

私はRubyを知らない-これが特にこのmap(&:-@)部分で何をするのか説明してもらえますか?
JayCe

@JayCe説明を追加しました。基本的に、これは単なる否定であり、Rでは単純になります-r
キリルL.

説明をありがとう-これをRに移植するのに役立ちました
。– JayCe


1

Python 3、83バイト

def c(n):print([(-1)**j*(abs(j-i)-j)for j in range(n+1)for i in range(2*j)][:-n+1])


1

、19バイト

F⊕NI×∨﹪ι²±¹…·∧ι⁻²ιι

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

  N                 Input as a number
 ⊕                  Increment
F                   Loop over implicit range
                ²   Literal 2
                 ι  Current index
               ⁻    Subtract
              ι     Current index
             ∧      Logical And
                  ι Current index
           …·       Inclusive range
       ι            Current index
        ²           Literal 2
      ﹪             Modulo
          ¹         Literal 1
         ±          Negate
     ∨              Logical Or
    ×               Multiply
   I                Cast to string and implicitly print

別の説明:

F⊕N

から0入力までの整数をループします。

結果を文字列にキャストしてから印刷します。

×∨﹪ι²±¹

結果の代替セットを無効にします。

…·∧ι⁻²ιι

前のインデックスを除外して、前のインデックスから現在のインデックスへのリストを作成します。


1

ゼリー 11  12 バイト

バ、11 wihと思った _2+ỊrN)N;¥/

_2+ỊrN×-*$)Ẏ

オンラインでお試しください!

どうやって?

_2+ỊrN×-*$)Ẏ - Main Link: n           e.g. 4
          )  - for x in [1...n]:           1       2          3               4
_2           -   subtract 2 from x        -1       0          1               2
   Ị         -   is x insignificant?       1       0          0               0
  +          -   add                       0       0          1               2
     N       -   negate x                 -1      -2         -3              -4
    r        -   inclusive range          [0,-1]  [0,-1,-2]  [1,0,-1,-2,-3]  [2,1,0,-1,-2,-3,-4]
         $   -   last two links as a monad:
       -     -     minus one              -1      -1         -1              -1
        *    -     raised to the power x  -1       1         -1               1
      ×      -   multiply                 [0,1]   [0,-1,-2]  [-1,0,1,2,3]    [2,1,0,-1,-2,-3,-4]
           Ẏ - tighten                    [0,1,0,-1,-2,-1,0,1,2,3,2,1,0,-1,-2,-3,-4]


1

Scala、119バイト

def a(n: Int)={lazy val s:Stream[Int]=0#::Stream.from(0).map{x=>s(x)+1 -2*(Math.sqrt(x).toInt%2)}
s.take(n*n+1).toList}

ゴルフをしていない:

def a(n: Int)={
  lazy val s:Stream[Int]= 0#::Stream.from(0).map //Give the starting point and indexing scheme
  {
    x=>
    {
      val sign = 1-2*(Math.sqrt(x).toInt%2) //Determine whether we are adding or subtracting at the current index
      s(x)+sign
    }
  }
  s.take(n*n+1).toList //Take the desired values
}

これはおそらくはるかに優れた方法ですが、レイジーストリームを利用したソリューションが必要でした。



1

積み上げ、44バイト

[~>0\:2%\#,2*1-tr[...rep]flatmap,$sumonpref]

オンラインでお試しください!Stackedでプログラミングしてからしばらく経ちましたが、まだ手に入れたと思います。

代替案

73バイト: [0\|>:2%tmo*2 infixes[:...|>\rev...|>rev#,$#'sortby 1#behead]flatmap 0\,]

これは、私のAttacheの回答で使用されている「生成されたインデックスからの範囲」アプローチに当てはまります。Stackedにはリバースレンジや折りたたみの組み込み機能がないため、これはかなり長いことが判明しました。(そういうこと:...|>\rev...|>rev#,$#'sortby 1#beheadです。)

53バイト: [0\|>:2%tmo _\tpo#,tr[...rep]flatmap 0\,inits$summap]

...私が代わりに累積合計を見つけたアプローチのために行くことに決めたので、( inits$summap)を超える1-1同様に、奇数の整数で繰り返さRの答え

46バイト: [~>0\:2%\#,2*1-tr[...rep]flatmap,inits$summap]

...しかし、負の整数奇数の整数は、生成された両方の配列(範囲のmod 2値と範囲自体)を乗算して2減算することにより、一度に作成できることに気付きました1。これにより、最初の範囲に1sと-1s、2番目の範囲に奇数の整数が交互に与えられます!

44バイト: [~>0\:2%\#,2*1-tr[...rep]flatmap,$sumonpref]

...そして、プレフィックスをマッピングするためのビルトインがあったことを思い出しました。^-^


1

ジュリア0.6、44バイト

n->[(i%2*2-1)*[0:i;(n>i)*~-i:-1:1]for i=1:n]

オンラインでお試しください!

OPは「出力形式は柔軟です」と言及しているため、サブ配列の配列を出力します。U(3)=> [[0, 1], [0, -1, -2, -1], [0, 1, 2, 3]]

i%2*2-1 現在のサブ配列の符号を決定します-偶数の場合は負、奇数の場合は正。

[0:i;(n>i)*~-i:-1:1]2つの部分に分かれています。0:iは単純で、0から現在のiまでの値の範囲です。次の部分では、〜-i:-1:1はi-1から1までの降順の範囲です。しかし、まだ最終値になっていない場合にのみこれを追加したいので、範囲の上限を掛けます(n> i)で、n == iの場合、範囲は0:-1:1になり、最終的に空になります(したがって、配列はnで正しく停止します)。


そして、ランダムアクセスをサポートできるバージョンがあります。ここの内側のラムダは、シーケンスのi番目の項を返します。その前に項を保存する必要はありません。これは、出力を単一の適切な配列としても提供します。

49 47バイト

n->map(i->((m=isqrt(i))%2*2-1)*(m-i+m^2),0:n^2)

オンラインでお試しください!

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