Kanguru dizisini hesapla


25

backstory

Feragatname: Kangurularla ilgili bilgiler içerebilir.

Kanguru gelişmenin birkaç aşamasını geçiyor. Yaşlandıkça ve güçlendikçe, daha yükseğe ve daha uzun zıplayabilirler ve aç olmadan önce daha fazla zıplayabilirler.

1. aşamada , kanguru çok azdır ve hiç atlayamaz. Buna rağmen, sürekli beslenme gerektirir. Böyle bir aşama 1 kanguru aktivitesini temsil edebiliriz .

o

Aşamada 2 , kanguru küçük sıçramalar yapabilir, ancak en fazla 2 önce acıkır. 2. aşamada kangaroo'nun aktivite modelini bu şekilde temsil edebiliriz .

 o o
o o o

2. aşamadan sonra , kanguru hızla iyileşir. Takip eden her bir aşamada, kanguru biraz daha yükseğe (grafiksel gösterime göre 1 birim) ve iki kez daha zıplayabilir. Örneğin, bir aşama 3 kanguru aktivite kalıbı buna benziyor.

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

Tüm bu atlamalar enerji gerektirir, bu yüzden kanguru her bir aktivite kalıbını tamamladıktan sonra beslenmeyi gerektirir. Gereken tam miktar aşağıdaki gibi hesaplanabilir.

  1. Her bir atama o bir sahnenin etkinlik modeli N yani, yükseklik, bir numara KANGAROO 1 için n , burada 1 zemin ve karşılık gelir , n en yüksek konuma.

  2. Etkinlik düzenindeki tüm yüksekliklerin toplamını hesaplayın.

Örneğin, bir aşama 3 kanguru aktivitesi modeli aşağıdaki yükseklikleri içerir.

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

Beş tane 1 , sekiz tane 2 ve dört tane 3 tane var ; toplam 5 · 1 + 8 · 2 + 4 · 3 = 33'tür .

Görev

Tam bir program ya da pozitif bir tamsayı alan bir fonksiyon yazın n bir sahne aktivitesinin başına besin gereksinimleri giriş ve baskılar veya döner n kanguru .

Bu ; bayt cinsinden en kısa cevap kazanabilir!

Örnekler

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

15
Oy verdim çünkü karmaşık bir kurulumun golf oynamak için basit bir formüle indirdiği zorluklardan hoşlanmıyorum.
xnor,

3
Şimdiye kadarki tüm cevaplar formülü kullanırken, soruna karşı koymanın başka yolları olduğuna da ikna oldum.
Dennis,

2
Bu dizinin ascii sanat çıktısını üretmek için bir zorluk var mı?
mil

@miles Emin değil. Aramak biraz zor.
Dennis,

Wolfram Alpha daha kısa bir sürüm bulamadı, http://www.wolframalpha.com/input/?i=2%5E(n-1)*(n%5E2-1)%2B1(Normal bir URL karışık olduğu için Garip biçimlendirme)
Konijn

Yanıtlar:


8

Jöle , 6 bayt

²’æ«’‘

Her bir değeri hesaplamak için ( n 2 - 1) 2 n - 1 + 1 formülünü kullanır . @ Qwerp-Derp's bir kanıtı sunacak kadar kibardı .

Çevrimiçi deneyin! veya Tüm test durumlarını doğrulayın.

açıklama

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

Elle mi yaptınız yoksa otomatik olarak mı yaptınız?
Outgolfer Erik,

O J kullanarak ve OEIS arama Bulunan ardından elle bunu basitleştirilmiş
mil

Kendi cevabımın rekabet dışı olduğunu düşünüyorum, bu yüzden bunu kabul ettim.
Dennis,

17

Kahve metni, 19 bayt

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

Düzenleme: Dennis 6 bayt doğrama için teşekkürler!

Kanguru sayılarının üretilmesi için formül şöyledir:

enter image description here

Formül açıklaması:

Sayısı 1's K(n)' in nihai toplamı olan2^(n - 1) + 1 .

Sayısı n's K(n)' in nihai toplamı olan 2^(n - 1)tüm toplamı, böylece n's n * 2^(n - 1).

Nihai toplamındaki diğer herhangi bir sayının ( d) sayısı , yani tümünün toplamı olur .K(n)2^ndd * 2^n

  • Böylece, diğer tüm sayıların toplamı , üçgen sayı işlevi = (T(n) - (n + 1)) * 2^nneredeT(n)T(n) = (n^2 + 1) / 2 ).

    Bunun yerine son toplamı elde ederiz.

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

