Sequência de sinais alternados

16

Introdução

O sinal de um número é a +ou a -para cada número inteiro diferente de zero. O próprio zero é sem sinal ( +0é o mesmo que -0). Na sequência a seguir, alternaremos entre o sinal positivo , o zero e o negativo . A sequência começa com 1, então escrevemos 1com um sinal positivo, com zero (este é estranho, mas multiplicamos o número por 0) e o sinal negativo:

1, 0, -1

O próximo número é 2e fazemos a mesma coisa novamente:

2, 0, -2

A sequência é eventualmente:

1, 0, -1, 2, 0, -2, 3, 0, -3, 4, 0, -4, 5, 0, -5, 6, 0, -6, 7, 0, -7, ...

Ou uma forma mais legível:

a(0) = 1
a(1) = 0
a(2) = -1
a(3) = 2
a(4) = 0
a(5) = -2
a(6) = 3
a(7) = 0
a(8) = -3
a(9) = 4
...

A tarefa

Dado um número inteiro não negativo n , a saída do n th termo da sequência acima. Você pode escolher se usa a versão indexada a zero ou indexada .

Casos de teste:

Indexado a zero:

a(0) = 1
a(11) = -4
a(76) = 0
a(134) = -45
a(296) = -99

Ou se você preferir um indexado:

a(1) = 1
a(12) = -4
a(77) = 0
a(135) = -45
a(297) = -99

Isso é , então a submissão com o menor número de bytes vence!

Adnan
fonte
Tudo bem se você começar com #[0, 0, 0, -1, 0, 1...
Blue
@muddyfish não, desculpe, tem que começar 1.
Adnan

Respostas:

6

Geléia, 7 bytes

+6d3’PN

Indexado a zero. Casos de teste aqui.

Explicação:

+6      Add 6:     x+6
d3      Divmod:    [(x+6)/3, (x+6)%3]
’       Decrement: [(x+6)/3-1, (x+6)%3-1]
P       Product    ((x+6)/3-1) * ((x+6)%3-1)
Lynn
fonte
6

JavaScript ES6, 18 bytes

n=>-~(n/3)*(1-n%3)

Acabou sendo muito parecido com a resposta do @ LeakyNun, mas eu não a vi até depois de postar a minha.

Explicação e Ungolfed

-~é uma abreviação Math.ceilou arredondamento para:

n =>               // input in var `n`
    Math.ceil(n/3) // Get every 3rd number 1,1,1,2,2,2, etc.
    *
    (1-n%3)        // 1, 0, -1, 1, 0, -1, ...

Downgoat
fonte
1
(Por meio deste, atesto que ele não viu minha solução antes de publicá-la) #
Leaky Nun 28/05
Math.ceile -~são diferentes; Math.ceil(1) == 1Considerando que-~1 == 2
Cyoce
1
1 byte mais curto:n=>~(n/3)*~-(n%3)
Cyoce
6

MarioLANG, 93 81 bytes

indexado um

Experimente Online

