Calcola la sequenza del canguro


25

backstory

Disclaimer: può contenere informazioni inventate sui canguri.

I canguri attraversano diverse fasi di sviluppo. Man mano che invecchiano e diventano più forti, possono saltare sempre più in alto e possono saltare più volte prima di avere fame.

Nella fase 1 , il canguro è molto piccolo e non può saltare affatto. Nonostante ciò, è costantemente necessario nutrimento. Possiamo rappresentare un modello di attività del canguro di livello 1 come questo.

o

Nella fase 2 , il canguro può fare piccoli salti, ma non più di 2 prima di avere fame. Possiamo rappresentare un modello di attività del canguro di livello 2 come questo.

 o o
o o o

Dopo la fase 2 il canguro migliora rapidamente. In ogni fase successiva, il canguro può saltare un po 'più in alto (1 unità nella rappresentazione grafica) e due volte più volte. Ad esempio, il modello di attività di un canguro di livello 3 è simile al seguente.

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

Tutto quel salto richiede energia, quindi il canguro richiede nutrimento dopo aver completato ogni modello di attività. L'importo esatto richiesto può essere calcolato come segue.

  1. Assegna a ciascuna o nel modello di attività di uno stage n canguro la sua altezza, cioè un numero da 1 a n , dove 1 corrisponde al suolo e n alla posizione più alta.

  2. Calcola la somma di tutte le altezze nel modello di attività.

Ad esempio, il modello di attività di un canguro di livello 3 include le seguenti altezze.

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

Abbiamo cinque 1 , otto 2 e quattro 3 ; la somma è 5 · 1 + 8 · 2 + 4 · 3 = 33 .

Compito

Scrivi un programma completo o una funzione che accetta un numero intero positivo n come input e stampa o restituisce i requisiti nutrizionali per attività di uno stage n canguro.

Questo è ; che vinca la risposta più breve in byte!

Esempi

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

15
Ho votato verso il basso perché non mi piacciono le sfide in cui una configurazione complicata si riduce a una formula semplice per il golf.
xnor

3
Sebbene tutte le risposte finora abbiano utilizzato la formula, sono convinto che ci siano altri modi per attaccare il problema.
Dennis,

2
Esiste una sfida per generare l'output di arte ascii di questa sequenza?
miglia

@miles Non sono sicuro. Un po 'difficile da cercare.
Dennis,

Wolfram Alpha non è riuscito a trovare una versione più breve, http://www.wolframalpha.com/input/?i=2%5E(n-1)*(n%5E2-1)%2B1(strano markup perché un normale URL viene incasinato)
Konijn,

Risposte:


8

Gelatina , 6 byte

²’æ«’‘

Usa la formula ( n 2 - 1) 2 n - 1 + 1 per calcolare ciascun valore. @ Qwerp-Derp's è stato così gentile da fornire una prova .

Provalo online! oppure Verifica tutti i casi di test.

Spiegazione

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

L'hai fatto a mano o lo hai generato automaticamente?
Erik the Outgolfer,

L'ho trovato usando J e cercando OEIS, poi l'ho semplificato a mano
miglia

Considero la mia risposta non competitiva, quindi ho accettato questa.
Dennis,

17

Coffeescript, 19 byte

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

Modifica: grazie a Dennis per aver tagliato 6 byte!

La formula per generare numeri di canguro è questa:

enter image description here

Spiegazione della formula:

Il numero della somma finale di 1"s K(n)" è2^(n - 1) + 1 .

Il numero della somma finale di n's in K(n)è 2^(n - 1), quindi la somma di tutti nè n * 2^(n - 1).

Il numero di qualsiasi altro numero ( d) nella K(n)somma finale è 2^n, quindi la somma di tutti dsarebbe d * 2^n.

  • Quindi, la somma di tutti gli altri numeri = (T(n) - (n + 1)) * 2^n, dove si T(n)trova la funzione numero triangolo (che ha la formulaT(n) = (n^2 + 1) / 2 ).

    Sostituendo quello in, otteniamo la somma 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)
    

