カンガルーシーケンスを計算する


25

バックストーリー

免責事項:カンガルーに関する情報が含まれている場合があります。

カンガルーはいくつかの開発段階を通過します。彼らは年をとって強くなるにつれて、より高く、より長くジャンプすることができ、空腹になる前に何度もジャンプすることができます。

ステージ1では、カンガルーは非常に小さく、まったくジャンプできません。これにもかかわらず、常に栄養が必要です。このようにステージ1のカンガルーの活動パターンを表すことができます。

o

ステージ2では、カンガルーは小さなジャンプをすることができますが、空腹になる前に2つを超えることはできません。このようにステージ2のカンガルーの活動パターンを表すことができます。

 o o
o o o

ステージ2の後、カンガルーはすぐに改善します。その後の各段階で、カンガルーは少し高く(グラフィック表示では1単位)、2倍にジャンプできます。たとえば、ステージ3のカンガルーの活動パターンは次のようになります。

  o   o   o   o
 o o o o o o o o
o   o   o   o   o

ジャンプにはエネルギーが必要なので、カンガルーは各活動パターンを完了した後に栄養を必要とします。必要な正確な金額は、次のように計算できます。

  1. ステージnカンガルーの活動パターンの各oにその高さ、つまり1からnまでの数字を割り当てます。ここで、1は地面に対応し、nは最高位置に対応します。

  2. アクティビティパターンのすべての高さの合計を計算します。

たとえば、ステージ3のカンガルーの活動パターンには、次の高さが含まれます。

  3   3   3   3
 2 2 2 2 2 2 2 2
1   1   1   1   1

私たちは、5持っている1さん、8 2の、および4の3の。合計は5・1 + 8・2 + 4・3 = 33です。

仕事

入力として正の整数nを取り、ステージnカンガルーのアクティビティごとの栄養要件を出力または返す完全なプログラムまたは関数を作成します。

これはです。バイト単位の最短回答が勝つかもしれません!

 1 ->     1
 2 ->     7
 3 ->    33
 4 ->   121
 5 ->   385
 6 ->  1121
 7 ->  3073
 8 ->  8065
 9 -> 20481
10 -> 50689

15
複雑な設定がゴルフの簡単なフォーミュラに帰着するチャレンジが好きではないので、私はダウンボットしました。
xnor

3
これまでのすべての答えは式を使用していましたが、問題を攻撃する他の方法があると確信しています。
デニス

2
このシーケンスのasciiアート出力を生成するための課題はありますか?
マイル

@milesわからない。ちょっと難しい。
デニス

Wolfram Alphaは短いバージョンを見つけることができませんでしたhttp://www.wolframalpha.com/input/?i=2%5E(n-1)*(n%5E2-1)%2B1(通常のURLがめちゃくちゃになるため、奇妙なマークアップ)
Konijn

回答:


8

ゼリー、6バイト

²’æ«’‘

式(n 2-1)2 n -1 + 1を使用して各値を計算します。@ Qwerp-Derpは、証拠を提供するのに十分親切でした。

オンラインでお試しください!またはすべてのテストケースを検証します。

説明

²’æ«’‘  Input: n
²       Square n
 ’      Decrement
  æ«    Bit shift left by
    ’     Decrement of n
     ‘  Increment

手動で実行しましたか、それとも自動生成しましたか?
エリックアウトゴルファー

それはJを使用してOEISの検索が見つかり、その後、手でそれを簡素化
マイル

私は自分の答えは競合しないと考えているので、これを受け入れました。
デニス

17

Coffeescript、19バイト

(n)->(n*n-1<<n-1)+1

編集:6バイトを切り捨ててくれたデニスに感謝します!

カンガルー番号を生成する式は次のとおりです。

enter image description here

式の説明:

1の中K(n)の最後の合計です2^(n - 1) + 1

nの中K(n)の最後の合計がある2^(n - 1)すべての合計ので、n「sがありますn * 2^(n - 1)

の最終合計のその他の数(d)の数K(n)2^nなので、すべての合計はdのようになりますd * 2^n

  • したがって、他のすべての数値の和= (T(n) - (n + 1)) * 2^nであり、ここでT(n)(式を有する三角形の数の関数ですT(n) = (n^2 + 1) / 2)。

    それを代入して、最終的な合計を取得します

      (((n^2 + 1) / 2) - (n + 1)) * 2^n
    = (((n + 1) * n / 2) - (n + 1)) * 2^n
    = ((n + 1) * (n - 2) / 2) * 2^n
    = 2^(n - 1) * (n + 1) * (n - 2)
    

