X passos adiante, 1 passo atrás


21

Aqui estão os primeiros 100 números de uma sequência fácil:

0,1,0,2,1,4,3,7,6,11,10,16,15,22,21,29,28,37,36,46,45,56,55,67,66,79,78,92,91,106,105,121,120,137,136,154,153,172,171,191,190,211,210,232,231,254,253,277,276,301,300,326,325,352,351,379,378,407,406,436,435,466,465,497,496,529,528,562,561,596,595,631,630,667,666,704,703,742,741,781,780,821,820,862,861,904,903,947,946,991,990,1036,1035,1082,1081,1129,1128,1177,1176,1226

Como essa sequência funciona?

n: 0 1     2           3     4     5     6     7     8      9       10      11      12

   0,      1-1=0,      2-1=1,      4-1=3,      7-1=6,       11-1=10,        16-1=15,      
     0+1=1,      0+2=2,      1+3=4,      3+4=7,      6+5=11,        10+6=16,        15+7=22
  • a(0) = 0
  • Para cada ímpar n(indexado 0), é a(n-1) + X(onde X=1e aumenta em 1 toda vez que é acessado)
  • Para cada par n(indexado 0), éa(n-1) - 1

Desafio:

Um de:

  • Dado um número inteiro de entrada n, imprima o n'número th na sequência.
  • Dado um número inteiro de entrada n, imprima os primeiros nnúmeros da sequência.
  • Emita a sequência indefinidamente sem receber uma entrada ( ou receber uma entrada não utilizada vazia ).

Regras do desafio:

  • A entrada npode ser indexada em 0 ou 1.
  • Se você imprimir (parte da) sequência, poderá usar uma lista / matriz, imprimir em STDOUT com qualquer delimitador (espaço, vírgula, nova linha etc.). Sua chamada.
  • Indique qual das três opções você usou em sua resposta.
  • Você precisará oferecer suporte a pelo menos os primeiros 10.000 números (o número 10.000 é 12,497,501).

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código.
  • Além disso, adicione uma explicação, se possível.

Casos de teste:

Cole a bin com os primeiros 10.001 números na sequência. Sinta-se livre para escolher o que quiser.

Alguns números mais altos:

n (0-indexed)    Output:

68,690           589,772,340
100,000          1,249,975,000
162,207          3,288,888,857
453,271          25,681,824,931
888,888          98,765,012,346
1,000,000        124,999,750,000

Respostas:



8

Excel, 31 bytes

A resposta está 0indexada. Emite no número.

=(A1^2+IF(ISODD(A1),7,-2*A1))/8

A sequência descrita é basicamente apenas duas seqüências entrelaçadas:

ODD:   (x^2+x+2)/2
EVEN:  (x^2-x)/2

O entrelaçamento em uma 0sequência indexada fornece:

a = (x^2 - 2x)/8 if even
a = (x^2 + 7 )/8 if odd

Que dá:

=IF(ISODD(A1),(A1^2+7)/8,(A1^2-2*A1)/8)

que jogamos até os 31bytes.


Usando a mesma abordagem, 1indexado fornece 37bytes:

=(A1^2-IF(ISODD(A1),4*A1-3,2*A1-8))/8



4

Haskell , 40 38 37 bytes

scanl(flip($))0$[1..]>>=(:[pred]).(+)

Retorna uma lista infinita, experimente online!

Explicação

scanlrecebe três argumentos f, inite xs( [ x 0 , x 1 ... ] ) e constrói uma nova lista:

[ a 0 = init , a 1 = f (a 0 , x 0 ) , a 2 = f (a 1 , x 1 ) ... ]

Nós definir init = 0e usar o capotou ($)operador de aplicação (assim ele se aplica um i para a função x i ), agora só precisa de uma lista de funções - a lista [1..]>>=(:[pred]).(+)é uma lista infinita com as funções certas:

