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
Dennis
sumber
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
mil
sumber
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.

clismique
sumber
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
7

Java 7, 35 byte

int c(int n){return(n*n-1<<n-1)+1;}
Numberknot
sumber
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.
Dennis
sumber
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.

Erik the Outgolfer
sumber
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!

Tanner Grehawick
sumber
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)
Mego
sumber
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                []
Erik the Outgolfer
sumber
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.
Erik the Outgolfer
sumber
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.

Martin Ender
sumber
3

C, 26 byte

Sebagai makro:

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

Sebagai fungsi (27):

f(x){return-~(x*x-1<<~-x);}
Erik the Outgolfer
sumber
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
3

05AB1E , 7 byte

n<¹<o*>

Cobalah online!

Penjelasan

n<        # n^2
     *    # *
  ¹<o     # 2^(n-1)
      >   # + 1
Emigna
sumber
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
            */
        }
    }
}
adrianmp
sumber
2

Batch, 30 byte

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

Yah, toh itu mengalahkan Java.

Neil
sumber
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 
Luis Mendo
sumber
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
DanTheMan
sumber
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)
juga
sumber
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}
David Ljung Madison Stellar
sumber
1

Scala, 23 byte

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

Menggunakan bit shift sebagai eksponensial

corvus_192
sumber
1

Pyth, 8 byte

h.<t*QQt

pyth.herokuapp.com

Penjelasan:

     Q   Input
      Q  Input
    *    Multiply
   t     Decrement
       t Decrement the input
 .<      Left bitshift
h        Increment
Erik the Outgolfer
sumber
1

R, 26 byte

Tanpa malu-malu menerapkan formula

n=scan();2^(n-1)*(n^2-1)+1
Billywob
sumber
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
mil
sumber
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]

Guci Gurita Ajaib
sumber
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

mbomb007
sumber