;(-))+(-
"============<
>:(![<:![<:)![
 !=#="!#="!=#=
!  < !-< !- <
#==" #=" #=="

Explicação:

começamos tomando a imputação

;

que nos dão

          v
... 0 0 input 0 0 ...

decrementamos o byte esquerdo e incrementamos o byte direito com

;(-))+(
=======

acabamos com

           v
... 0 -1 input +1 0 ...

então montamos o loop

;(-))+(-
"============<
>  ![< ![<  ![
   #=" #="  #=
!  < !-< !- <
#==" #=" #=="

o loop irá até a memória parecer

         v 
... 0 -X 0 +X 0 ...

então precisamos apenas produzir o resultado

;(-))+(-
"============<
>:(![<:![<:)![
 !=#="!#="!=#=
!  < !-< !- <
#==" #=" #=="
Ether Frog
fonte
2
Agradável! Você parece gostar de MarioLang.
Rɪᴋᴇʀ
@EasterlyIrk No entanto, o sentimento não parece mútuo entre MarioLang e EtherFrog: ;(e >:(. Embora, duas vezes [<:possam ser consideradas um pouco felizes. ; P
Kevin Cruijssen
4

Python 2, 24 bytes

lambda n:(n/3+1)*(1-n%3)

Programa completo:

a=lambda n:(n/3+1)*(1-n%3)

print(a(0))   #   1
print(a(11))  #  -4
print(a(76))  #   0
print(a(134)) # -45
print(a(296)) # -99
Freira Furada
fonte
4

MATL, 15 12 bytes

3/XkG3X\2-*_

Isso usa uma indexação baseada.

Experimente online! ou verificar casos de teste

Explicação:

    G          #Input
     3X\       #Modulus, except multiples of 3 give 3 instead of 0
        2-     #Subtract 2, giving -1, 0 or 1
3/Xk           #Ceiling of input divided by 3.
          *    #Multiply 
           _   #Negate
DJMcMayhem
fonte
Para cuidar da maioria dos problemas, algo como isso Q3/Xk-1:1G_)*pode funcionar melhor. Provavelmente, pode ser modificado ainda mais para indexação baseada em 1.
Suever 28/05
4

Haskell, 27 bytes

f x=div(x+3)3*(1-mod(x+3)3)

Solução de 28 bytes um pouco mais interessante:

(((\i->[i,0,-i])=<<[1..])!!)

(Ambos são 0indexados)

Michael Klein
fonte
3

MATL , 8 bytes

:t~y_vG)

O resultado é baseado em 1.

Experimente online!

Explicação

Isso cria a matriz 2D

 1  2  3  4  5 ...
 0  0  0  0  0 ...
-1 -2 -3 -4 -5 ...

e, em seguida, usa a indexação linear para extrair o termo desejado. Linear meios de indexação índice para baixo, em seguida, através de (portanto na matriz acima das primeiras entradas na ordem linear são 1, 0, -1, 2, 0, ...)

:     % Vector [1 2 ... N], where N is implicit input
t~    % Duplicate and logical negate: vector of zeros
y_    % Duplicate array below the top and negate: vector [-1 -2 ... -N]
v     % Concatenate all stack contents vertically
G)    % Index with input. Implicit display
Luis Mendo
fonte
3

Perl 5, 22 bytes

21 mais um para -p:

$_=(-$_,$_+2)[$_%3]/3

Usa indexação baseada em 1.

Explicação:

-pdefine a variável $_igual à entrada. O código então o define igual ao $_%3th elemento, dividido por 3, da lista baseada em 0 (-$_,$_+2)(onde %está o módulo). Observe que se $_%3for dois, não existe esse elemento e a divisão subsequente por 3 numera o indefinido para 0. e -pdepois imprime $_.

msh210
fonte
3

Bash, 28 25 bytes

echo $[(1+$1/3)*(1-$1%3)]
rexkogitans
fonte
@DigitalTrauma, tkx, não sabia disso ...
rexkogitans
2

Perl 6 ,  26  23 bytes

{({|(++$,0,--$)}...*)[$_]}
{($_ div 3+1)*(1-$_%3)}

(O menor foi traduzido de outras respostas)

Explicação (da primeira):

{ # bare block with implicit parameter 「$_」
  (

    # start of sequence generator

    { # bare block
      |(  # slip ( so that it flattens into the outer sequence )
        ++$, # incrementing anon state var =>  1, 2, 3, 4, 5, 6
        0,   # 0                           =>  0, 0, 0, 0, 0, 0
        --$  # decrementing anon state var => -1,-2,-3,-4,-5,-6
      )
    }
    ...  # repeat
    *    # indefinitely

    # end of sequence generator

  )[ $_ ] # get the nth one (zero based)
}

Teste:

#! /usr/bin/env perl6
use v6.c;
use Test;

# store it lexically
my &alt-seq-sign = {({|(++$,0,--$)}...*)[$_]}
my &short-one = {($_ div 3+1)*(1-$_%3)}

my @tests = (
    0 =>   1,
   11 =>  -4,
   76 =>   0,
  134 => -45,
  296 => -99,
  15..^30  => (6,0,-6,7,0,-7,8,0,-8,9,0,-9,10,0,-10)
);

plan @tests * 2 - 1;

for @tests {
  is alt-seq-sign( .key ), .value, 'alt-seq-sign  ' ~ .gist;

  next if .key ~~ Range; # doesn't support Range as an input
  is short-one(    .key ), .value, 'short-one     ' ~ .gist;
}
1..11
ok 1 - alt-seq-sign  0 => 1
ok 2 - short-one     0 => 1
ok 3 - alt-seq-sign  11 => -4
ok 4 - short-one     11 => -4
ok 5 - alt-seq-sign  76 => 0
ok 6 - short-one     76 => 0
ok 7 - alt-seq-sign  134 => -45
ok 8 - short-one     134 => -45
ok 9 - alt-seq-sign  296 => -99
ok 10 - short-one     296 => -99
ok 11 - alt-seq-sign  15..^30 => (6 0 -6 7 0 -7 8 0 -8 9 0 -9 10 0 -10)
Brad Gilbert b2gills
fonte
2

J, 19 15 bytes

>.@(%&3)*1-3|<:

Provavelmente precisa jogar golfe ainda mais ...

1 indexado.

Ungolfed:

>> choose_sign      =: 1-3|<:      NB. 1-((n-1)%3)
>> choose_magnitude =: >.@(%&3)    NB. ceil(n/3)
>> f                =: choose_sign * choose_magnitude
>> f 1 12 77
<< 1 _4 0

Onde >>significa entrada (STDIN) e <<significa saída (STDOUT).

Freira Furada
fonte
2

Pyke, 8 7 bytes (versão antiga)

3.DeRt*

Experimente aqui! - Observe que o link provavelmente não vai durar muito

3.D      - a,b = divmod(input, 3)
   e     - a = ~a -(a+1)
     t   - b -= 1
      *  - a = a*b
         - implicit output a

Versão mais recente

3.DhRt*_

Experimente aqui!

3.D      - a,b = divmod(input, 3)
   h     - a+=1
     t   - b-=1
      *  - a = a*b
       _ - a = -a
         - implicit output a
Azul
fonte
Você pode fornecer um link para a (versão antiga)
Downgoat 28/05
Confirmação mais recente em que o código antigo funciona aqui (hoje é mais cedo) #
azul
2

J, 27 bytes

Embora não seja o jogador de golfe, eu gosto mais, pois usa uma agenda.

>.@(>:%3:)*1:`0:`_1:@.(3|])

Aqui está a decomposição da árvore:

         ┌─ >.      
  ┌─ @ ──┤    ┌─ >: 
  │      └────┼─ %  
  │           └─ 3: 
  ├─ *              
──┤           ┌─ 1: 
  │      ┌────┼─ 0: 
  │      │    └─ _1:
  └─ @. ─┤          
         │    ┌─ 3  
         └────┼─ |  
              └─ ]  

Isso é muito semelhante à resposta J de Kenny, na medida em que escolhe a magnitude e o sinal, mas é diferente no fato de eu usar uma agenda para escolher o sinal.

Conor O'Brien
fonte
2

MATL, 8 bytes

_3&\wq*_

Esta solução usa a indexação baseada em 1 na sequência.

Experimente Online

Versão modificada mostrando todos os casos de teste

Explicação

        % Implicitly grab the input
_       % Negate the input
3&\     % Compute the modulus with 3. The second output is floor(N/3). Because we negated
        % the input, this is the equivalent of ceil(input/3)
w       % Flip the order of the outputs
q       % Subtract 1 from the result of mod to turn [0 1 2] into [-1 0 1]
*       % Take the product with ceil(input/3)
_       % Negate the result so that the sequence goes [N 0 -N] instead of [-N 0 N]
        % Implicitly display the result
Suever
fonte
2

Pitão, 10 bytes

*h/Q3-1%Q3

Experimente online!

Explicação:

*     : Multiply following two arguments
h/Q3  : 1 + Input/3
-1%Q3 : 1 - Input%3

Nota: Eu assumi a sequência indexada a zero.

John Red
fonte
1
Você provavelmente gostaria de incluir este link. Além disso, bem-vindo ao PPCG!
Freira vazando
Eu tenho bastante perto de sua solução ...*@(1ZtZ)%Q3h/Q3
FliiFe
@FliiFe (1ZtZ)=-L1 2
Leaky Nun
2

Na verdade, 10 bytes

3@│\u)%1-*

Experimente online!

Explicação:

3@│\u)%1-*
3@│         push 3, swap, duplicate entire stack ([n 3 n 3])
   \u)      floor division, increment, move to bottom ([n 3 n//3+1])
      %1-   mod, subtract from 1 ([1-n%3 n//3+1])
         *  multiply ([(1-n%3)*(n//3+1)])
Mego
fonte
2

05AB1E, 7 bytes

Código:

(3‰`<*(

Explicado:

(           # negate input: 12 -> -12
 3‰         # divmod by 3: [-4, 0]
   `        # flatten array: 0, -4
    <       # decrease the mod-result by 1: -1, -4
     *      # multiply: 4
      (     # negate -4
Emigna
fonte
2

GeoGebra, 44 bytes

Element[Flatten[Sequence[{t,0,-t},t,1,n]],n]

onde né um indexado.

Explicação:

Element[                      , n] # Return the nth element of the list                  .
 Flatten[                    ]     # Strip all the unnecessary braces from the list     /|\
  Sequence[{t,0,-t}, t, 1, n]      # Generate a list of lists of the form {t, 0, -t}     |
                             # This list will start with {1,0,-1} and end with {n,0,-n}  |

Não é necessário gerar todos os trigêmeos {n, 0, -n}, mas é mais curto que escrever ceil(n/3)ou algo nesse sentido. Observe que ndeve ser definido para criar este objeto (se não estiver definido no momento em que for executado, o GeoGebra solicitará que você crie um controle deslizante para n).

Joe
fonte
Olá e bem-vindo ao PPCG! Você tem um link para testar isso (de preferência online)?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ, obrigado! Aqui está um link para um applet online thingamabob. A página ficou em branco por um tempo, mas depois apareceu.
Joe
Oh fixe. Mas como eu coloco a fórmula? > _> Tentei colá-lo no espaço em branco e ele solicitou a criação de um controle deslizante, mas nada mais aconteceu.
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ: Do lado esquerdo, onde se lê "Input ..." Primeiro, para inicializar n, digite algo como n=297(isso fornecerá um controle deslizante que está configurado muito bem). Em seguida, cole a fórmula na caixa Entrada, que agora deve estar abaixo do n. (Certifique-se de pressionar return;) A fórmula deve ser avaliada até o ntermo da sequência e deve mudar quando você move o controle deslizante.
Joe
2

Labirinto , 17 15 14 bytes

Economizou 3 bytes usando a ideia de Sok de usar em 1-(n%3)vez de ~(n%3-2).

1?:#/)}_3%-{*!

O programa termina com um erro (divisão por zero), mas a mensagem de erro vai para STDERR.

Experimente online!

Explicação

O programa é completamente linear, embora algum código seja executado ao contrário no final.

1     Turn top of stack into 1.
?:    Read input as integer and duplicate.
#     Push stack depth (3).
/)    Divide and increment.
}     Move over to auxiliary stack.
_3%   Take other copy modulo 3.
-     Subtract from 1. This turns 0, 1, 2 into 1, 0, -1, respectively.
{*    Move other value back onto main stack and multiply.
!     Output as integer.

O ponteiro de instruções agora atinge um beco sem saída e gira, então começa a executar o código a partir do final:

*     Multiply two (implicit) zeros.
{     Pull an (implicit) zero from the auxiliary to the main stack.
-     Subtract two (implicit) zeros from one another.
      Note that these were all effectively no-ops due to the stacks which are
      implicitly filled with zeros.
%     Attempt modulo, which terminates the program due to a division-by-zero error.
Martin Ender
fonte
2

Erlang, 40 bytes

F=fun(N)->trunc((N/3+1)*(1-N rem 3))end.

Infelizmente, Erlang não tem operador de módulo '%' e 'rem' requer os espaços, mesmo antes do 3.

fxk8y
fonte
2

Hexagonia , 25 bytes

?'+}@/)${':/3$~{3'.%(/'*!

Ou, em formato não minificado:

    ? ' + }
   @ / ) $ {
  ' : / 3 $ ~
 { 3 ' . % ( /
  ' * ! . . .
   . . . . .
    . . . .

Experimente online!

Minha primeira incursão no Hexagony, por isso tenho certeza de que não fiz isso de maneira tão eficiente quanto poderia ser ...

Calcula -(n%3 - 1) em uma borda da memória, n/3 + 1em uma borda adjacente e depois as multiplica.

Sok
fonte
Uau, muito interessante ver isso! :)
Adnan
2

R, 28 bytes

-((n=scan())%%3-1)*(n%/%3+1)

Parece que esta é uma variação da maioria das respostas aqui. Baseado em zero.

   n=scan()                  # get input from STDIN
  (        )%%3-1            # mod by 3 and shift down (0,1,2) -> (-1,0,1)
-(               )           # negate result (1,0,-1), this handles the alternating signs
                  *(n%/%3+1) # integer division of n by 3, add 1, multiply by previous

O bom disso é que ele lida com várias entradas

> -((n=scan())%%3-1)*(n%/%3+1)
1: 0 3 6 9 1 4 7 10 2 5 8 11
13: 
Read 12 items
 [1]  1  2  3  4  0  0  0  0 -1 -2 -3 -4
> 

Originalmente, eu queria fazer o seguinte, mas não conseguia cortar os bytes extras.

rbind(I<-1:(n=scan()),0,-I)[n]

Usa rbindpara adicionar zeros e negativos a um intervalo de 1 para nretornar o n'ésimo termo (um baseado).

# for n = 5
rbind(                    )    # bind rows 
            n=scan()           # get input from STDIN and assign to n
      I<-1:(        )          # build range 1 to n and assign to I
                     ,0        # add a row of zeros (expanded automatically)
                       ,-I     # add a row of negatives
                           [n] # return the n'th term
MickyT
fonte
2

Lote (Windows), 86 bytes

Alternate.bat

SET /A r=%1%%3
SET /A d=(%1-r)/3+1
IF %r%==0 ECHO %d%
IF %r%==1 ECHO 0
IF %r%==2 ECHO -%d%

Este programa é executado como Alternate.bat nonden é o número que deseja chamar a função.

Drew Christensen
fonte
2

APL, 12 caracteres

-×/1-0 3⊤6+⎕

0 3⊤é APL divmod 3.

lstefano
fonte
2

Java 7, 38 37 36 bytes

Meu primeiro golfe, seja gentil

int a(int i){return(1+i/3)*(1-i%3);}

Experimente aqui! (casos de teste incluídos)

Edit: Eu contei mal e também joguei fora mais um personagem substituindo (-i%3+1)por (1-i%3).

Steven H.
fonte
1
Olá, e bem-vindo ao PPCG! Você pode remover o espaço depois returne usar um Java 8 lambda.
NoOneIsHere
Eu deveria especificar que esse era o Java 7. Porém, removerei esse espaço. Obrigado!
Steven H.
1

MATLAB / oitava, 27 bytes

@(n)ceil(n/3)*(mod(-n,3)-1)

Isso cria uma função anônima que pode ser chamada usando ans(n). Esta solução usa indexação baseada em 1.

Todos os casos de teste

Suever
fonte
1

Mathematica 26 bytes

Com 4 bytes salvos, graças a Martin Ender.

⎡#/3⎤(-#~Mod~3-1)&

Usa a mesma abordagem que Suever.

DavidC
fonte
1

Oitava, 23 bytes

Sem confortos modernos ...

@(n)(-[-1:1]'*[1:n])(n)

Usa mágica de indexação baseada em 1.


Explicação

Cria uma função anônima que irá:

(-[-1:1]'*[1:n])(n)
  [-1:1]              % make a row vector [-1 0 1]
 -      '             % negate and take its transpose making a column vector
          [1:n]       % make a row vector [1..n], where n is the input
         *            % multiply with singleton expansion
               (n)    % use linear indexing to get the nth value

Após a etapa de multiplicação, teremos uma matriz 3xn assim (para n = 12):

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

Criar ncolunas é um exagero, mas é um número conveniente que é garantido que seja grande o suficiente. A indexação linear conta cada coluna da esquerda para a direita, portanto o elemento no índice linear 4seria 2.

Todos os casos de teste em ideone .

taça
fonte
1

dc, 10

?2+3~1r-*p

Usa indexação baseada em 1.

?              # Push input to stack
 2+            # Add 2
   3~          # divmod by 3
     1r-       # subtract remainder from 1
        *      # multiply by quotient
         p     # print
Trauma Digital
fonte