[(+1),(-1),(+2),(-1),(+3),(-1),(+4),...

Alternativa interessante, 37 bytes

fliptendo o tipo (a -> b -> c) -> b -> a -> cque também poderíamos usar em id :: d -> dvez de ($)por causa da inferência de tipo de Haskell, o tipo dseria unificado a -> b, dando-nos o mesmo.

Experimente online!

Editar

-2 bytes usando em (>>=)vez de do-notation.

-1 byte usando em scanlvez de zipWith.



3

05AB1E , 10 bytes

ÎF<NÈi¼¾>+

Experimente online!

Explicação

Î             # initialize stack with: 0, input
 F            # for N in [0 ... input-1] do:
  <           # decrement the current number
   NÈi        # if N is even
      ¼       # increment a counter
       ¾>     # push counter+1
         +    # add to current number

Outro 10-byter: ÎFNÈN;Ì*<O


ÎGDN+D<gera a sequência, mas agarrar o enésimo elemento parece ... difícil em 3 bytes.
Urna de polvo mágico


3

APL (Dyalog Unicode) , 16 12 bytes SBCS

Função de prefixo tácito anônimo. Indexado a 0.

+/⊢↑∘∊¯1,¨⍨⍳

Experimente online!

+/ a soma de

⊢↑ os primeiros nelementos

∘∊ do ε nlisted (achatada)

¯1,¨⍨ negativo-um-anexado-a-cada

 primeiros n índices (0 a n–1


Ah, essa foi a minha solução ... acho que foi semelhante o suficiente.
Erik the Outgolfer

3

Gelatina , 6 bytes

HḶS‘_Ḃ

Um link monádico que aceita (indexado 1) nque retorna a(n).

Experimente online! Ou veja a suíte de testes

Quão?

HḶS‘_Ḃ - link: n
H      - halve         -> n/2.0
 Ḷ     - lowered range -> [0,1,2,...,floor(n/2.0)-1]
  S    - sum           -> TriangleNumber(floor(n/2.0)-1)
   ‘   - increment     -> TriangleNumber(floor(n/2.0)-1)+1
     Ḃ - bit = 1 if n is odd, 0 if it's even
    _  - subtract      -> TriangleNumber(floor(n/2.0)-1)+isEven(n)

Hum, abordagem interessante bem ali.
Erik the Outgolfer

3

PHP , 73 64 55 51 47 bytes

Primeiro método

Resposta do primeiro código de golfe!
Tenho certeza de que existem truques do PHP para torná-lo mais curto e a matemática provavelmente pode ser melhorada.

Pega n como o primeiro argumento e gera o enésimo número na sequência.

$y=$argv[1]/2;for(;$i<$y+1;)$x+=$i++;echo$x-($y|0);

Menos 9 bytes removendo "$ x = 0;" e "$ i = 0".

Menos 9 bytes graças a @Kevin Cruijssen, melhorando o loop for e a perda da tag end.

Menos 1 byte usando bit a bit ou "|" em vez de "(int)"

Menos 3 bytes, graças ao @Dennis, pois você pode remover as tags executando-o na linha de comando com "php -r 'code here'"

Experimente online!

Segundo método

Combinei minha resposta anterior com um método totalmente novo!

for(;$i<$argv[1];$i++)$x+=($y^=1)?$i/2+1:-1;echo$x;

Usando o XOR e o operador de inquilino para alternar entre somas no loop.

Edit: Isso não funciona para n = 0 e não tenho idéia do porquê. $ i não está atribuído; portanto, deve ser 0; portanto, o loop ($i<$argv[1])falhará (0<0==false); portanto, um $ x não atribuído deve gerar como 0 e não 1.

Experimente online!

Terceiro método

Converter a fórmula do Excel @Wernisch criada para PHP fornece uma solução de 47 bytes

$z=$argv[1];echo(pow($z,2)+(($z&1)?7:-2*$z))/8;

Experimente online!


1
Olá, seja bem-vindo ao PPCG! Se ainda não o fez, pode ser interessante ler dicas de golfe em PHP e dicas de golfe em <todos os idiomas> . Algumas coisas para o golfe: você pode remover a trilha ?>. A remoção $x=0e $i=0é realmente permitida (se não, $x=$i=0teria sido mais curta também). Além disso, o loop pode ser reduzido para for(;$i<$y+1;)$x+=$i++;. Qual é -15 bytes no total. Aproveite sua estadia! :)
Kevin Cruijssen

@KevinCruijssen, muito obrigado!
Sam Dean

De nada. A propósito, seu TIO ainda tem 60 bytes em vez de 58. E não sabe por que você declarou 57. Experimente online.
Kevin Cruijssen

@KevinCruijssen Continuei postando o TIO errado! TIO diz 58, mas agora eu postei 55 como você pode remover "php" da tag de abertura, não apenas em TIO
Sam Dean

@ Wernisch obrigado pela sua fórmula!
Sam Dean

3

R , 35 bytes

diffinv(rbind(n<-1:scan(),-1)[n-1])

Experimente online!

Eu pensei que essa era uma alternativa interessante à resposta do @ JayCe, pois ela não é muito boa para idiomas sem suporte embutido para matrizes, e acontece também como golfe.

Indexado em 1, retorna os primeiros nelementos da sequência.

Como funciona:

rbind(n<-1:scan(),-1) constrói a seguinte matriz:

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]   -1   -1   -1   -1

