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

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

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.


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


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.

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.


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!


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)

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

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.

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.


3

C, 26 octets

En macro:

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

En fonction (27):

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

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

2

Lot, 30 octets

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

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


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 

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

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)

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}

1

Scala, 23 octets

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

Utilise le décalage de bits comme exponentiation



1

R, 26 octets

Appliquer sans vergogne la formule

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

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

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]


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.