Обчисліть послідовність кенгуру


25

Попередня історія

Відмова від відповідальності: Може містити складену інформацію про кенгуру.

Кенгуру проходять кілька стадій розвитку. Коли вони дорослішають і сильніші, вони можуть стрибати вище і довше, і вони можуть більше стрибати, перш ніж голодувати.

У першій стадії кенгуру дуже мало і зовсім не може стрибати. Незважаючи на це, постійно потребує харчування. Ми можемо представити зразок діяльності кенгуру на етапі 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 .

Завдання

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

Це ; може виграти найкоротша відповідь у байтах!

Приклади

 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 цієї послідовності?
милі

@miles Не впевнений. Ніби важко шукати.
Денніс

Більш коротка версія 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 був добрим, щоб надати доказ .

Спробуйте в Інтернеті! або Перевірте всі тестові випадки.

Пояснення

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

Ви робили це вручну чи автоматично генерували?
Ерік Аутгольфер

Знайшов його за допомогою J та пошуку OEIS, а потім спростив його вручну
миль

Я вважаю власну відповідь неконкурентоспроможною, тому прийняв цю.
Денніс

17

Coffeescript, 19 байт

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

Редагувати: Дякуємо Деннісу за рубання 6 байт!

Формула для генерації чисел кенгуру така:

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

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

Кількість 1«и в K(n)» и кінцевої суми 2^(n - 1) + 1.

Кількість остаточної суми n's в K(n)' є 2^(n - 1), тому сума всіх n's є n * 2^(n - 1).

Кількість будь-якого іншого числа ( d) в K(n)кінцевій сумі 'є 2^n, значить, сума всіх d' s була б 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

... що дорівнює наведеній вище формулі.


1
Чому PPCG не має математики?
Джонатан Аллан

5
@Jonathan Ми це зробили, але це спричинило багато проблем зі знаками долара в кодових блоках.
Денніс

1
@JonathanAllan Були проблеми, але це було приємно на деякий час 1 2 3
милі

Vanilla JS на два байти коротше:n=>(n*n-1<<n-1)+1
ETHproductions

Зачекайте, MathJax тут не працює? Або чому рівняння є зображенням?
Рудольф Джелін


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


Вам не потрібно ~-x. Ви можете використовувати x-1також (не будь-яке коротше), оскільки віднімання має більший пріоритет, ніж зсув.
mbomb007

@ mbomb007 Я знаю, але код Джонатан Аллан дав мені використаний ~-x, тому я вирішив залишити його без змін. Що ж, схоже, всі воліють x-1(хоча Денніс також сказав це саме).
Ерік Аутгольфер

ІМХО, це читабельніше, і більше схоже на використану математичну формулу.
mbomb007

@ mbomb007 О, ти маєш на увазі зовсім недавно додану суму? Якщо так, я змінив це. Але я можу навести кілька аргументів тоді ... Я міг би також зробити це -~(x*x-1<<~-x)для запису, але -1все ще існує, тому я не люблю змішувати код ...
Ерік Атголфер

Я нічого не маю на увазі про щедроту. Математична формула, використана у цій відповіді . Пишемо «мінус 1» як - 1.
mbomb007

4

Луа, 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)

Де-гольф:

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
Ласкаво просимо до головоломки програмування та коду для гольфу!
Ерік Аутгольфер

s = tonumber (arg [1]) можна замінити на s = ..., щоб зберегти кілька байт. ... зберігає розпаковану таблицю аргументів, в цьому випадку повертає arg [1]. І рядки Луї будуть діяти як числа, вони містять лише дійсний конструктор чисел, який, як ми можемо припустити, в цьому випадку є.
Атако

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)

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


3

Математика, 15 байт

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

Немає оператора розрядного переміщення, тому нам потрібно зробити фактичну експоненцію, але тоді коротше ділити на 2, а не декрементувати показник.


3

C, 26 байт

Як макрос:

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

Як функція (27):

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

Версія макросу дасть неправильні результати, якщо параметр є виразом. Розглянемо f(1+2).
kasperd

1
@kasperd Параметр не буде виразом. Написати повну програму або функцію , яка приймає позитивне ціле число п в якості вхідних даних і друкує або повернень потреби в поживних речовинах за активністю стадії п кенгуру.
Ерік Аутгольфер

Ваша цитата каже повну програму або функцію . Але макрос - це не те.
kasperd

@kasperd В основному, я думаю, це як функція, але без оцінки. Також я надав "справжню" функцію нижче, якщо це те, що ви хочете.
Ерік Аутгольфер


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

2

Пакет, 30 байт

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

Ну, це все одно перемагає Яву.



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

Експонентація в голландській mмові - це суперечливість, та відсутність творчості. Також багато операторів ще не було впроваджено через лінь і зволікання.
Аднан

1

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

Використовуючи формулу, пояснену @ Qwerp-Derp

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

Безголівки:

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


1

Скала, 23 байти

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

Використовує бітовий зсув як експоненцію





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+ ;

Спробуйте в Інтернеті

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.