Calcular a sequência do canguru


25

História de fundo

Isenção de responsabilidade: Pode conter informações inventadas sobre cangurus.

Os cangurus atravessam vários estágios de desenvolvimento. À medida que envelhecem e são mais fortes, eles podem pular mais e mais e pular mais vezes antes de ficarem com fome.

No estágio 1 , o canguru é muito pequeno e não pode pular. Apesar disso, é constantemente requer nutrição. Podemos representar um padrão de atividade de canguru no estágio 1 como este.

o

No estágio 2 , o canguru pode fazer pequenos saltos, mas não mais do que 2 antes de ficar com fome. Podemos representar um padrão de atividade de um canguru no estágio 2 como este.

 o o
o o o

Após o estágio 2, o canguru melhora rapidamente. Em cada estágio subsequente, o canguru pode pular um pouco mais alto (1 unidade na representação gráfica) e duas vezes mais. Por exemplo, o padrão de atividade de um canguru do estágio 3 se parece com isso.

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

Todo esse salto requer energia; portanto, o canguru requer nutrição depois de concluir cada padrão de atividade. A quantidade exata necessária pode ser calculada da seguinte forma.

  1. Atribua cada o no padrão de atividade de um estágio n canguru, sua altura, ou seja, um número de 1 a n , em que 1 corresponde ao solo en na posição mais alta.

  2. Calcule a soma de todas as alturas no padrão de atividade.

Por exemplo, o padrão de atividade de um canguru no estágio 3 inclui as seguintes alturas.

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

Nós temos cinco 1 's, oito 2 ' s, e quatro 3 's; a soma é 5 · 1 + 8 · 2 + 4 · 3 = 33 .

Tarefa

Escreva um programa completo ou uma função que use um número inteiro positivo n como entrada e imprima ou retorne os requisitos nutricionais por atividade de um estágio n canguru.

Isso é ; que a resposta mais curta em bytes ganhe!

Exemplos

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

15
Fiz uma votação baixa porque não gosto de desafios em que uma configuração complicada se resume a uma fórmula direta para o golfe.
Xnor

3
Embora todas as respostas até agora tenham usado a fórmula, estou convencido de que existem outras maneiras de atacar o problema.
Dennis

2
Existe um desafio para gerar a saída ascii art dessa sequência?
miles

@miles Não tenho certeza. Meio difícil de procurar.
Dennis

O Wolfram Alpha não conseguiu encontrar uma versão mais curta, http://www.wolframalpha.com/input/?i=2%5E(n-1)*(n%5E2-1)%2B1(Marcação estranha, porque uma URL comum fica bagunçada) #
311

Respostas:


8

Gelatina , 6 bytes

²’æ«’‘

Usa a fórmula ( n 2 - 1) 2 n - 1 + 1 para calcular cada valor. A Qwerp-Derp's teve a gentileza de fornecer uma prova .

Experimente online! ou Verifique todos os casos de teste.

Explicação

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

Você fez isso manualmente ou o gerou automaticamente?
Erik the Outgolfer

Encontrado lo usando J e procurando OEIS, então simplificado-lo à mão
milhas

Considero minha própria resposta não competitiva, por isso aceitei esta.
Dennis

17

Coffeescript, 19 bytes

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

Edit: Obrigado a Dennis por cortar 6 bytes!

A fórmula para gerar números de canguru é esta:

insira a descrição da imagem aqui

Explicação da fórmula:

O número de 1's in K(n)' na soma final é 2^(n - 1) + 1.

O número de n's in K(n)' na soma final é 2^(n - 1), então a soma de todos os n's é n * 2^(n - 1).

O número de qualquer outro número ( d) na K(n)soma final de é 2^n, então a soma de todos os dseria d * 2^n.

  • Assim, a soma de todos os outros números = (T(n) - (n + 1)) * 2^n, onde T(n)está a função do número do triângulo (que tem a fórmula T(n) = (n^2 + 1) / 2).

    Substituindo isso, obtemos a soma final

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