Como R possui matrizes na ordem da coluna maior, se convertêssemos isso em a vector, obteríamos um vetor

1 -1 2 -1 3 -1 4 -1

que, se tomarmos uma soma acumulada, teríamos

1 0 2 1 4 3 7 6

que é a sequência, apenas sem a liderança 0.diffinvfelizmente adiciona o zero inicial, então pegamos os primeiros n-1valores da matriz e diffinveles, obtendo os primeiros nvalores da sequência.


2
Eu sou um grande fã de suas respostas 'difíceis'.
JayCe 01/06/19


3

R , 35 34 bytes

(u=(n=scan())-n%%2-1)-n+(15+u^2)/8

Experimente online!

Primeira opção de saída. A mesma fórmula que muitas outras respostas (eu gostaria de apontar para a primeira resposta que fornece a fórmula, não consigo descobrir qual é).

Segunda e terceira opções de saída abaixo:

R , 43 bytes

function(m,n=1:m,u=n%%2+1)((n-u)^2-1)/8+2-u

Experimente online!

R , 51 bytes

while(T){cat(((T-(u=T%%2+1))^2-1)/8+2-u," ");T=T+1}

Experimente online!


3

Matlab / Octave, 31 26 bytes

5 bytes salvos thx em Luis Mendo!

@(n)sum(1:n/2+.5)-fix(n/2)

1
Você provavelmente pode usar em fixvez de floor, e em n/2+.5vez deceil(n/2)
Luis Mendo

@LuisMendo Ty! Não sabia fix()e não esperava 1:n/2+.5para o trabalho - tantas coisas que podem dar errado, mas eles realmente não fazer :)
Leander Moesinger




3

QBasic, 31 bytes

A solução just-implementar-spec vem um pouco mais do que a solução de Erik .

DO
?n
i=i+1
n=n+i
?n
n=n-1
LOOP

Isso gera indefinidamente. Para fins de execução, recomendo alterar a última linha para algo como LOOP WHILE INPUT$(1) <> "q", o que aguardará um pressionamento de tecla após cada segunda entrada de sequência e sairá se a tecla pressionada for q.


2

C # (.NET Core) , 56 bytes

n=>{int a=0,i=0;for(;++i<n;)a+=i%2<1?-1:i/2+1;return a;}

-2 bytes graças a Kevin Crujssen

Experimente online!

1 indexado. Devoluçõesa(n)

Ungolf'd:

int f(int n)
{
    // a needs to be outside the for loop's scope,
    // and it's golfier to also define i here
    int a = 0, i = 1;
    // basic for loop, no initializer because we already defined i
    for (; ++i < n;)
    {
        if (i%2 < 1) {
            // if i is even, subtract 1
            a -= 1;
        }
        else
        {
            // if i is odd, add (i / 2) + 1
            // this lets us handle X without defining another int
            a += i / 2 + 1;
        }
    }
    // a is the number at index n
    return a;
}

