Xステップ前進、1ステップ後退


21

ここでは、簡単なシーケンスの最初の100個の番号:

0,1,0,2,1,4,3,7,6,11,10,16,15,22,21,29,28,37,36,46,45,56,55,67,66,79,78,92,91,106,105,121,120,137,136,154,153,172,171,191,190,211,210,232,231,254,253,277,276,301,300,326,325,352,351,379,378,407,406,436,435,466,465,497,496,529,528,562,561,596,595,631,630,667,666,704,703,742,741,781,780,821,820,862,861,904,903,947,946,991,990,1036,1035,1082,1081,1129,1128,1177,1176,1226

このシーケンスはどのように機能しますか?

n: 0 1     2           3     4     5     6     7     8      9       10      11      12

   0,      1-1=0,      2-1=1,      4-1=3,      7-1=6,       11-1=10,        16-1=15,      
     0+1=1,      0+2=2,      1+3=4,      3+4=7,      6+5=11,        10+6=16,        15+7=22
  • a(0) = 0
  • 奇数n(0インデックス)ごとに、a(n-1) + XX=1アクセスされるたびに1ずつ増加します)
  • 偶数n(0インデックス)ごとに、a(n-1) - 1

チャレンジ:

の一つ:

  • 入力整数を指定すると、シーケンスの '番目の数をn出力nします。
  • 入力整数を指定すると、シーケンスのn最初のn数を出力します。
  • 入力を取得せずに(または空の未使用入力を取得せずに)シーケンスを無期限に出力します。

チャレンジルール:

  • 入力にnは、0または1の両方のインデックスを付けることができます。
  • シーケンス(の一部)を出力する場合、リスト/配列を使用して、任意の区切り文字(スペース、コンマ、改行など)を使用してSTDOUTに出力できます。あなたの電話。
  • 回答で使用した3つのオプションのいずれかを明記してください。
  • 少なくとも最初の10,000個の数字をサポートする必要があります(10,000番目の数字はです12,497,501)。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターと戻り値型、完全なプログラムを持つ関数/メソッドを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、可能であれば説明を追加してください。

テストケース:

シーケンス内の最初の10,001番号の貼り付けビン。好きなものを自由に選んでください。

いくつかのより高い数字:

n (0-indexed)    Output:

68,690           589,772,340
100,000          1,249,975,000
162,207          3,288,888,857
453,271          25,681,824,931
888,888          98,765,012,346
1,000,000        124,999,750,000

回答:



8

Excel、31バイト

回答は0索引付けされています。n数値を出力します。

=(A1^2+IF(ISODD(A1),7,-2*A1))/8

説明されているシーケンスは、最終的にはインターレースされた2つのシーケンスのみです。

ODD:   (x^2+x+2)/2
EVEN:  (x^2-x)/2

これらを1つの0インデックス付きシーケンスにインターレースすると、次のようになります。

a = (x^2 - 2x)/8 if even
a = (x^2 + 7 )/8 if odd

与えるもの:

=IF(ISODD(A1),(A1^2+7)/8,(A1^2-2*A1)/8)

これを31バイト単位でゴルフします。


同じアプローチを使用して、1indexedは37バイトを提供します。

=(A1^2-IF(ISODD(A1),4*A1-3,2*A1-8))/8



4

Haskell40 38 37バイト

scanl(flip($))0$[1..]>>=(:[pred]).(+)

無限のリストを返します。オンライン試してください!

説明

scanl3つの引数finitおよびxs[ x 0x 1 ... ])を取り、新しいリストを作成します。