すべての合計を加算するとK(n)、になります。

  (2^(n - 1) * (n + 1) * (n - 2)) + (2^(n - 1) + 1) + (n * 2^(n - 1))
= 2^(n - 1) * ((n + 1) * (n - 2) + n + 1) + 1
= 2^(n - 1) * ((n^2 - n - 2) + n + 1) + 1
= 2^(n - 1) * (n^2 - 1) + 1

...これは上の式と同じです。


1
PPCGにmathjaxがないのはなぜですか?
ジョナサンアラン

5
@Jonathan私たちはそうしましたが、コードブロックのドル記号に関する多くの問題を引き起こしました。
デニス

1
@JonathanAllan問題はありましたが、しばらくは良かった1 2 3
マイル

バニラJSは2バイト短いです:n=>(n*n-1<<n-1)+1
ETHproductions

待ってください、MathJaxはここで動作しませんか?または、なぜ方程式はイメージですか?
ルドルフジェリン


6

ゼリー、4 バイト

ŒḄ¡S

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

ŒḄ¡S  Main link. Argument: n (integer)

ŒḄ    Bounce; turn the list [a, b, ..., y, z] into [a, b, ..., y, z, y, ..., b, a].
      This casts to range, so the first array to be bounced is [1, ..., n].
      For example, 3 gets mapped to [1, 2, 3, 2, 1].
  ¡   Call the preceding atom n times.
      3 -> [1, 2, 3, 2, 1]
        -> [1, 2, 3, 2, 1, 2, 3, 2, 1]
        -> [1, 2, 3, 2, 1, 2, 3, 2, 1, 2, 3, 2, 1, 2, 3, 2, 1]
   S  Compute the sum.

ああ、それバウンスのすることです。数日前にその正確な操作をJaptに追加する前に、P
ETHproductions

5

パイソン2、25の 23バイト

lambda x:(x*x-1<<x-1)+1

マイルの式を使用しました。

-2バイトのJonathan Allanに感謝します。


必要ありません~-xx-1減算はシフトよりも優先順位が高いため、同様に使用することができます(短縮ではありません)。
mbomb007

@ mbomb007知っていますが、Jonathan Allanが使用したコードはusedでした~-xので、そのままにしておくことにしました。まあ、誰もが好むようですがx-1、(デニスはその正確なことも言っています)。
エリックアウトゴルファー

私見、それはより読みやすく、使用される数式のように見えます。
mbomb007

@ mbomb007ああ、ごく最近追加された賞金という意味ですか?もしそうなら、私はそれを変更しました。しかし、私は私も行っている可能性が...その後いくつかの引数を上げる可能性がある-~(x*x-1<<~-x)レコードの、しかし-1私は...ブレンドコードのは好きではないので、まだ存在している
エリックOutgolfer

私は賞金について何も意味しません。この回答で使用されている数式。「マイナス1」をとして記述し- 1ます。
mbomb007

4

Lua、105バイト

s=tonumber(arg[1])e=1 for i=1,s>1 and 2^(s-1)or 0 do e=e+1 for j=2,s-1 do e=e+j*2 end e=e+s end print(e)

脱ゴルフ:

stage = tonumber(arg[1])
energy = 1
for i = 1, stage > 1 and 2 ^ (stage - 1) or 0 do
    energy = energy + 1
    for j = 2, stage - 1 do
        energy = energy + j * 2
    end
    energy = energy + stage
end
print(energy)

面白い問題!


3
プログラミングパズルとコードゴルフへようこそ!
エリックアウトゴルファー

s = tonumber(arg [1])は、いくつかのバイトを節約するためにs = ...にスワップアウトできます。... argテーブルを展開して保存します。この場合、arg [1]を返します。また、luaの文字列は、有効な数値コンストラクターのみを含む数値のように機能します。この場合、入力はこの場合と想定できます。
ATaco

4

実際には、8バイト

;²D@D╙*u

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

説明:

これは単に式を計算するだけ(n**2 - 1)*(2**(n-1)) + 1です。

;²D@D╙*u
;         duplicate n
 ²        square (n**2)
  D       decrement (n**2 - 1)
   @      swap (n)
    D     decrement (n-1)
     ╙    2**(n-1)
      *   product ((n**2 - 1)*(2**(n-1)))
       u  increment ((n**2 - 1)*(2**(n-1))+1)