1
i=1;for(;i<n;i++)pode ser i=0;for(;++i<n;)e i%2==0pode ser i%2<1.
Kevin Cruijssen

@KevinCruijssen para que eu possa, obrigado! Eu deveria ter visto o segundo, mas não achei que o primeiro funcionaria, pois pensei que os loops só checavam o condicional após o primeiro loop. TIL
Skidsdev

Não, ele já verifica antes da primeira iteração. A do-whileverificará após concluir a primeira iteração. :)
Kevin Cruijssen

Em casos muito raros, você pode mesclar um ifcom um forloop. Por exemplo: if(t>0)for(i=0;i<l;i++)para for(i=0;t>0&i<l;i++). Eu quase nunca consegui usar isso nas minhas respostas, no entanto.
Kevin Cruijssen

isso é muito legal, eu vou definitivamente tem que manter isso em mente na próxima vez que eu faço C # golfe, que é bastante raro nos dias de hoje: P maior parte do meu C # trabalho é decididamente ungolfy
Skidsdev

2

Casca , 11 9 8 bytes

ΘṁṠe→Θ∫N

Guardou um byte graças a H.PWiz.
Saída como uma lista infinita.
Experimente online!

Explicação

ΘṁṠe→Θ∫N
      ∫N   Cumulative sum of natural numbers (triangular numbers).
     Θ     Prepend 0.
 ṁṠe→      Concatenate [n + 1, n] for each.
Θ          Prepend 0.

2

Dodos , 69 bytes

	. w
w
	. h
	+ r . ' dab h '
h
	h ' '
	. dab
r
	
	r dip
.
	dot
'
	dip

Experimente online!


De alguma forma, esta é a resposta mais longa.

Explicação.

┌────┬─────────────────────────────────────────────────┐
│Name│Function                                         │
├────┼─────────────────────────────────────────────────┤
│.   │Alias for "dot", computes the sum.               │
├────┼─────────────────────────────────────────────────┤
│'   │Alias for "dip".                                 │
├────┼─────────────────────────────────────────────────┤
│r   │Range from 0 to n, reversed.                     │
├────┼─────────────────────────────────────────────────┤
│h   │Halve - return (n mod 2) followed by (n/2) zeros.│
└────┴─────────────────────────────────────────────────┘

1

Carvão , 15 bytes

I∨ΣEN⎇﹪ι²±¹⊕⊘ι⁰

Experimente online! Indexado a 0. Link é a versão detalhada do código. A fórmula provavelmente seria mais curta, mas qual é a graça nisso? Explicação:

    N           Input as a number
   E            Map over implicit range
     ⎇          Ternary
      ﹪ι²       Current value modulo 2
         ±¹     If true (odd) then -1
           ⊕⊘ι  Otherwise calculate X as i/2+1
  Σ             Take the sum
 ∨            ⁰ If the sum is empty then use zero
I               Cast to string and implicitly print

1

JavaScript, 49 48 45 bytes

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')

Experimente online!

Não é tão bonito quanto a resposta @tsh, mas a minha funciona para números maiores.

E agora obrigado @tsh, pela evalsolução!


<=x+1pode ser<x+2
Kevin Cruijssen

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')deve ser mais curto.
Tsh

Retorna evalo último valor modificado? Ainda não entendo completamente o que isso pode fazer.
O cara aleatório

Ele retorna o valor da instrução (que pode ser coberta na doinstrução na versão posterior).
Tsh

1

Abaixo 93, 26 bytes

<v0p030
 >:.130g+:30p+:.1-

É executado indefinidamente
Experimente on-line , embora a saída fique um pouco instável e volte depois de x = 256, presumivelmente o TIO não pode manipular caracteres acima de U + 256. Funciona bem em https://www.bedroomlan.org/tools/befunge-playground (apenas Chrome, infelizmente. Com o Firefox, as linhas finais são removidas em tempo de execução, por algum motivo ...)



1

Pitão , 8 bytes

