Berechnen Sie die Känguru-Sequenz


25

Hintergrundgeschichte

Haftungsausschluss: Kann erfundene Informationen über Kängurus enthalten.

Kängurus durchlaufen mehrere Entwicklungsstufen. Je älter und stärker sie werden, desto höher und länger können sie springen, und desto öfter können sie springen, bevor sie hungrig werden.

In Stufe 1 ist das Känguru sehr klein und kann überhaupt nicht springen. Trotzdem bedarf es ständig der Ernährung. Wir können das Aktivitätsmuster eines Kängurus der Stufe 1 so darstellen.

o

In Stufe 2 kann das Känguru kleine Sprünge machen, aber nicht mehr als 2, bevor es hungrig wird. Wir können das Aktivitätsmuster eines Kängurus der Stufe 2 so darstellen.

 o o
o o o

Nach Stufe 2 bessert sich das Känguru schnell. In jeder weiteren Phase kann das Känguru etwas höher (1 Einheit in der grafischen Darstellung) und doppelt so oft springen. Das Aktivitätsmuster eines Kängurus der Stufe 3 sieht beispielsweise so aus.

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

All das Springen erfordert Energie, so dass das Känguru nach Abschluss jedes Aktivitätsmusters Nahrung benötigt. Der genaue Betrag kann wie folgt berechnet werden.

  1. Ordnen Sie jedem o im Aktivitätsmuster eines Stage n- Kängurus seine Höhe zu, dh eine Zahl von 1 bis n , wobei 1 dem Boden und n der höchsten Position entspricht.

  2. Berechnen Sie die Summe aller Höhen im Aktivitätsmuster.

Zum Beispiel umfasst das Aktivitätsmuster eines Kängurus der Stufe 3 die folgenden Höhen.

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

Wir haben fünf 1 's, acht 2 ' s und vier 3 ‚s; die Summe ist 5 · 1 + 8 · 2 + 4 · 3 = 33 .

Aufgabe

Schreiben Sie ein vollständiges Programm oder eine Funktion, die eine positive ganze Zahl n als Eingabe verwendet und den Nährstoffbedarf pro Aktivität eines Stufe- n- Kängurus ausgibt oder zurückgibt .

Das ist ; möge die kürzeste Antwort in Bytes gewinnen!

Beispiele

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

15
Ich habe abgelehnt, weil ich keine Herausforderungen mag, bei denen ein kompliziertes Setup auf eine einfache Formel für das Golfen hinausläuft.
Xnor

3
Obwohl alle Antworten bisher die Formel verwendet haben, bin ich überzeugt, dass es andere Möglichkeiten gibt, das Problem zu bekämpfen.
Dennis

2
Gibt es eine Herausforderung, die ASCII-Kunst-Ausgabe dieser Sequenz zu generieren?
Meilen

@ Meilen nicht sicher. Etwas schwer zu suchen.
Dennis

Wolfram Alpha konnte nicht eine kürzere Version, finden http://www.wolframalpha.com/input/?i=2%5E(n-1)*(n%5E2-1)%2B1(Weird Markup , weil eine normale URL vermasselt wird)
Konijn

Antworten:


8

Gelee , 6 Bytes

²’æ«’‘

Verwendet die Formel ( n 2 - 1) 2 n - 1 + 1, um jeden Wert zu berechnen. @ Qwerp-Derp's war so freundlich, einen Beweis zu erbringen .

Probieren Sie es online! oder Überprüfen Sie alle Testfälle.

Erläuterung

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

Haben Sie es von Hand gemacht oder automatisch generiert?
Erik der Outgolfer

Fand es mit J und suchte OEIS, dann vereinfachte es von Hand
Meilen

Ich betrachte meine eigene Antwort als nicht konkurrierend, daher habe ich diese akzeptiert.
Dennis

17

Kaffeeskript, 19 Bytes

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

Edit: Danke an Dennis für das Abhacken von 6 Bytes!

Die Formel zum Generieren von Känguru-Zahlen lautet:

Bildbeschreibung hier eingeben

Erklärung der Formel:

Die Anzahl von 1's in K(n)' s Endsumme ist 2^(n - 1) + 1.

Die Anzahl der n's in K(n)der Endsumme ist 2^(n - 1), also ist die Summe aller n' s n * 2^(n - 1).

Die Zahl jeder anderen Zahl ( d) in K(n)der Endsumme ist 2^n, also die Summe aller dwürde sein d * 2^n.

  • Somit ist die Summe aller anderen Zahlen = (T(n) - (n + 1)) * 2^n, wobei T(n)das Dreieck die Zahlenfunktion ist (welche die Formel hat T(n) = (n^2 + 1) / 2).

    Ersetzen wir dies, erhalten wir die endgültige Summe

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

