Oblicz sekwencję kangura

25

Historia

Oświadczenie: Może zawierać wymyślone informacje o kangurach.

Kangury przemierzają kilka etapów rozwoju. Gdy dorastają i stają się silniejsze, mogą skakać coraz wyżej i dłużej i mogą skakać więcej razy, zanim poczują głód.

Na etapie 1 kangur jest bardzo mały i nie może w ogóle skakać. Mimo to stale wymaga pożywienia. Możemy przedstawić wzór aktywności kangura z etapu 1 w ten sposób.

o

Na etapie 2 kangur może wykonywać małe skoki, ale nie więcej niż 2, zanim stanie się głodny. Możemy przedstawić taki wzór aktywności kangura 2. stopnia .

 o o
o o o

Po etapie 2 kangur szybko się poprawia. Na każdym kolejnym etapie kangur może skoczyć nieco wyżej (1 jednostka w graficznej reprezentacji) i dwa razy więcej. Na przykład wzór aktywności kangura trzeciego stopnia wygląda tak.

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

Całe to skakanie wymaga energii, więc kangur wymaga odżywienia po ukończeniu każdego wzorca aktywności. Dokładną wymaganą kwotę można obliczyć w następujący sposób.

  1. Przypisz każdemu o we wzorze aktywności kangura etapu n jego wysokość, tj. Liczbę od 1 do n , gdzie 1 odpowiada ziemi, a n najwyższej pozycji.

  2. Oblicz sumę wszystkich wysokości we wzorze aktywności.

Na przykład wzorzec aktywności kangura 3. stopnia obejmuje następujące wysokości.

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

Mamy pięć 1 , osiem 2 i cztery 3 ; suma wynosi 5,1 + 8,2 + 4,3 = 33 .

Zadanie

Napisz pełny program lub funkcję, która przyjmuje dodatnią liczbę całkowitą n jako dane wejściowe i wypisuje lub zwraca wymagania żywieniowe na aktywność kangura stage n .

To jest ; niech wygra najkrótsza odpowiedź w bajtach!

Przykłady

 1 ->     1
 2 ->     7
 3 ->    33
 4 ->   121
 5 ->   385
 6 ->  1121
 7 ->  3073
 8 ->  8065
 9 -> 20481
10 -> 50689
Dennis
źródło
15
Uznałem, że nie lubię wyzwań, w których skomplikowana konfiguracja sprowadza się do prostej formuły gry w golfa.
xnor
3
Chociaż wszystkie dotychczasowe odpowiedzi wykorzystały tę formułę, jestem przekonany, że istnieją inne sposoby na zaatakowanie problemu.
Dennis
2
Czy istnieje wyzwanie, aby wygenerować wynik ascii art tej sekwencji?
mil
@miles Nie jestem pewien. Trochę trudny do wyszukiwania.
Dennis
Wolfram Alpha nie mógł znaleźć krótszej wersji http://www.wolframalpha.com/input/?i=2%5E(n-1)*(n%5E2-1)%2B1(Dziwne znaczniki, ponieważ pomieszany jest zwykły adres URL)
Konijn

Odpowiedzi:

8

Galaretka , 6 bajtów

²’æ«’‘

Używa wzoru ( n 2 - 1) 2 n - 1 + 1 do obliczenia każdej wartości. @ Qwerp-Derp's był na tyle uprzejmy, aby dostarczyć dowód .

Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe.

Wyjaśnienie

²’æ«’‘  Input: n
²       Square n
 ’      Decrement
  æ«    Bit shift left by
    ’     Decrement of n
     ‘  Increment
mile
źródło
Czy zrobiłeś to ręcznie, czy wygenerowałeś to automatycznie?
Erik the Outgolfer
Znaleziono go za pomocą J i przeszukiwania OEIS, a następnie uprościłem go ręcznie
mile
Uważam, że moja odpowiedź nie jest konkurencyjna, więc zaakceptowałem tę.
Dennis
17

Coffeescript, 19 bajtów

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

Edycja: Podziękowania dla Dennisa za odcięcie 6 bajtów!

Wzór na generowanie liczb Kangur jest następujący:

enter image description here

Objaśnienie wzoru:

Liczbę 1„sw K(n)” s ostatecznej sumy jest2^(n - 1) + 1 .

Liczbę n„sw K(n)” s ostatecznej sumy jest 2^(n - 1), więc suma wszystkich n„s jest n * 2^(n - 1).

Liczba dowolnych innych liczb ( d) w K(n)końcowej sumie wynosi 2^n, więc suma wszystkich liczb dbyłaby d * 2^n.

  • Zatem suma wszystkich pozostałych liczb = (T(n) - (n + 1)) * 2^n, gdzie T(n)jest funkcja liczby trójkątnej (która ma wzór T(n) = (n^2 + 1) / 2).

    Zastępując to, otrzymujemy ostateczną sumę

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

Gdy zsumujemy wszystkie sumy, otrzymamy K(n), co równa się

  (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

... co odpowiada powyższej formule.

clismique
źródło
1
Dlaczego PPCG nie ma Mathjax?
Jonathan Allan
5
@Jonathan Zrobiliśmy to, ale spowodowało wiele problemów ze znakami dolara w blokach kodu.
Dennis
1
@JonathanAllan Wystąpiły problemy, ale miło było na chwilę 1 2 3
mile
Vanilla JS jest dwa bajty krótszy:n=>(n*n-1<<n-1)+1
ETHprodukcje
Czekaj, MathJax tu nie działa? Lub dlaczego równanie jest obrazem?
RudolfJelin
7

Java 7, 35 bajtów

int c(int n){return(n*n-1<<n-1)+1;}
Numberknot
źródło
6

Galaretka , 4 bajty

ŒḄ¡S

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

ŒḄ¡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
źródło
Och, więc to właśnie robi odbicie. Chciałbym wiedzieć, że przed dodaniem tej dokładnej operacji do Japt kilka dni temu: P
ETHprodukcje
5

Python 2, 25 23 bajtów

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

Wykorzystano wzór mil.

Podziękowania dla Jonathana Allana za -2 bajty.

Erik the Outgolfer
źródło
Nie trzeba ~-x. Możesz także użyć x-1(nie krótszy), ponieważ odejmowanie ma wyższy priorytet niż przesunięcie.
mbomb007
@ mbomb007 Wiem, ale kod Jonathan Allan dał mi używany ~-x, więc postanowiłem pozostawić go bez zmian. Cóż, wydaje się, że wszyscy wolą x-1(Dennis również to powiedział).
Erik the Outgolfer,
IMHO, jest bardziej czytelny i bardziej przypomina matematyczną formułę.
mbomb007
@ mbomb007 Och, masz na myśli ostatnio dodaną nagrodę? Jeśli tak, zmieniłem to. Ale mógłbym wtedy podnieść kilka argumentów ... Mógłbym również zrobić to -~(x*x-1<<~-x)dla rekordu, ale -1nadal istnieje, więc nie lubię mieszać kodu ...
Erik Outgolfer
Nie mam nic na myśli za nagrodę. Wzór matematyczny zastosowany w tej odpowiedzi . Zapisujemy „minus 1” jako - 1.
mbomb007,
4

Lua, 105 bajtów

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)

Gra w golfa:

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)

Zabawny problem!

Tanner Grehawick
źródło
3
Witamy w Programowaniu zagadek i Code Golf!
Erik the Outgolfer
s = tonumber (arg [1]) można zamienić na s = ..., aby zapisać niektóre bajty. ... przechowuje rozpakowaną tabelę arg, w tym przypadku zwraca arg [1]. A łańcuchy lua będą działać tak, jakby liczby zawierały tylko poprawny konstruktor liczb, co możemy założyć, że dane wejściowe są w tym przypadku.
ATaco
4

Właściwie 8 bajtów

;²D@D╙*u

Wypróbuj online!

Wyjaśnienie:

To po prostu oblicza wzór (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
źródło
4

GolfScript , 11 bajtów

~.2?(2@(?*)

Wypróbuj online!

Dzięki Martin Ender (8478) za usunięcie 4 bajtów.

Wyjaśnienie:

            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
źródło
4

CJam, 11 bajtów

ri_2#(\(m<)

Wypróbuj online.

Wyjaśnienie:

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
źródło
Tylko gdybym nie potrzebował ri...
Erik the Outgolfer
3

Mathematica, 15 bajtów

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

Nie ma operatora przesunięcia bitów, więc musimy dokonać rzeczywistego potęgowania, ale wtedy krótsze jest podzielenie przez 2 zamiast zmniejszania potęgi.

Martin Ender
źródło
3

C, 26 bajtów

Jako makro:

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

W funkcji (27):

f(x){return-~(x*x-1<<~-x);}
Erik the Outgolfer
źródło
Wersja makro da niepoprawne wyniki, jeśli parametr jest wyrażeniem. Zastanów się f(1+2).
kasperd
1
@kasperd Parametr nie będzie wyrażeniem. Napisz pełny program lub funkcję, która przyjmuje dodatnią liczbę całkowitą n jako dane wejściowe i wypisuje lub zwraca wymagania żywieniowe na aktywność kangura stage n .
Erik the Outgolfer
Twój cytat mówi pełny program lub funkcję . Ale makro nie jest ani jedno, ani drugie.
kasperd
@kasperd Zasadniczo myślę, że to jak funkcja, ale bez oceny. Podałem też poniżej funkcję „prawdziwą”, jeśli tego właśnie chcesz.
Erik the Outgolfer
3

05AB1E , 7 bajtów

n<¹<o*>

Wypróbuj online!

Wyjaśnienie

n<        # n^2
     *    # *
  ¹<o     # 2^(n-1)
      >   # + 1
Emigna
źródło
2

C #, 18 bajtów

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

Anonimowa funkcja oparta na doskonałej analizie matematycznej Qwerp-Derp .

Pełny program z przypadkami testowymi:

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
źródło
2

Partia, 30 bajtów

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

Cóż, i tak bije Javę.

Neil
źródło
2

MATL , 7 bajtów

UqGqW*Q

Wykorzystuje formułę z innych odpowiedzi.

Wypróbuj 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
źródło
2

Oaza , 9 bajtów

2n<mn²<*>

Dziwi mnie, że nie ma wbudowanego 2^n.

Wypróbuj online!

Wyjaśnienie:

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
źródło
Potęgowanie w języku niderlandzkim jest modczuwalne, to i brak kreatywności. Ponadto wielu operatorów nie zostało jeszcze zaimplementowanych z powodu lenistwa i zwlekania.
Adnan
1

Rakieta 33 bajty

Za pomocą wzoru wyjaśnionego przez @ Qwerp-Derp

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

Nie golfowany:

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

Testowanie:

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

Wydajność:

'(1 7 33 121 385 1121 3073 8065 20481 50689)
rnso
źródło
1

Ruby, 21 bajtów

@ Qwerp-Derp w zasadzie wykonał ciężkie podnoszenie.

Ze względu na pierwszeństwo w rubinie, wydaje się, że potrzebujemy trochę parens:

->(n){(n*n-1<<n-1)+1}
David Ljung Madison Stellar
źródło
1

Scala, 23 bajty

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

Używa przesunięcia bitowego jako potęgowania

corvus_192
źródło
1

Pyth, 8 bajtów

h.<t*QQt

pyth.herokuapp.com

Wyjaśnienie:

     Q   Input
      Q  Input
    *    Multiply
   t     Decrement
       t Decrement the input
 .<      Left bitshift
h        Increment
Erik the Outgolfer
źródło
1

R, 26 bajtów

Bezwstydnie stosując formułę

n=scan();2^(n-1)*(n^2-1)+1
Billywob
źródło
1

J , 11 bajtów

1-<:2&*1-*:

Oparty na tej samej formule znalezionej wcześniej .

Wypróbuj online!

Wyjaśnienie

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
mile
źródło
0

Groovy (22 bajtów)

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

Nie chroni n , ale stosuje tę samą formułę, co wszystkie inne w tym konkursie. Zapisano 1 bajt ze zmniejszeniami ze względu na potrzebny nawias.

Test

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

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

Urna Magicznej Ośmiornicy
źródło
0

JS-Forth, 32 bajty

Niezbyt krótki, ale krótszy niż Java. Ta funkcja wypycha wynik na stos. Wymaga to JS-Forth, ponieważ używam <<.

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

Wypróbuj online

mbomb007
źródło