[ a 0 = inita 1 = f(a 0、x 0a 2 = f(a 1、x 1 ... ]

私たちは、セットinit = 0とひっくり返し使用($)(したがって、それが適用されるアプリケーションの演算子をの機能には、xは、私が今、我々は唯一の関数のリストを必要とする、) -リストは右の機能を持つ無限のリストです:[1..]>>=(:[pred]).(+)

[(+1),(-1),(+2),(-1),(+3),(-1),(+4),...

興味深い代替案、37バイト

flipHaskellの型推論のために代わりに(a -> b -> c) -> b -> a -> c使用できる型を持つことで、型はに統合され、同じようになります。id :: d -> d($)da -> b

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

編集

-notation (>>=)ではなく-2バイトdo

scanl代わりに-1バイトを使用しますzipWith



3

05AB1E、10バイト

ÎF<NÈi¼¾>+

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

説明

Î             # initialize stack with: 0, input
 F            # for N in [0 ... input-1] do:
  <           # decrement the current number
   NÈi        # if N is even
      ¼       # increment a counter
       ¾>     # push counter+1
         +    # add to current number

別の10バイト: ÎFNÈN;Ì*<O


ÎGDN+D<シーケンスを生成しますが、n番目の要素をつかむように見えます... 3バイトでハード。
魔法のタコ



3

ゼリー、6 バイト

HḶS‘_Ḃ

を受け取る(1-indexed)nを受け入れるモナドリンクa(n)

オンラインでお試しください!またはテストスイートを見る

どうやって?

HḶS‘_Ḃ - link: n
H      - halve         -> n/2.0
 Ḷ     - lowered range -> [0,1,2,...,floor(n/2.0)-1]
  S    - sum           -> TriangleNumber(floor(n/2.0)-1)
   ‘   - increment     -> TriangleNumber(floor(n/2.0)-1)+1
     Ḃ - bit = 1 if n is odd, 0 if it's even
    _  - subtract      -> TriangleNumber(floor(n/2.0)-1)+isEven(n)

うーん、そこに面白いアプローチ。
エリックアウトゴルファー

3

PHP73 64 55 51 47バイト

最初の方法

初めてのゴルフの答え!
短くするためのPHPのトリックがあり、おそらく数学を改善できると確信しています。

最初の引数としてnを取り、シーケンスのn番目の数を出力します。

$y=$argv[1]/2;for(;$i<$y+1;)$x+=$i++;echo$x-($y|0);

「$ x = 0;」を削除してマイナス9バイト および「$ i = 0」。

@Kevin Cruijssenがforループと終了タグの消失を改善したおかげで、マイナス9バイト。

ビット単位または「|」を使用したマイナス1バイト 「(int)」ではなく

「php -r 'code here'」を使用してコマンドラインからタグを実行することでタグを削除できるため、@ Dennisのおかげでマイナス3バイト

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

第二の方法

以前の回答とまったく新しい方法を一致させました!

for(;$i<$argv[1];$i++)$x+=($y^=1)?$i/2+1:-1;echo$x;

XORと10進演算子を使用して、ループ内の合計を切り替えます。

編集:これはn = 0では機能せず、理由はわかりません。$ iは割り当てられていないため、0である必要があります。したがって、ループ($i<$argv[1])はとして失敗します(0<0==false)。したがって、割り当てられていない$ xは1ではなく0として出力されます。

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

第三の方法

作成されたExcel式@WernischをPHPに変換すると、47バイトのソリューションが得られます

$z=$argv[1];echo(pow($z,2)+(($z&1)?7:-2*$z))/8;

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


1
こんにちは、PPCGへようこそ!あなたはまだしていない場合は、PHPでのゴルフのためのヒント<すべての言語>でゴルフのためのヒントは通じ読んでも面白いかもしれません。ゴルフにいくつかのこと:あなたは末尾を削除することができます?>。削除し$x=0$i=0実際に許可されています(許可$x=$i=0されていない場合は、それも短くなります)。また、ループはに短縮できますfor(;$i<$y+1;)$x+=$i++;。これは合計で-15バイトです。滞在を楽しんで!:)
ケビンクルーイッセン

@KevinCruijssenありがとうございます!
サムディーン

どういたしまして。ところで、TIOは現在58バイトではなく60バイトのままです。なぜ57と言ったのかはわかりません。オンラインで試してください。
ケビンクルーイッセン

@KevinCruijssen間違ったTIOを投稿し続けました!TIOは現在、58を言うが、あなただけではないTIOに、開始タグから「PHP」を削除することができますように私は55を掲載しました
サムディーン

@Wernischフォーミュラありがとう!
サムディーン

3

R、35バイト

diffinv(rbind(n<-1:scan(),-1)[n-1])

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

これは、@ JayCeの答えに対する興味深い代替案だと思いました。マトリックスの組み込みサポートがない言語にはあまりうまく移植できず、偶然にもゴルフのように見えるからです。

1-indexed、nシーケンスの最初の要素を返します。

使い方:

rbind(n<-1:scan(),-1) 次のマトリックスを作成します。

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]   -1   -1   -1   -1

Rは行列を列優先の順序で保持するため、これをaに変換するvectorと、ベクトルが得られます

1 -1 2 -1 3 -1 4 -1

累積和をとると、

1 0 2 1 4 3 7 6

これは、先頭の0diffinv幸いなことに、先行ゼロが追加されるためn-1、マトリックスとdiffinvそれらから最初のn値を取得し、シーケンスの最初の値を取得します。


2
私はあなたの 'diffinv'回答の大ファンです。
JayCe


3

R35 34バイト

(u=(n=scan())-n%%2-1)-n+(15+u^2)/8

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

最初の出力オプション。他の多くの回答と同じ式(式を提供する最初の回答を指し示したいのですが、それが何であるかわかりません)。

以下の2番目と3番目の出力オプション:

R、43バイト

function(m,n=1:m,u=n%%2+1)((n-u)^2-1)/8+2-u

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

R、51バイト

while(T){cat(((T-(u=T%%2+1))^2-1)/8+2-u," ");T=T+1}

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


3

Matlab / Octave、31 26バイト

5バイトがthxをLuis Mendoに保存しました!

@(n)sum(1:n/2+.5)-fix(n/2)

1
あなたは、おそらく使用することができるfix代わりにfloor、そしてn/2+.5代わりにceil(n/2)
ルイス・Mendo

@LuisMendo Ty!知らfix()なかったし1:n/2+.5、動作することを期待していなかった-非常に多くのことがうまくいかないかもしれないが、実際にはそうではない:)
リアンダーMoesinger