s<s,R_1S

Retorna o nnúmero na sequência, indexada em 0.Experimente online

Explicação, com exemplo para n=5:

s<s,R_1SQQ   Final 2 Q's are implicit, Q=eval(input())

       SQ    1-indexed range        [1,2,3,4,5]
   ,R_1      Map each to [n,-1]     [[1,-1],[2,-1],[3,-1],[4,-1],[5,-1]]
  s          Sum (Flatten)          [1,-1,2,-1,3,-1,4,-1,5,-1]
 <       Q   Take 1st Q             [1,-1,2,-1,3]
s            Sum, implicit output   4

1

Perl 6 ,  38  26 bytes

{(0,{$_+(($+^=1)??++$ !!-1)}...*)[$_]}

Tente

{(+^-$_+|1)**2 div 8+$_%2}

Baseado na engenharia reversa, a resposta em Python do TFeld .
Tente

Expandido

38 bytes (gerador de sequência):

{  # bare block lambda with implicit parameter $_

  (
    # generate a new sequence everytime this function is called

    0,    # seed the sequence

    {     # bare block that is used to generate the rest of the values

      $_  # parameter to this inner block (previous value)

      +

      (
          # a statement that switches between (0,1) each time it is run
          ( $ +^= 1 )

        ??     # when it is 1 (truish)
          # a statement that increments each time it is run
          ++$ # &prefix:« ++ »( state $foo )

        !!     # or else subtract 1
          -1
      )
    }

    ...  # keep generating until:

    *    # never stop

  )[ $_ ] # index into the sequence
}

Observe que isso tem o benefício que você pode transmitir *para obter a sequência inteira ou transmitir um intervalo para gerar mais eficientemente vários valores.

26 bytes (cálculo direto):

{  # bare block lambda with implicit parameter $_

  (

    +^     # numeric binary negate
      -$_  # negative of the input
      +|   # numeric binary or
      1

  ) ** 2   # to the power of 2

  div 8     # integer divide it by 8

  + $_ % 2  # add one if it is odd
}

1

05AB1E , 8 bytes

;L¨O>¹É-

Experimente online!

Com base na abordagem Jelly de Jonathan Allan (que provavelmente foi baseada no OP editando a pergunta com outra definição da sequência), então indexada em 1.


+1. Eu tinha uma abordagem semelhante preparada em 05AB1E, que planejava publicar em alguns dias, se mais ninguém postasse uma. É um pouco diferente (I primeiro diminuir a reduzir pela metade antes de criar a lista, em vez de remover a cauda; e eu uso Iem vez de ¹), mas a abordagem geral e byte-count é exatamente o mesmo:;<LO>IÉ-
Kevin Cruijssen

@KevinCruijssen Teria postado ontem se eu tivesse a capacidade de pensar mais profundamente, mas, bem, este é o período final, pensando profundamente sobre isso é proibido. : P
Erik the Outgolfer

Estou feliz por não ter mais finais. Também estou bastante ocupado no trabalho e tenho que adiar o código-golfe às vezes com mais frequência do que gostaria. ; p Boa sorte com seus exames!
Kevin Cruijssen

1

Convexo , 10 9 bytes

_½,ª)\2%-

Experimente online!

Baseado na abordagem Jelly de Jonathan Allan (que provavelmente foi baseada no OP editando a pergunta com outra definição da sequência). 1 indexado.

Explicação:

_½,ª)\2%- Stack: [A]
_         Duplicate. Stack: [A A]
 ½        Halve. Stack: [A [A]½]
  ,       Range, [0..⌊N⌋). Stack: [A [[A]½],]
   ª      Sum. Stack: [A [[A]½],]ª]
    )     Increment. Stack: [A [[[A]½],]ª])]
     \    Swap. Stack: [[[[A]½],]ª]) A]
      2   2. Stack: [[[[A]½],]ª]) A 2]
       %  Modulo. Stack: [[[[A]½],]ª]) [A 2]%]
        - Minus. Stack: [[[[[A]½],]ª]) [A 2]%]-]

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.