Вычислить последовательность кенгуру

25

Предыстория

Отказ от ответственности: может содержать вымышленную информацию о кенгуру.

Кенгуру пересекают несколько этапов развития. Когда они становятся старше и сильнее, они могут прыгать выше и дольше, и они могут прыгать больше раз, прежде чем проголодаться.

На стадии 1 , кенгуру очень мало и не может прыгать на всех. Несмотря на это, постоянно требует питания. Мы можем представить образец активности кенгуру на стадии 1 , как этот.

o

На стадии 2 , кенгуру может делать небольшие прыжки, но не более чем 2 , прежде чем он проголодается. Мы можем представить стадии 2 образец активности кенгуру , как это.

 o o
o o o

После стадии 2 кенгуру быстро улучшается. На каждом последующем этапе кенгуру может прыгать немного выше (1 единица в графическом представлении) и в два раза больше. Например, шаблон активности кенгуру на стадии 3 выглядит следующим образом.

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

Весь этот прыжок требует энергии, поэтому кенгуру требует питания после завершения каждого шаблона деятельности. Точная сумма может быть рассчитана следующим образом.

  1. Присвойте каждому o в схеме активности стадии n кенгуру его высоту, т. Е. Число от 1 до n , где 1 соответствует земле, а n - самой высокой позиции.

  2. Вычислить сумму всех высот в модели деятельности.

Например, шаблон активности кенгуру стадии 3 включает в себя следующие высоты.

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

У нас есть пять 1 , восемь 2 и четыре 3 ; сумма равна 5 · 1 + 8 · 2 + 4 · 3 = 33 .

задача

Напишите полную программу или функцию, которая принимает положительное целое число n в качестве входных данных и печатает или возвращает данные о потребностях в питании на действие стадии n кенгуру .

Это ; пусть победит самый короткий ответ в байтах!

Примеры

 1 ->     1
 2 ->     7
 3 ->    33
 4 ->   121
 5 ->   385
 6 ->  1121
 7 ->  3073
 8 ->  8065
 9 -> 20481
10 -> 50689
Деннис
источник
15
Я понизил голосование, потому что мне не нравятся проблемы, когда сложная установка сводится к простой формуле для гольфа.
xnor
3
Хотя до сих пор во всех ответах использовалась формула, я убежден, что существуют и другие способы решения проблемы.
Деннис
2
Есть ли проблема для генерирования ascii art этой последовательности?
миль
@ миль Не уверен. Вроде сложно искать.
Деннис
Wolfram Alpha не может найти более короткую версию http://www.wolframalpha.com/input/?i=2%5E(n-1)*(n%5E2-1)%2B1(странная разметка, потому что обычный URL испорчен)
Konijn

Ответы:

8

Желе , 6 байт

²’æ«’‘

Использует формулу ( n 2 - 1) 2 n - 1 + 1 для вычисления каждого значения. @ Qwerp-Derp's был достаточно любезен, чтобы предоставить доказательство .

Попробуйте онлайн! или Проверьте все контрольные примеры.

объяснение

²’æ«’‘  Input: n
²       Square n
 ’      Decrement
  æ«    Bit shift left by
    ’     Decrement of n
     ‘  Increment
миль
источник
Вы делали это вручную или автоматически генерировали?
Эрик Outgolfer
Нашел его с помощью J и поиска OEIS, а затем упростил вручную
мили
Я считаю свой ответ неконкурентным, поэтому я принял этот.
Деннис
17

Coffeescript, 19 байтов

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

Изменить: Спасибо Деннис за обрезание 6 байтов!

Формула для генерации чисел Кенгуру:

введите описание изображения здесь

Пояснение формулы:

Число 1's в K(n)' окончательная сумма2^(n - 1) + 1 .

Число n's в K(n)' является итоговой суммой 2^(n - 1), поэтому сумма всех n's' равна n * 2^(n - 1).

Номер любого другого числа ( d) в K(n)итоговой сумме равен 1 2^n, поэтому сумма всех значений dбудет равна d * 2^n.

  • Таким образом, сумма всех других чисел = (T(n) - (n + 1)) * 2^n, где T(n)есть функция числа треугольника (который имеет формулу T(n) = (n^2 + 1) / 2).

    Подставляя это в, мы получаем окончательную сумму

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

Когда мы складываем все суммы, мы получаем K(n), что равно

  (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

... который равен формуле выше.

clismique
источник
1
Почему у PPCG нет mathjax?
Джонатан Аллан
5
@Jonathan Мы сделали, но это вызвало много проблем со знаками доллара в блоках кода.
Деннис
1
@JonathanAllan Были проблемы, но какое-то время было приятно 1 2 3
мили
Vanilla JS на два байта короче:n=>(n*n-1<<n-1)+1
ETHproductions
Подожди, MathJax здесь не работает? Или почему уравнение это изображение?
РудольфДжелин
7

Java 7, 35 байт

int c(int n){return(n*n-1<<n-1)+1;}
Numberknot
источник
6

Желе , 4 байта

ŒḄ¡S

Попробуйте онлайн! или проверьте все контрольные примеры .

Как это работает

ŒḄ¡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.
Деннис
источник
О, вот что делает отскок. Хотелось бы знать это, прежде чем добавить эту точную операцию к Japt несколько дней назад: P
ETHproductions
5

Python 2, 25 23 байта

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

Используемая формула миль.

Спасибо Джонатану Аллану за -2 байта.

Эрик Outgolfer
источник
Вам не нужно ~-x. Вы также можете использовать x-1(не короче), поскольку вычитание имеет более высокий приоритет, чем сдвиг.
mbomb007
@ mbomb007 Я знаю, но использовал код, который дал мне Джонатан Аллан ~-x, поэтому я решил оставить его без изменений. Ну, кажется, все предпочитают x-1, хотя (Деннис также говорил именно это).
Эрик Outgolfer
ИМХО, это более читабельно и больше похоже на математическую формулу.
mbomb007
@ mbomb007 О, ты имеешь в виду совсем недавно добавленную награду? Если так, я изменил это. Но я мог бы привести некоторые аргументы тогда ... Я мог бы также сделать -~(x*x-1<<~-x)для записи, но -1все еще существует, поэтому я не люблю смешивать код ...
Эрик Outgolfer
Я ничего не имею в виду за щедрость. Математическая формула, используемая в этом ответе . Мы пишем «минус 1» как - 1.
mbomb007
4

Lua, 105 байт

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)