3

QBasic、31バイト

Just-implement-the-specソリューションは、Erikのソリューションよりも少し長くなります

DO
?n
i=i+1
n=n+i
?n
n=n-1
LOOP

これは無期限に出力します。それを実行するために、最後の行をなどのようLOOP WHILE INPUT$(1) <> "q"に変更することをお勧めしqます。


2

C#(.NET Core)、56バイト

n=>{int a=0,i=0;for(;++i<n;)a+=i%2<1?-1:i/2+1;return a;}

-2バイト、Kevin Crujssenのおかげ

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

1が索引付けされました。返品a(n)

Ungolf'd:

int f(int n)
{
    // a needs to be outside the for loop's scope,
    // and it's golfier to also define i here
    int a = 0, i = 1;
    // basic for loop, no initializer because we already defined i
    for (; ++i < n;)
    {
        if (i%2 < 1) {
            // if i is even, subtract 1
            a -= 1;
        }
        else
        {
            // if i is odd, add (i / 2) + 1
            // this lets us handle X without defining another int
            a += i / 2 + 1;
        }
    }
    // a is the number at index n
    return a;
}

1
i=1;for(;i<n;i++)可能i=0;for(;++i<n;)i%2==0することができi%2<1
ケビンCruijssen

@KevinCruijssenだからできる、ありがとう!私は2番目のものを見るべきでしたが、ループは最初のループの後に条件をチェックするだけだと思ったので、最初のものが動作するとは思いませんでした。TIL
Skidsdev

いいえ、最初の反復の前にすでにチェックしています。A do-whileは最初の反復を完了した後にチェックします。:)
ケビンクルーイッセン

非常にまれなケースifでは、for-loopをマージすることもできます。例:if(t>0)for(i=0;i<l;i++)to for(i=0;t>0&i<l;i++)。ただし、これを回答で使用することはほとんどできませんでした。
ケビンクルーッセン

それはかなり素晴らしいです、私は間違いなく、私は、これらの日は非常にまれであるC#のゴルフをやる心次回にすることを維持する必要があります:P私のC#の仕事のほとんどは明らかにungolfyある
Skidsdev

2

11 9 8バイト

ΘṁṠe→Θ∫N

H.PWizのおかげで1バイト節約できました。
無限リストとして出力します。
オンラインでお試しください!

説明

ΘṁṠe→Θ∫N
      ∫N   Cumulative sum of natural numbers (triangular numbers).
     Θ     Prepend 0.
 ṁṠe→      Concatenate [n + 1, n] for each.
Θ          Prepend 0.

2

ドドス、69バイト

	. w
w
	. h
	+ r . ' dab h '
h
	h ' '
	. dab
r
	
	r dip
.
	dot
'
	dip

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


どういうわけか、これは最も長い答えです。

説明。

┌────┬─────────────────────────────────────────────────┐
│Name│Function                                         │
├────┼─────────────────────────────────────────────────┤
│.   │Alias for "dot", computes the sum.               │
├────┼─────────────────────────────────────────────────┤
│'   │Alias for "dip".                                 │
├────┼─────────────────────────────────────────────────┤
│r   │Range from 0 to n, reversed.                     │
├────┼─────────────────────────────────────────────────┤
│h   │Halve - return (n mod 2) followed by (n/2) zeros.│
└────┴─────────────────────────────────────────────────┘

1

、15バイト

I∨ΣEN⎇﹪ι²±¹⊕⊘ι⁰

オンラインでお試しください!0インデックス。リンクは、コードの詳細バージョンです。おそらく式はもっと短くなるでしょうが、その面白さは何ですか?説明:

    N           Input as a number
   E            Map over implicit range
     ⎇          Ternary
      ﹪ι²       Current value modulo 2
         ±¹     If true (odd) then -1
           ⊕⊘ι  Otherwise calculate X as i/2+1
  Σ             Take the sum
 ∨            ⁰ If the sum is empty then use zero
