Hitung urutan kangguru


25

Backstory

Penafian: Dapat berisi informasi buatan tentang kanguru.

Kanguru melewati beberapa tahap perkembangan. Seiring bertambahnya usia dan semakin kuat, mereka bisa melompat lebih tinggi dan lebih lama, dan mereka bisa melompat lebih banyak sebelum mereka lapar.

Pada tahap 1 , kanguru sangat kecil dan tidak bisa melompat sama sekali. Meskipun demikian, secara konstan membutuhkan makanan. Kita bisa mewakili pola aktivitas kanguru tahap 1 seperti ini.

o

Pada tahap 2 , kanguru dapat membuat lompatan kecil, tetapi tidak lebih dari 2 sebelum lapar. Kita bisa mewakili pola aktivitas kanguru tahap 2 seperti ini.

 o o
o o o

Setelah tahap 2 kangguru membaik dengan cepat. Pada setiap tahap selanjutnya, kanguru dapat melompat sedikit lebih tinggi (1 unit dalam representasi grafis) dan dua kali lebih banyak. Misalnya, pola aktivitas kanguru tahap 3 terlihat seperti ini.

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

Semua lompatan itu membutuhkan energi, sehingga kangguru membutuhkan makanan setelah menyelesaikan setiap pola aktivitas. Jumlah persis yang dibutuhkan dapat dihitung sebagai berikut.

  1. Tetapkan setiap o dalam pola aktivitas panggung dan kangguru, tingginya, yaitu angka dari 1 hingga n , di mana 1 bersesuaian dengan tanah dan n ke posisi tertinggi.

  2. Hitung jumlah semua ketinggian dalam pola aktivitas.

Misalnya, pola aktivitas kanguru tahap 3 mencakup ketinggian berikut.

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

Kami memiliki lima 1 , delapan 2 , dan empat 3 ; jumlahnya adalah 5 · 1 + 8 · 2 + 4 · 3 = 33 .

Tugas

Tulis program lengkap atau fungsi yang mengambil bilangan bulat positif n sebagai input dan mencetak atau mengembalikan persyaratan nutrisi per aktivitas tahap n kanguru.

Ini adalah ; semoga jawaban tersingkat dalam byte menang!

Contohnya

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

15
Saya downvoted karena saya tidak suka tantangan di mana pengaturan yang rumit turun ke rumus langsung ke golf.
xnor

3
Sementara semua jawaban sejauh ini telah menggunakan formula, saya yakin bahwa ada cara lain untuk menyerang masalah tersebut.
Dennis

2
Apakah ada tantangan untuk menghasilkan output seni ascii dari urutan ini?
mil

@miles Tidak yakin. Agak sulit untuk dicari.
Dennis

Wolfram Alpha tidak dapat menemukan versi yang lebih pendek, http://www.wolframalpha.com/input/?i=2%5E(n-1)*(n%5E2-1)%2B1(markup aneh karena URL reguler menjadi kacau)
Konijn

Jawaban:


8

Jelly , 6 byte

²’æ«’‘

Menggunakan rumus ( n 2 - 1) 2 n - 1 + 1 untuk menghitung setiap nilai. @ Qwerp-Derp cukup berbaik hati untuk memberikan bukti .

Cobalah online! atau Verifikasi semua kasus uji.

Penjelasan

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

Apakah Anda melakukannya dengan tangan, atau menghasilkan secara otomatis?
Erik the Outgolfer

Ditemukan menggunakan J dan mencari Oei, kemudian disederhanakan dengan tangan
mil

Saya menganggap jawaban saya sendiri tidak bersaing, jadi saya telah menerima jawaban ini.
Dennis

17

Coffeescript, 19 byte

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

Sunting: Terima kasih kepada Dennis karena telah memangkas 6 byte!

Rumus untuk menghasilkan angka Kanguru adalah ini:

masukkan deskripsi gambar di sini

Penjelasan rumus:

Jumlah 1's di K(n)' s jumlah akhir adalah 2^(n - 1) + 1.