Quando sommiamo tutte le somme, otteniamo K(n), che è uguale

  (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

... che è uguale alla formula sopra.


1
Perché PPCG non ha mathjax?
Jonathan Allan,

5
@Jonathan L'abbiamo fatto, ma ha causato molti problemi con i simboli del dollaro nei blocchi di codice.
Dennis,

1
@JonathanAllan Ci sono stati problemi ma è stato bello per un po ' 1 2 3
miglia

Vanilla JS è più breve di due byte:n=>(n*n-1<<n-1)+1
ETHproductions

Aspetta, MathJax non funziona qui? O perché l'equazione è un'immagine?
RudolfJelin,


6

Gelatina , 4 byte

ŒḄ¡S

Provalo online! o verifica tutti i casi di test .

Come funziona

ŒḄ¡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, in modo che di quello di rimbalzo fa. Vorrei averlo saputo prima di aggiungere quell'esatta operazione a Japt qualche giorno fa: P
ETHproductions

5

Python 2, 25 23 byte

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

Formula delle miglia usate.

Grazie a Jonathan Allan per -2 byte.


Non hai bisogno ~-x. Puoi usare x-1anche (non più breve), poiché la sottrazione ha una precedenza più alta rispetto allo spostamento.
mbomb007,

@ mbomb007 Lo so, ma il codice che Jonathan Allan mi ha dato ha usato ~-x, quindi ho deciso di lasciarlo invariato. Bene, sembra che tutti preferiscano x-1, però (anche Dennis ha detto quella cosa esatta).
Erik the Outgolfer,

IMHO, è più leggibile e sembra più simile alla formula matematica utilizzata.
mbomb007,

@ mbomb007 Oh vuoi dire la taglia aggiunta di recente? Se è così, l'ho cambiato. Ma potrei sollevare alcuni argomenti allora ... Avrei potuto fare anche -~(x*x-1<<~-x)per il disco, ma -1esiste ancora, quindi non mi piace fondere il codice ...
Erik the Outgolfer,

Non intendo nulla riguardo alla generosità. La formula matematica utilizzata in questa risposta . Scriviamo "meno 1" come - 1.
mbomb007,

4

Lua, 105 byte

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

Divertente problema!


3
Benvenuti in Puzzle di programmazione e Code Golf!
Erik the Outgolfer,

s = tonumber (arg [1]) può essere scambiato con s = ... per salvare alcuni byte. ... memorizza la tabella arg decompressa, in questo caso restituisce arg [1]. E le stringhe di lua si comporteranno come numeri di essi contengono solo un costruttore di numeri valido, che possiamo supporre che l'input sia in questo caso.
ATaco,

4

In realtà , 8 byte

;²D@D╙*u

Provalo online!

Spiegazione:

Questo semplicemente calcola la formula (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 byte

~.2?(2@(?*)

Provalo online!

Grazie Martin Ender (8478) per la rimozione di 4 byte.

Spiegazione:

            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 byte

ri_2#(\(m<)

Provalo online.

Spiegazione:

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.

Solo se non avessi bisogno di ri...
Erik the Outgolfer,

3

Mathematica, 15 byte

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

Non esiste un operatore bitshift, quindi dobbiamo fare l'esponenziale effettivo, ma è più breve dividere per 2 invece di diminuire l'esponente.


3

C, 26 byte

Come una macro:

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

Come funzione (27):

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

La versione macro produrrà risultati errati se il parametro è un'espressione. Prendere in considerazione f(1+2).
Kasperd,

1
@kasperd Il parametro non sarà un'espressione. Scrivi un programma completo o una funzione che accetta un numero intero positivo n come input e stampa o restituisce i requisiti nutrizionali per attività di uno stage n canguro.
Erik the Outgolfer,

Il tuo preventivo dice un programma completo o una funzione . Ma una macro non è nessuno dei due.
Kasperd,

@kasperd Fondamentalmente, penso che sia come una funzione, ma senza valutazione. Inoltre, ho fornito una funzione "reale" di seguito, se è quello che vuoi.
Erik the Outgolfer,


2

C #, 18 byte

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

Funzione anonima basata sull'eccellente analisi matematica di Qwerp-Derp .

Programma completo con casi di 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

Lotto, 30 byte

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

Bene, batte comunque Java.


2

MATL , 7 byte

UqGqW*Q

Usa la formula da altre risposte.

Provalo 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

Oasi , 9 byte

2n<mn²<*>

Sono sorpreso che non ci sia un built-in per 2^n.

Provalo online!

Spiegazione:

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

L'esponenziazione in olandese è un mproblema, che e mancanza di creatività. Inoltre, molti operatori non sono ancora stati implementati, a causa della pigrizia e della procrastinazione.
Adnan,

1

Racchetta 33 byte

Usando la formula spiegata da @ Qwerp-Derp

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

Ungolfed:

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

test:

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

Produzione:

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

1

Rubino, 21 byte

@ Qwerp-Derp fondamentalmente ha fatto il sollevamento di carichi pesanti.

A causa della precedenza nel rubino, sembra che abbiamo bisogno di alcune parentesi:

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

1

Scala, 23 byte

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

Usa il bit shift come esponenziazione



1

R, 26 byte

Applicare spudoratamente la formula

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

1

J , 11 byte

1-<:2&*1-*:

Basato sulla stessa formula trovata in precedenza .

Provalo online!

Spiegazione

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

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

Non conserva n , ma utilizza la stessa formula di tutti gli altri in questa competizione. Salvato 1 byte con decrementi, a causa della parentesi necessaria.

Test

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

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


0

JS-Forth, 32 byte

Non molto corto, ma è più corto di Java. Questa funzione spinge il risultato nello stack. Ciò richiede JS-Forth perché io uso <<.

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

Provalo online

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.