Calculer la séquence kangourou

25

Backstory

Avis de non-responsabilité: peut contenir des informations sur les kangourous.

Les kangourous traversent plusieurs stades de développement. À mesure qu'ils vieillissent et deviennent plus forts, ils peuvent sauter plus haut et plus longtemps, et ils peuvent sauter plus de fois avant d'avoir faim.

Dans l'étape 1 , le kangourou est très petit et ne peut pas sauter du tout. Malgré cela, il a constamment besoin de nourriture. Nous pouvons représenter un modèle d'activité de kangourou de stade 1 comme celui-ci.

o

Au stade 2 , le kangourou peut faire de petits sauts, mais pas plus de 2 avant d'avoir faim. Nous pouvons représenter un modèle d'activité de kangourou de stade 2 comme celui-ci.

 o o
o o o

Après l'étape 2, le kangourou s'améliore rapidement. À chaque étape suivante, le kangourou peut sauter un peu plus haut (1 unité dans la représentation graphique) et deux fois plus de fois. Par exemple, le schéma d'activité d' un kangourou de stade 3 ressemble à ceci.

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

Tout ce saut nécessite de l'énergie, donc le kangourou a besoin de nourriture après avoir terminé chaque modèle d'activité. Le montant exact requis peut être calculé comme suit.

  1. Attribuez à chaque o dans le modèle d'activité d'un stade n kangourou sa hauteur, c'est-à-dire un nombre de 1 à n , où 1 correspond au sol et n à la position la plus élevée.

  2. Calculez la somme de toutes les hauteurs dans le modèle d'activité.

Par exemple, le modèle d'activité d' un kangourou de stade 3 comprend les hauteurs suivantes.

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

Nous avons cinq 1 , huit 2 et quatre 3 ; la somme est 5 · 1 + 8 · 2 + 4 · 3 = 33 .

Tâche

Écrivez un programme complet ou une fonction qui prend un entier positif n comme entrée et imprime ou renvoie les besoins nutritionnels par activité d'un kangourou de stade n .

C'est ; que la réponse la plus courte en octets gagne!

Exemples

 1 ->     1
 2 ->     7
 3 ->    33
 4 ->   121
 5 ->   385
 6 ->  1121
 7 ->  3073
 8 ->  8065
 9 -> 20481
10 -> 50689
Dennis
la source
15
J'ai voté contre parce que je n'aime pas les défis où une configuration complexe se résume à une formule simple pour le golf.
xnor
3
Bien que toutes les réponses aient jusqu'à présent utilisé la formule, je suis convaincu qu'il existe d'autres moyens d'attaquer le problème.
Dennis
2
Existe-t-il un défi pour générer la sortie art ascii de cette séquence?
miles
@miles Pas sûr. Un peu difficile à rechercher.
Dennis
Wolfram Alpha n'a pas pu trouver de version plus courte, http://www.wolframalpha.com/input/?i=2%5E(n-1)*(n%5E2-1)%2B1(balisage bizarre car une URL régulière est foirée)
Konijn

Réponses:

8

Gelée , 6 octets

²’æ«’‘

Utilise la formule ( n 2 - 1) 2 n - 1 + 1 pour calculer chaque valeur. @ Qwerp-Derp a eu la gentillesse de fournir une preuve .

Essayez-le en ligne! ou Vérifiez tous les cas de test.

Explication

²’æ«’‘  Input: n
²       Square n
 ’      Decrement
  æ«    Bit shift left by
    ’     Decrement of n
     ‘  Increment
miles
la source
L'avez-vous fait à la main ou l'avez-vous généré automatiquement?
Erik the Outgolfer
Trouvé en utilisant J et en recherchant OEIS, puis simplifié à la main
miles
Je considère que ma propre réponse n'est pas concurrente, j'ai donc accepté celle-ci.
Dennis
17

Coffeescript, 19 octets

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

Edit: Merci à Dennis d'avoir coupé 6 octets!

