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

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

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.


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


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.

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.


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!


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)

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

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.

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.


3

C, 26 bajtów

Jako makro:

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

W funkcji (27):

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

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


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
            */
        }
    }
}

2

Partia, 30 bajtów

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

Cóż, i tak bije Javę.


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 

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

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)

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}

1

Scala, 23 bajty

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

Używa przesunięcia bitowego jako potęgowania



1

R, 26 bajtów

Bezwstydnie stosując formułę

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

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

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]


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.