4

GolfScript、11バイト

~.2?(2@(?*)

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

4バイトを削除してくれたMartin Ender(8478)に感謝します。

説明:

            Implicit input                 ["A"]
~           Eval                           [A]
 .          Duplicate                      [A A]
  2         Push 2                         [A A 2]
   ?        Power                          [A A^2]
    (       Decrement                      [A A^2-1]
     2      Push 2                         [A A^2-1 2]
      @     Rotate three top elements left [A^2-1 2 A]
       (    Decrement                      [A^2-1 2 A-1]
        ?   Power                          [A^2-1 2^(A-1)]
         *  Multiply                       [(A^2-1)*2^(A-1)]
          ) Increment                      [(A^2-1)*2^(A-1)+1]
            Implicit output                []


3

Mathematica、15バイト

(#*#-1)2^#/2+1&

ビットシフト演算子はないため、実際のべき乗を行う必要がありますが、指数をデクリメントする代わりに2で除算する方が短くなります。


3

C、26バイト

マクロとして:

#define f(x)-~(x*x-1<<~-x)

関数として(27):

f(x){return-~(x*x-1<<~-x);}

パラメーターが式の場合、マクロバージョンは誤った結果を生成します。検討してくださいf(1+2)
カスペルド

1
@kasperdパラメーターは式ではありません。入力として正の整数nを取り、ステージnカンガルーのアクティビティごとの栄養要件を出力または返す完全なプログラムまたは関数を作成します。
エリックアウトゴルファー

あなたの引用は完全なプログラムまたは機能を言います。しかし、マクロはどちらありません。
カスペルド

@kasperd基本的には、関数のようなものですが、評価はありません。また、必要に応じて、以下に「実際の」関数を提供しました。
エリックアウトゴルファー


2

C#、18バイト

n=>(n*n-1<<n-1)+1;

Qwerp-Derpの優れた数学的分析に基づく匿名関数。

テストケースを含む完全なプログラム:

using System;

namespace KangarooSequence
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int,int>f= n=>(n*n-1<<n-1)+1;

            //test cases:
            for (int i = 1; i <= 10; i++)
                Console.WriteLine(i + " -> " + f(i));
            /* will display:
            1 -> 1
            2 -> 7
            3 -> 33
            4 -> 121
            5 -> 385
            6 -> 1121
            7 -> 3073
            8 -> 8065
            9 -> 20481
            10 -> 50689
            */
        }
    }
}

2

バッチ、30バイト

@cmd/cset/a"(%1*%1-1<<%1-1)+1"

とにかく、Javaに勝ります。



2

オアシス、9バイト

2n<mn²<*>

の組み込み機能がないことに驚いています 2^nます。

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

説明:

2n<m        # 2^(n-1) (why is m exponentiation?)
    n²<     # n^2-1
       *    # (2^(n-1))*(n^2-1)
        >   # (2^(n-1))*(n^2-1)+1

オランダ語のべき乗はmachtsverheffingであり、それは創造性の欠如です。また、遅延と先延ばしのため、多くのオペレーターはまだ実装されていません。
アドナン

1

ラケット33バイト

@ Qwerp-Derpで説明されている式の使用

(+(*(expt 2(- n 1))(-(* n n)1))1)

ゴルフをしていない:

(define (f n)
  (+ (*(expt 2
            (- n 1))
      (-(* n n)
        1))
    1))

テスト:

(for/list((i(range 1 11)))(f i))

出力:

'(1 7 33 121 385 1121 3073 8065 20481 50689)


1

Scala、23バイト

(n:Int)=>(n*n-1<<n-1)+1

ビットシフトをべき乗として使用します





0

Groovy(22バイト)

{(it--**2-1)*2**it+1}​

保存しません nが、このコンペティションの他のすべてと同じ式を使用します。必要な括弧のために、1バイトをデクリメントで保存しました。

テスト

(1..10).collect{(it--**2-1)*2**it+1}​

[1、7、33、121、385、1121、3073、8065、20481、50689]


0

JS-Forth、32バイト

超短ではありませんが、Javaよりも短いです。この関数は、結果をスタックにプッシュします。を使用するため、JS-Forthが必要<<です。

: f dup dup * 1- over 1- << 1+ ;

オンラインで試す

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