I               Cast to string and implicitly print

1

JavaScript、49 48 45バイト

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')

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

@tshの答えほどきれいではありませんが、私のほうが大きな数字で動作します。

そして今、eval解決策を@tshに感謝します!


<=x+1することができます<x+2
ケビンCruijssen

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')短くする必要があります。
tsh

eval最後の修正値を返しますか?私はまだそれが何ができるかを完全には理解していません。
ランダムな男

ステートメントの値を返します(これdo、後のバージョンのステートメントでカバーされる可能性あります)。
tsh



1

Pyth、8バイト

s<s,R_1S

nシーケンス内の0から始まるインデックス番号を返します。オンラインで試す

説明、例n=5

s<s,R_1SQQ   Final 2 Q's are implicit, Q=eval(input())

       SQ    1-indexed range        [1,2,3,4,5]
   ,R_1      Map each to [n,-1]     [[1,-1],[2,-1],[3,-1],[4,-1],[5,-1]]
  s          Sum (Flatten)          [1,-1,2,-1,3,-1,4,-1,5,-1]
 <       Q   Take 1st Q             [1,-1,2,-1,3]
s            Sum, implicit output   4

1

Perl 6  38の  26バイト

{(0,{$_+(($+^=1)??++$ !!-1)}...*)[$_]}

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

{(+^-$_+|1)**2 div 8+$_%2}

TFeldのPythonのリバースエンジニアリングに基づく回答
それを試してみてください

拡大

38バイト(シーケンスジェネレーター):

{  # bare block lambda with implicit parameter $_

  (
    # generate a new sequence everytime this function is called

    0,    # seed the sequence

    {     # bare block that is used to generate the rest of the values

      $_  # parameter to this inner block (previous value)

      +

      (
          # a statement that switches between (0,1) each time it is run
          ( $ +^= 1 )

        ??     # when it is 1 (truish)
          # a statement that increments each time it is run
          ++$ # &prefix:« ++ »( state $foo )

        !!     # or else subtract 1
          -1
      )
    }

    ...  # keep generating until:

    *    # never stop

  )[ $_ ] # index into the sequence
}

これには、渡すことができるという利点があることに注意してください *シーケンス全体を取得するためにや、複数の値をより効率的に生成するためにRangeを渡す。

26バイト(直接計算):

{  # bare block lambda with implicit parameter $_

  (

    +^     # numeric binary negate
      -$_  # negative of the input
      +|   # numeric binary or
      1

  ) ** 2   # to the power of 2

  div 8     # integer divide it by 8

  + $_ % 2  # add one if it is odd
}

1

05AB1E、8バイト

;L¨O>¹É-

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

Jonathan AllanのJellyアプローチ(おそらく、OPがシーケンスの別の定義を使用して質問を編集することに基づいていた)に基づいて、1インデックスが付けられました。


+1。05AB1Eで同様のアプローチを用意しました。他の誰も投稿しなかった場合、数日後に投稿する予定でした。(私は最初のリストを作成し、代わりに尾を削除する前に半体を減少させ;そして私が使用それは少し違うIの代わりに¹)が、一般的なアプローチとバイト数はまったく同じである:;<LO>IÉ-
ケビンCruijssen

@KevinCruijssen私がもっと深く考える能力があれば昨日投稿したでしょうが、これは最終期間であり、これについて深く考えすぎることは禁じられています。:P
エリック・ザ・アウトゴルファー

ああ、もう決勝戦を持っていないことがうれしいです。私も仕事でかなり忙しくて、時々私が望むより頻繁にコードゴルフを延期しなければなりません。; p試験に頑張ってください!
ケビンCruijssen

1

10 9バイト

_½,ª)\2%-

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

ジョナサンアランのジェリーアプローチ(おそらくOPがシーケンスの別の定義で質問を編集することに基づいていた)に基づいています。1インデックス付き。

説明:

_½,ª)\2%- Stack: [A]
_         Duplicate. Stack: [A A]
 ½        Halve. Stack: [A [A]½]
  ,       Range, [0..⌊N⌋). Stack: [A [[A]½],]
   ª      Sum. Stack: [A [[A]½],]ª]
    )     Increment. Stack: [A [[[A]½],]ª])]
     \    Swap. Stack: [[[[A]½],]ª]) A]
      2   2. Stack: [[[[A]½],]ª]) A 2]
       %  Modulo. Stack: [[[[A]½],]ª]) [A 2]%]
        - Minus. Stack: [[[[[A]½],]ª]) [A 2]%]-]

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