Jumlah n's di K(n)' s jumlah akhir adalah 2^(n - 1), sehingga jumlah semua n's adalah n * 2^(n - 1).

Jumlah angka lain ( d) dalam K(n)jumlah akhir adalah 2^n, jadi jumlah semua dakan menjadi d * 2^n.

  • Jadi, jumlah dari semua bilangan lainnya = (T(n) - (n + 1)) * 2^n, di mana T(n)adalah fungsi bilangan segitiga (yang memiliki rumus T(n) = (n^2 + 1) / 2).

    Mengganti itu dalam, kita mendapatkan jumlah akhir

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

Saat kita menjumlahkan semua jumlah, kita dapatkan K(n), yang sama dengan

  (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

... yang sama dengan rumus di atas.


1
Mengapa PPCG tidak memiliki mathjax?
Jonathan Allan

5
@ Jonathan Kami melakukannya, tetapi itu menyebabkan banyak masalah dengan tanda dolar di blok kode.
Dennis

1
@ JonathanAllan Ada masalah tapi itu bagus untuk sementara waktu 1 2 3
mil

Vanilla JS lebih pendek dua byte:n=>(n*n-1<<n-1)+1
ETHproduk

Tunggu, MathJax tidak bekerja di sini? Atau mengapa persamaan adalah gambar?
RudolfJelin


6

Jelly , 4 byte

ŒḄ¡S

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

ŒḄ¡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.

Oh, jadi itu yang dilakukan bouncing. Saya berharap saya tahu itu sebelum menambahkan operasi yang tepat untuk Japt beberapa hari yang lalu: P
ETHproduk

5

Python 2, 25 23 byte

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

Menggunakan rumus miles.

Terima kasih kepada Jonathan Allan untuk -2 byte.


Anda tidak perlu ~-x. Anda dapat menggunakan x-1juga (tidak lebih pendek), karena pengurangan memiliki prioritas lebih tinggi daripada bergeser.
mbomb007

@ mbomb007 Saya tahu, tetapi kode yang diberikan Jonathan Allan ~-x, jadi saya memutuskan untuk tidak mengubahnya. Yah, sepertinya semua orang lebih suka x-1, (Dennis juga mengatakan hal itu).
Erik the Outgolfer

IMHO, Ini lebih mudah dibaca, dan lebih mirip rumus matematika yang digunakan.
mbomb007

@ mbomb007 Oh maksudmu karunia yang baru ditambahkan? Jika demikian, saya mengubahnya. Tapi, saya mungkin mengajukan beberapa argumen kemudian ... Saya bisa juga melakukan -~(x*x-1<<~-x)untuk catatan, tetapi -1masih ada, jadi saya tidak suka mencampur kode ...
Erik the Outgolfer

Saya tidak bermaksud apa-apa tentang hadiah itu. Rumus matematika yang digunakan dalam jawaban ini . Kami menulis "minus 1" sebagai - 1.
mbomb007

4

Lua, 105 byte

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)

De-golf:

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)

Menghibur masalah!


3
Selamat Datang di Programming Puzzles dan Code Golf!
Erik the Outgolfer

s = tonumber (arg [1]) dapat diganti untuk s = ... untuk menghemat beberapa byte. ... menyimpan tabel arg tanpa kemasan, dalam hal ini, mengembalikan arg [1]. Dan string lua akan bertindak seperti jumlah mereka hanya berisi konstruktor angka yang valid, yang dapat kita asumsikan inputnya ada dalam kasus ini.
ATaco

4

Sebenarnya , 8 byte

;²D@D╙*u

Cobalah online!

Penjelasan:

Ini hanya menghitung rumus (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 byte

~.2?(2@(?*)

Cobalah online!

Terima kasih Martin Ender (8478) karena menghapus 4 byte.

Penjelasan:

            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                []

4

CJam, 11 byte

ri_2#(\(m<)

Cobalah secara Online.

Penjelasan:

r           e# Get token.       ["A"]
 i          e# Integer.         [A]
  _         e# Duplicate.       [A A]
   2#       e# Square.          [A A^2]
     (      e# Decrement.       [A A^2-1]
      \     e# Swap.            [A^2-1 A]
       (    e# Decrement.       [A^2-1 A-1]
        m<  e# Left bitshift.   [(A^2-1)*2^(A-1)]
          ) e# Increment.       [(A^2-1)*2^(A-1)+1]
            e# Implicit output.

Hanya jika saya tidak perlu ri...
Erik the Outgolfer

3

Mathematica, 15 byte

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

Tidak ada operator bitshift, jadi kita perlu melakukan eksponensial yang sebenarnya, tetapi kemudian lebih pendek untuk membagi dengan 2 daripada mengurangi eksponen.


3

C, 26 byte

Sebagai makro:

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

Sebagai fungsi (27):

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

Versi makro akan menghasilkan hasil yang salah jika parameternya adalah ekspresi. Pertimbangkan f(1+2).
kasperd

1
@kasperd Parameter tidak akan berupa ekspresi. Tulis program lengkap atau fungsi yang mengambil bilangan bulat positif n sebagai input dan mencetak atau mengembalikan persyaratan nutrisi per aktivitas tahap n kanguru.
Erik the Outgolfer

Kutipan Anda mengatakan program atau fungsi lengkap . Tapi makro bukan keduanya.
kasperd

@kasperd Pada dasarnya, saya pikir ini seperti fungsi, tetapi tanpa evaluasi. Juga, saya telah menyediakan fungsi "nyata" di bawah, jika itu yang Anda inginkan.
Erik the Outgolfer


2

C #, 18 byte

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

Fungsi anonim berdasarkan analisis matematis yang sangat baik dari Qwerp-Derp .

Program lengkap dengan uji kasus:

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

Batch, 30 byte

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

Yah, toh itu mengalahkan Java.


2

MATL , 7 byte

UqGqW*Q

Menggunakan rumus dari jawaban lain.

Cobalah online!

U    % Implicit input. Square
q    % Decrement by 1
G    % Push input again
q    % Decrement by 1
W    % 2 raised to that
*    % Multiply
Q    % Increment by 1. Implicit display 

2

Oasis , 9 byte

2n<mn²<*>

Saya terkejut tidak ada built-in untuk 2^n.

Cobalah online!

Penjelasan:

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

Eksponen dalam bahasa Belanda sangat msulit, dan kurangnya kreativitas. Juga, banyak operator belum diimplementasikan, karena malas dan penundaan.
Adnan

1

Racket 33 byte

Menggunakan rumus yang dijelaskan oleh @ Qwerp-Derp

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

Tidak Disatukan:

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

Pengujian:

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

Keluaran:

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

1

Ruby, 21 byte

@ Qwerp-Derp pada dasarnya melakukan pekerjaan berat.

Karena diutamakan dalam ruby, tampaknya kita perlu beberapa parens:

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

1

Scala, 23 byte

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

Menggunakan bit shift sebagai eksponensial



1

R, 26 byte

Tanpa malu-malu menerapkan formula

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

1

J , 11 byte

1-<:2&*1-*:

Berdasarkan formula yang sama ditemukan sebelumnya .

Cobalah online!

Penjelasan

1-<:2&*1-*:  Input: integer n
         *:  Square n
       1-    Subtract it from 1
  <:         Decrement n
    2&*      Multiply the value 1-n^2 by two n-1 times
1-           Subtract it from 1 and return

0

Groovy (22 Bytes)

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

Tidak diawetkan n, tetapi menggunakan formula yang sama dengan yang lainnya dalam kompetisi ini. Disimpan 1 byte dengan pengurangan, karena tanda kurung yang dibutuhkan.

Uji

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

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


0

JS-Forth, 32 byte

Tidak super pendek, tetapi lebih pendek dari Jawa. Fungsi ini mendorong hasilnya ke tumpukan. Ini membutuhkan JS-Forth karena saya gunakan <<.

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

Cobalah online

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.