Quando somamos todas as somas, obtemos o K(n)que é igual a

  (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

... que é igual à fórmula acima.


1
Por que o PPCG não possui mathjax?
Jonathan Allan

5
@ Jonathan Fizemos, mas isso causou muitos problemas com cifrões em blocos de código.
Dennis

1
@JonathanAllan Houve problemas, mas foi bom por um tempo 1 2 3
miles

Vanilla JS é dois bytes mais curto:n=>(n*n-1<<n-1)+1
ETHproductions

Espere, MathJax não funciona aqui? Ou por que a equação é uma imagem?
RudolfJelin


6

Gelatina , 4 bytes

ŒḄ¡S

Experimente online! ou verifique todos os casos de teste .

Como funciona

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

Ah, então é isso que o salto faz. Eu gostaria de ter conhecido que antes de acrescentar que a operação exata para Japt há poucos dias: P
ETHproductions

5

Python 2, 25 23 bytes

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

Fórmula de milhas usadas.

Obrigado a Jonathan Allan por -2 bytes.


Você não precisa ~-x. Você também pode usar x-1(não menor), uma vez que a subtração tem uma precedência mais alta que a mudança.
mbomb007

@ mbomb007 Eu sei, mas o código que Jonathan Allan me deu foi usado ~-x, então decidi deixá-lo inalterado. Bem, parece que todo mundo prefere x-1, no entanto (Dennis também disse exatamente isso).
Erik the Outgolfer

IMHO, é mais legível e parece mais com a fórmula matemática usada.
Mbomb007 dez

@ mbomb007 Oh, você quer dizer a recompensa adicionada recentemente? Se sim, eu mudei. Mas, eu poderia levantar alguns argumentos então ... Eu também poderia ter feito -~(x*x-1<<~-x)para o registro, mas -1ainda existe, então eu não gosto de código mistura ...
Erik o Outgolfer

Não quero dizer nada sobre a recompensa. A fórmula matemática usada nesta resposta . Nós escrevemos "menos 1" como - 1.
mbomb007

4

Lua, 105 bytes

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

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)

Problema divertido!


3
Bem-vindo à Programação de Puzzles e Code Golf!
Erik the Outgolfer

s = tonumber (arg [1]) pode ser trocado por s = ... para economizar alguns bytes. ... armazena a tabela arg descompactada, neste caso, retorna arg [1]. E as seqüências de caracteres da lua agem como números, apenas contêm um construtor de números válido, o que podemos assumir que a entrada seja nesse caso.
ATaco

4

Na verdade , 8 bytes

;²D@D╙*u

Experimente online!

Explicação:

Isso simplesmente calcula a fórmula (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 bytes

~.2?(2@(?*)

Experimente online!

Obrigado Martin Ender (8478) por remover 4 bytes.

Explicação:

            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 bytes

ri_2#(\(m<)

Experimente online.

Explicação:

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.

Só se eu não precisasse ri...
Erik the Outgolfer

3

Mathematica, 15 bytes

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

Como não há operador de deslocamento de bits, precisamos fazer a exponenciação real, mas é mais curto dividir por 2 em vez de diminuir o expoente.


3

C, 26 bytes

Como uma macro:

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

Em função (27):

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

A versão macro produzirá resultados incorretos se o parâmetro for uma expressão. Considere f(1+2).
kasperd

1
@kasperd O parâmetro não será uma expressão. Escreva um programa completo ou uma função que use um número inteiro positivo n como entrada e imprima ou retorne os requisitos nutricionais por atividade de um estágio n canguru.
Erik the Outgolfer

Sua cotação indica um programa completo ou uma função . Mas uma macro também não é.
kasperd

@ Kasperd Basicamente, acho que é como uma função, mas sem avaliação. Além disso, forneci uma função "real" abaixo, se é isso que você deseja.
Erik the Outgolfer


2

C #, 18 bytes

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

Função anônima baseada em excelente análise matemática de Qwerp-Derp .

Programa completo com casos de teste:

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

Lote, 30 bytes

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

Bem, ele vence o Java de qualquer maneira.


2

MATL , 7 bytes

UqGqW*Q

Usa a fórmula de outras respostas.

Experimente 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

Oásis , 9 bytes

2n<mn²<*>

Estou surpreso que não há um built-in para 2^n .

Experimente online!

Explicação:

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

A exponenciação em holandês é muito mimportante, isso e falta de criatividade. Além disso, muitos operadores ainda não foram implementados devido à preguiça e procrastinação.
Adnan

1

Raquete 33 bytes

Usando a fórmula explicada por @ Qwerp-Derp

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

Ungolfed:

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

Teste:

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

Saída:

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

1

Ruby, 21 bytes

@ Qwerp-Derp basicamente fez o trabalho pesado.

Por causa da precedência em ruby, parece que precisamos de algumas parênteses:

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

1

Scala, 23 bytes

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

Usa deslocamento de bits como exponenciação



1

R, 26 bytes

Aplicação descarada da fórmula

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

1

J , 11 bytes

1-<:2&*1-*:

Com base na mesma fórmula encontrada anteriormente .

Experimente online!

Explicação

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

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

Não preserva n, mas usa a mesma fórmula que todas as outras nesta competição. Salvo 1 byte com decrementos, devido aos parênteses necessários.

Teste

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

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


0

JS-adiante, 32 bytes

Não é super curto, mas é mais curto que o Java. Esta função coloca o resultado na pilha. Isso requer JS-Forth porque eu uso <<.

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

Experimente online

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.