La formule pour générer des nombres Kangourou est la suivante:

entrez la description de l'image ici

Explication de la formule:

Le nombre de 1s dans K(n)la somme finale est de 2^(n - 1) + 1.

Le nombre de ns dans K(n)la somme finale est 2^(n - 1), donc la somme de tous les ns est n * 2^(n - 1).

Le nombre de tout autre nombre ( d) dans K(n)la somme finale de est 2^n, donc la somme de tous les dserait d * 2^n.

  • Ainsi, la somme de tous les autres nombres = (T(n) - (n + 1)) * 2^n, où T(n)est la fonction numérique triangulaire (qui a la formule T(n) = (n^2 + 1) / 2).

    En remplaçant cela en, nous obtenons la somme finale

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

Lorsque nous additionnons toutes les sommes, nous obtenons K(n), ce qui équivaut à

  (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

... qui est égal à la formule ci-dessus.

clismique
la source
1
Pourquoi PPCG n'a-t-il pas mathjax?
Jonathan Allan
5
@Jonathan Nous l'avons fait, mais cela a causé de nombreux problèmes avec les signes dollar dans les blocs de code.
Dennis
1
@JonathanAllan Il y avait des problèmes mais c'était sympa pendant un moment 1 2 3
miles
Vanilla JS est plus court de deux octets:n=>(n*n-1<<n-1)+1
ETHproductions
Attendez, MathJax ne fonctionne pas ici? Ou pourquoi l'équation est-elle une image?
RudolfJelin
7

Java 7, 35 octets

int c(int n){return(n*n-1<<n-1)+1;}
Numberknot
la source
6

Gelée , 4 octets

ŒḄ¡S

Essayez-le en ligne! ou vérifiez tous les cas de test .

Comment ça marche

ŒḄ¡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
la source
Oh, c'est ce que fait le rebond. J'aurais aimé le savoir avant d'ajouter cette opération exacte à Japt il y a quelques jours: P
ETHproductions
5

Python 2, 25 23 octets

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

Formule de miles utilisée.

Merci à Jonathan Allan pour -2 octets.

Erik le Outgolfer
la source
Tu n'as pas besoin ~-x. Vous pouvez également l'utiliser x-1(pas plus court), car la soustraction a une priorité plus élevée que le décalage.
mbomb007
@ mbomb007 Je sais, mais le code que Jonathan Allan m'a donné utilisé ~-x, j'ai donc décidé de le laisser inchangé. Eh bien, il semble que tout le monde préfère x-1(Dennis a également dit exactement cette chose).
Erik the Outgolfer
À mon humble avis, il est plus lisible, et il ressemble plus à la formule mathématique utilisée.
mbomb007 du
@ mbomb007 Oh, vous voulez dire la prime récemment ajoutée? Si oui, je l'ai changé. Mais, je pourrais soulever quelques arguments alors ... J'aurais pu faire aussi -~(x*x-1<<~-x)pour le disque, mais -1existe toujours, donc je n'aime pas mélanger le code ...
Erik the Outgolfer
Je ne veux rien dire sur la prime. La formule mathématique utilisée dans cette réponse . Nous écrivons "moins 1" comme - 1.
mbomb007
4

Lua, 105 octets

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-golfé:

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)

Problème divertissant!

Tanner Grehawick
la source
3
Bienvenue dans Programmation d'énigmes et Code Golf!
Erik l'Outgolfer
s = tonumber (arg [1]) peut être remplacé par s = ... pour économiser certains octets. ... stocke la table arg décompressée, dans ce cas, renvoie arg [1]. Et les chaînes de lua agiront comme des nombres, car elles ne contiennent qu'un constructeur de nombres valide, dont nous pouvons supposer que l'entrée est dans ce cas.
ATaco
4

En fait , 8 octets

;²D@D╙*u

Essayez-le en ligne!

Explication:

Cela calcule simplement la formule (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
la source
4

GolfScript , 11 octets

~.2?(2@(?*)

Essayez-le en ligne!

Merci à Martin Ender (8478) d'avoir supprimé 4 octets.

Explication:

            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 le Outgolfer
la source
4

CJam, 11 octets

ri_2#(\(m<)

Essayez-le en ligne.

Explication:

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 le Outgolfer
la source
Seulement si je n'avais pas besoin ri...
Erik the Outgolfer
3

Mathematica, 15 octets

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

Il n'y a pas d'opérateur de décalage de bits, nous devons donc faire l'exponentiation réelle, mais il est ensuite plus court de diviser par 2 au lieu de décrémenter l'exposant.

Martin Ender
la source
3

C, 26 octets

En macro:

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

En fonction (27):

f(x){return-~(x*x-1<<~-x);}
Erik le Outgolfer
la source
La version de macro produira des résultats incorrects si le paramètre est une expression. Considérez f(1+2).
kasperd du
1
@kasperd Le paramètre ne sera pas une expression. Écrivez un programme complet ou une fonction qui prend un entier positif n comme entrée et imprime ou retourne les besoins nutritionnels par activité d'un kangourou de stade n .
Erik the Outgolfer
Votre devis indique un programme complet ou une fonction . Mais une macro n'est ni l' un ni l'autre.
kasperd
@kasperd Fondamentalement, je pense que c'est comme une fonction, mais sans évaluation. De plus, j'ai fourni une "vraie" fonction ci-dessous, si c'est ce que vous voulez.
Erik the Outgolfer
2

C #, 18 octets

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

Fonction anonyme basée sur l' excellente analyse mathématique de Qwerp-Derp .

Programme complet avec cas de test:

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
la source
2

Lot, 30 octets

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

Eh bien, il bat de toute façon Java.

Neil
la source
2

MATL , 7 octets

UqGqW*Q

Utilise la formule des autres réponses.

Essayez-le en ligne!

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
la source
2

Oasis , 9 octets

2n<mn²<*>

Je suis surpris qu'il n'y ait pas de fonction intégrée pour 2^n .

Essayez-le en ligne!

Explication:

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
la source
Exponentiation en néerlandais est machtsverheffing, cela et le manque de créativité. De plus, de nombreux opérateurs n'ont pas encore été implémentés, en raison de la paresse et de la procrastination.
Adnan
1

Raquette 33 octets

Utilisation de la formule expliquée par @ Qwerp-Derp

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

Non golfé:

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

Essai:

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

Sortie:

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

Rubis, 21 octets

@ Qwerp-Derp a essentiellement fait le gros du travail.

En raison de la priorité en rubis, il semble que nous ayons besoin de quelques parens:

->(n){(n*n-1<<n-1)+1}
David Ljung Madison Stellar
la source
1

Scala, 23 octets

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

Utilise le décalage de bits comme exponentiation

corvus_192
la source
1

Pyth, 8 octets

h.<t*QQt

pyth.herokuapp.com

Explication:

     Q   Input
      Q  Input
    *    Multiply
   t     Decrement
       t Decrement the input
 .<      Left bitshift
h        Increment
Erik le Outgolfer
la source
1

R, 26 octets

Appliquer sans vergogne la formule

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

J , 11 octets

1-<:2&*1-*:

Basé sur la même formule que celle trouvée précédemment .

Essayez-le en ligne!

Explication

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
miles
la source
0

Groovy (22 octets)

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

Ne conserve pas n, mais utilise la même formule que toutes les autres dans cette compétition. 1 octet enregistré avec des décréments, en raison de parenthèses nécessaires.

Tester

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

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

Urne de poulpe magique
la source
0

JS-Forth, 32 octets

Pas super court, mais c'est plus court que Java. Cette fonction pousse le résultat sur la pile. Cela nécessite JS-Forth car j'utilise <<.

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

Essayez-le en ligne

mbomb007
la source