Tüm toplamları topladığımızda, K(n)eşittir

  (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

... yukarıdaki formüle eşittir.


1
Neden PPCG'de matematik yok?
Jonathan Allan,

5
@Jonathan Yaptık, ancak kod bloklarındaki dolar işareti ile ilgili birçok soruna yol açtı.
Dennis,

1
@JonathanAllan Sorunlar vardı ama bir süre için güzeldi 1 2 3
miles

Vanilla JS iki bayt daha kısa:n=>(n*n-1<<n-1)+1
ETHproductions 16:16

Bekle, MathJax burada çalışmıyor mu? Veya neden denklem bir görüntüdür?
RudolfJelin


6

Jöle , 4 bayt

ŒḄ¡S

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

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

Demek en o neyi sıçrama yapar. Keşke bu operasyonu birkaç gün önce Japt'a eklemeden önce şunu bilseydim: P
ETHproductions

5

Python 2, 25 23 bayt

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

Kullanılan mil formülü.

Jonathan Allan'a -2 bayt için teşekkürler.


İhtiyacın yok ~-x. x-1Çıkarma, kaydırmadan daha yüksek önceliğe sahip olduğundan, (herhangi bir kısa değil) de kullanabilirsiniz .
mbomb007

@ mbomb007 Biliyorum ama Jonathan Allan'ın kullandığı kod kullanılmış ~-x, bu yüzden değiştirmeden bırakmaya karar verdim. Öyle görünüyor ki, herkes tercih ediyor gibi görünüyor x-1(Dennis de bu kesin şeyi söyledi).
Outgolfer Erik,

IMHO, Daha okunaklı ve kullanılan matematiksel formül gibi görünüyor.
mbomb007

@ mbomb007 Oh, son zamanlarda eklenen ödül demek istiyorsun? Eğer öyleyse, değiştirdim. Ama, ben de yapmış olabilir ... sonra bazı argümanlar yükseltebilir -~(x*x-1<<~-x)kayıt için ama -1ben ... harman koduna sevmiyorum bu yüzden, hala var
Erik Outgolfer

Ödül hakkında hiçbir şey demek istemiyorum. Bu cevapta kullanılan matematik formülü . "Eksi 1" yazıyoruz - 1.
mbomb007

4

Lua, 105 bayt

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-golfed:

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)

Eğlenceli problem!


3
Programlama Bulmacaları ve Code Golf'a Hoş Geldiniz!
Outgolfer Erik,

s = tonumber (arg [1]), bazı baytları kaydetmek için s = ... için değiştirilebilir. ... açılmış olan arg tablosunu saklar, bu durumda arg [1] döndürür. Ve Lua'nın dizeleri sayıları sadece geçerli bir sayı kurucusu içerdikleri gibi davranırlar; bu durumda girdinin bu durumda olduğunu varsayabiliriz.
ATaco,

4

Aslında 8 bayt

;²D@D╙*u

Çevrimiçi deneyin!

Açıklama:

Bu sadece formülü hesaplar (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 bayt

~.2?(2@(?*)

Çevrimiçi deneyin!

4 baytı kaldırmak için teşekkürler Martin Ender (8478).

Açıklama:

            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 bayt

ri_2#(\(m<)

Çevrimiçi deneyin.

Açıklama:

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.

Sadece ihtiyacım olmadıysa ri...
Outgolfer Erik

3

Mathematica, 15 bayt

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

Uç değiştirme operatörü yoktur, bu nedenle gerçek üstelleştirmeyi yapmamız gerekir, ancak üs, üsteleri azaltmak yerine 2'ye bölmek daha kısadır.


3

C, 26 bayt

Makro olarak:

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

Bir fonksiyon olarak (27):

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

Parametre bir ifade ise, makro versiyonu yanlış sonuçlar verecektir. Düşünün f(1+2).
kasperd

1
@ kasperd Parametre bir ifade olmayacak. Tam bir program ya da girdi olarak pozitif bir tamsayı n alan ve bir aşama n kanguru aktivitesi başına besin gereksinimlerini basan veya iade eden bir fonksiyon yazın .
Outgolfer Erik

Teklifiniz tam bir program veya işlev diyor . Ancak bir makro da değil.
kasperd

@ kasperd Temelde, sanırım bir işlev gibi, ancak değerlendirme olmadan. Ayrıca, aşağıda "gerçek" bir işlev sağladım, eğer istediğin buysa.
Outgolfer Erik,


2

C #, 18 bayt

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

Qwerp-Derp'in mükemmel matematiksel analizine dayanan anonim işlev .

Test vakaları ile tam program:

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

Toplu iş, 30 bayt

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

Yine de Java'yı yeniyor.


2

MATL , 7 bayt

UqGqW*Q

Formülü diğer cevaplardan kullanır.

Çevrimiçi deneyin!

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

Vaha , 9 bayt

2n<mn²<*>

Bir yerleşik olmadığına şaşırdım 2^n.

Çevrimiçi deneyin!

Açıklama:

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

Hollandaca’da müstelik bir başarı, bu ve yaratıcılık eksikliğidir. Ayrıca, tembellik ve erteleme nedeniyle birçok operatör henüz uygulanmamıştır.
Adnan,

1

Raket 33 bayt

@ Qwerp-Derp tarafından açıklanan formülü kullanma

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

Ungolfed:

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

Test yapmak:

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

Çıktı:

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

1

Ruby, 21 bayt

@ Qwerp-Derp temel olarak ağır kaldırma işlemini yaptı.

Yakuttaki önceliklerinden dolayı, bazı parenlere ihtiyacımız var gibi görünüyor:

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

1

Scala, 23 bayt

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

Üs olarak bit kaydırma kullanır



1

R, 26 bayt

Utanmadan formülün uygulanması

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

1

J , 11 bayt

1-<:2&*1-*:

Daha önce bulunan aynı formüle dayanarak .

Çevrimiçi deneyin!

açıklama

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

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

Korumaz n , ancak bu yarışmada diğerleriyle aynı formülü kullanır. Gerekli parantez nedeniyle, azalmalar ile 1 bayt kurtarıldı.

Ölçek

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

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


0

JS-Forth, 32 bayt

Çok kısa değil, fakat Java'dan daha kısa. Bu işlev sonucu istifin üzerine iter. Bu JS-Forth gerektiriyor çünkü kullanıyorum <<.

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

Çevrimiçi deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.