Де-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)

Занимательная проблема!

Таннер Грехавик
источник
3
Добро пожаловать в программирование головоломок и Code Golf!
Эрик Outgolfer
s = tonumber (arg [1]) можно заменить на s = ..., чтобы сэкономить несколько байтов. ... хранит таблицу arg без упаковки, в этом случае возвращает arg [1]. И строки lua будут действовать так, как будто числа содержат только действительный числовой конструктор, который мы можем предположить, что в этом случае входные данные есть.
ATaco
4

На самом деле , 8 байт

;²D@D╙*u

Попробуйте онлайн!

Объяснение:

Это просто вычисляет формулу (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
источник
4

GolfScript , 11 байт

~.2?(2@(?*)

Попробуйте онлайн!

Спасибо Мартину Эндеру (8478) за удаление 4 байтов.

Объяснение:

            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                []
Эрик Outgolfer
источник
4

CJam, 11 байт

ri_2#(\(m<)

Попробуйте онлайн.

Объяснение:

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.
Эрик Outgolfer
источник
Только если мне не нужно ri...
Эрик Аутгольфер
3

Mathematica, 15 байт

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

Оператора смещения по битам нет, поэтому нам нужно выполнить фактическое возведение в степень, но тогда короче делить на 2 вместо уменьшения показателя степени.

Мартин Эндер
источник
3

C, 26 байтов

Как макрос:

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

Как функция (27):

f(x){return-~(x*x-1<<~-x);}
Эрик Outgolfer
источник
Макро версия даст неверные результаты, если параметр является выражением. Посмотрим f(1+2).
Касперд
1
@kasperd Параметр не будет выражением. Напишите полную программу или функцию, которая принимает положительное целое число n в качестве входных данных и печатает или возвращает требования к питанию в зависимости от активности кенгуру на стадии n .
Эрик Outgolfer
Ваша цитата говорит о полной программе или функции . Но макрос не является ни тем, ни другим.
Касперд
@kasperd В принципе, я думаю, что это как функция, но без оценки. Кроме того, ниже я предоставил «настоящую» функцию, если вы этого хотите.
Эрик Outgolfer
2

C #, 18 байт

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

Анонимная функция, основанная на превосходном математическом анализе Qwerp-Derp .

Полная программа с тестовыми примерами:

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
источник
2

Пакетный, 30 байтов

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

Ну, это все равно лучше, чем Java.

Нил
источник
2

MATL , 7 байт

UqGqW*Q

Использует формулу из других ответов.

Попробуйте онлайн!

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

Оазис , 9 байт

2n<mn²<*>

Я удивлен, что нет встроенного для 2^n.

Попробуйте онлайн!

Объяснение:

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
источник
mЭкспонирование на нидерландском языке, а также отсутствие творчества. Кроме того, многие операторы еще не были реализованы из-за лени и проволочек.
Аднан
1

Ракетка 33 байта

Используя формулу, объясненную @ Qwerp-Derp

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

Ungolfed:

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

Тестирование:

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

Выход:

'(1 7 33 121 385 1121 3073 8065 20481 50689)
rnso
источник
1

Рубин, 21 байт

@ Qwerp-Derp в основном делал тяжелую работу.

Из-за приоритета в ruby, кажется, нам нужны некоторые парены:

->(n){(n*n-1<<n-1)+1}
Дэвид Люнг Мэдисон Стеллар
источник
1

Scala, 23 байта

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

Использует битовый сдвиг в качестве возведения в степень

corvus_192
источник
1

Pyth, 8 байт

h.<t*QQt

pyth.herokuapp.com

Объяснение:

     Q   Input
      Q  Input
    *    Multiply
   t     Decrement
       t Decrement the input
 .<      Left bitshift
h        Increment
Эрик Outgolfer
источник
1

R, 26 байт

Бесстыдно применяя формулу

n=scan();2^(n-1)*(n^2-1)+1
Billywob
источник
1

J 11 байт

1-<:2&*1-*:

На основании той же формулы, найденной ранее .

Попробуйте онлайн!

объяснение

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 байта)

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

Не сохраняет n , но использует ту же формулу, что и все остальные в этом конкурсе. Сохранено 1 байт с уменьшением из-за необходимости круглых скобок.

Тест

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

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

Урна волшебного осьминога
источник
0

JS-Forth, 32 байта

Не супер короткий, но он короче, чем Java. Эта функция помещает результат в стек. Это требует JS-Forth, потому что я использую <<.

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

Попробуйте онлайн

mbomb007
источник