Wenn wir alle Summen addieren, erhalten wir K(n), was gleich ist

  (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

... was der obigen Formel entspricht.


1
Warum hat PPCG kein Mathjax?
Jonathan Allan

5
@Jonathan Das haben wir gemacht, aber es hat zu vielen Problemen mit Dollarzeichen in Codeblöcken geführt.
Dennis

1
@ JonathanAllan Es gab Probleme, aber es war eine Weile schön 1 2 3
Meilen

Vanilla JS ist zwei Bytes kürzer:n=>(n*n-1<<n-1)+1
ETHproductions 16.10.16

Warten Sie, MathJax funktioniert hier nicht? Oder warum ist die Gleichung ein Bild?
RudolfJelin


6

Gelee , 4 Bytes

ŒḄ¡S

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

ŒḄ¡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, so dass das , was Bounce tut. Ich wünschte, ich hätte das gewusst, bevor ich Japt vor ein paar Tagen genau diese Operation hinzugefügt hätte: P
ETHproductions

5

Python 2, 25 23 Bytes

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

Verwendete Meilenformel.

Vielen Dank an Jonathan Allan für -2 Bytes.


Das brauchst du nicht ~-x. Sie können auch verwenden x-1(nicht kürzer), da die Subtraktion eine höhere Priorität hat als die Verschiebung.
mbomb007

@ mbomb007 Ich weiß, aber der Code, den Jonathan Allan mir gegeben hat, wurde verwendet. Deshalb habe ~-xich beschlossen, ihn unverändert zu lassen. Nun, es scheint, als würde jeder das vorziehen x-1(Dennis sagte auch genau das).
Erik der Outgolfer

IMHO, es ist besser lesbar und es sieht eher aus wie die verwendete mathematische Formel.
mbomb007

@ mbomb007 Oh, du meinst die kürzlich hinzugefügte Prämie? Wenn ja, habe ich es geändert. Aber ich könnte dann ein paar Argumente -~(x*x-1<<~-x)-1
vorbringen

Ich meine nichts mit dem Kopfgeld. Die in dieser Antwort verwendete mathematische Formel . Wir schreiben "minus 1" als - 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)

Entgolft:

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)

Unterhaltsames Problem!


3
Willkommen bei Programming Puzzles und Code Golf!
Erik der Outgolfer

s = tonumber (arg [1]) kann gegen s = ... ausgetauscht werden, um einige Bytes zu sparen. ... speichert die entpackte arg-Tabelle und gibt in diesem Fall arg [1] zurück. Und die Zeichenfolgen von lua verhalten sich wie Zahlen. Sie enthalten nur einen gültigen Zahlenkonstruktor. Wir können davon ausgehen, dass die Eingabe in diesem Fall erfolgt.
ATaco

4

Eigentlich 8 Bytes

;²D@D╙*u

Probieren Sie es online!

Erläuterung:

Dies berechnet einfach die Formel (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@(?*)

Probieren Sie es online!

Vielen Dank an Martin Ender (8478) für das Entfernen von 4 Bytes.

Erläuterung:

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

Probieren Sie es online.

Erläuterung:

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.

Nur wenn ich nicht brauchte ri...
Erik the Outgolfer

3

Mathematica, 15 Bytes

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

Da es keinen Bitverschiebungsoperator gibt, müssen wir die tatsächliche Exponentiation durchführen, aber dann ist es kürzer, durch 2 zu teilen, anstatt den Exponenten zu dekrementieren.


3

C 26 Bytes

Als Makro:

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

Als eine Funktion (27):

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

Die Makroversion führt zu falschen Ergebnissen, wenn der Parameter ein Ausdruck ist. Überlegen Sie f(1+2).
Kasperd

1
@kasperd Der Parameter ist kein Ausdruck. Schreiben Sie ein vollständiges Programm oder eine Funktion, die eine positive ganze Zahl n als Eingabe verwendet und den Nährstoffbedarf pro Aktivität eines Stufe- n- Kängurus ausgibt oder zurückgibt .
Erik der Outgolfer

Ihr Zitat sagt ein volles Programm oder eine Funktion . Aber ein Makro ist keines.
Kasperd

@kasperd Grundsätzlich denke ich, dass es wie eine Funktion ist, aber ohne Bewertung. Außerdem habe ich unten eine "echte" Funktion bereitgestellt, falls Sie dies wünschen.
Erik der Outgolfer


2

C #, 18 Bytes

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

Anonyme Funktion basierend auf der hervorragenden mathematischen Analyse von Qwerp-Derp .

Volles Programm mit Testfällen:

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

Batch, 30 Bytes

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

Nun, es schlägt Java sowieso.


2

MATL , 7 Bytes

UqGqW*Q

Verwendet die Formel aus anderen Antworten.

Probieren Sie es 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

Oase , 9 Bytes

2n<mn²<*>

Ich bin überrascht, dass es kein eingebautes für gibt 2^n.

Probieren Sie es online!

Erläuterung:

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 auf Niederländisch ist machtsverheffing, das und der Mangel an Kreativität. Außerdem wurden viele Operatoren aufgrund von Faulheit und Verzögerung noch nicht implementiert.
Adnan

1

Schläger 33 Bytes

Mit der von @ Qwerp-Derp erläuterten Formel

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

Ungolfed:

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

Testen:

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

Ausgabe:

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

1

Ruby, 21 Bytes

@ Qwerp-Derp hat im Grunde das schwere Heben gemacht.

Aufgrund des Vorrangs von Ruby brauchen wir anscheinend einige Parens:

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

1

Scala, 23 Bytes

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

Verwendet Bitverschiebung als Potenzierung



1

R, 26 Bytes

Schamlos die Formel anwenden

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

1

J , 11 Bytes

1-<:2&*1-*:

Basierend auf der gleichen Formel wie zuvor .

Probieren Sie es online!

Erläuterung

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}​

Bewahrt nicht n, sondern verwendet die gleiche Formel wie alle anderen in diesem Wettbewerb. 1 Byte mit Dekrementen aufgrund erforderlicher Klammern gespeichert.

Prüfung

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

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


0

JS-Forth, 32 Bytes

Nicht sehr kurz, aber kürzer als Java. Diese Funktion schiebt das Ergebnis auf den Stapel. Dies erfordert JS-Forth, weil ich benutze <<.

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

Probieren Sie es online aus

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.