交替符号序列


16

介绍

对于每个非零整数,数字的符号可以是+-。零本身是无符号的(+0与相同-0)。在下面的序列中,我们将在正号负号之间交替。该序列以开头1,因此我们1用一个正号,零(这个数字很奇怪,但是我们将数字乘以0)和一个负号来写:

1, 0, -1

下一个数字是2,我们再次执行相同的操作:

2, 0, -2

最终的顺序是:

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

或者更具可读性的形式:

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

任务

给定一个非负整数n,输出上述序列的n 项。您可以选择使用索引版本还是一索引版本。

测试用例:

零索引:

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

或者,如果您更喜欢单索引:

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

这是,因此,字节数最少的提交将获胜!


如果您从[0, 0, 0, -1, 0, 1...
蓝色

@muddyfish不对不起,它必须以开头1
阿德南

Answers:


6

果冻,7个字节

+6d3’PN

零索引。 测试用例在这里。

说明:

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

6

JavaScript ES6,18个字节

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

结果与@LeakyNun的答案非常相似,但直到我发布了我的答案,我才看到他。

解释和解脱

-~是的简写Math.ceil,或四舍五入:

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, ...


1
(我在此证明他在发布解决方案之前没有看到我的解决方案)
Leaky Nun

Math.ceil并且-~不同;Math.ceil(1) == 1-~1 == 2
Cyoce '16

1
缩短1个字节:n=>~(n/3)*~-(n%3)
Cyoce

6

MarioLANG,93 81字节

一索引

在线试用

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

说明:

我们先从输入

;

给我们

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

然后我们递减左字节并用

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

我们最终以

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

然后我们建立循环

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

循环将一直进行到内存看起来像

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

然后我们只需要输出结果

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

2
真好!您似乎喜欢MarioLang。
Rɪᴋᴇʀ

@EasterlyIrk感觉似乎并不相互从MarioLang到EtherFrog,但:;(>:(。虽然,两次[<:被认为是有点高兴。; P
凯文·克鲁伊森

4

Python 2,24字节

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

完整程序:

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

4

MATL,15 12字节

3/XkG3X\2-*_

这使用一个基于索引的索引。

在线尝试!验证测试用例

说明:

    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

要解决大多数问题,类似的方法Q3/Xk-1:1G_)*可能会更好。它可能可以进一步修改以用于基于1的索引。
Suever

4

Haskell,27个字节

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

稍微有趣的28字节解决方案:

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

(均已0索引)


3

MATL,8字节

:t~y_vG)

结果是从1开始的。

在线尝试!

说明

这将建立2D阵列

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

然后使用线性索引提取所需的项。线性分度装置指数下来,然后在(所以在上述阵列中的线性顺序中的第一项是10-120,...)

:     % 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

3

Perl 5,22个字节

21加一-p

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

使用基于1的索引。

说明:

-p将变量设置为$_等于输入。然后,代码将其设置为等于$_%3从0开始的列表中的th元素除以3 (-$_,$_+2)(其中%为模)。注意,如果$_%3是二,则没有这样的元件,并且随后除以3个numifies未定义为0 -p,然后打印$_



2

Perl 6的 26 的23个字节

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

(较短的一个是从其他答案中翻译过来的)

说明(第一个):

{ # 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)
}

测试:

#! /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)

2

J,19 15字节

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

可能需要进一步打高尔夫球...

1个索引。

取消高尔夫:

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

其中>>表示输入(STDIN)和<<表示输出(STDOUT)。


2

Pyke,8 7字节(旧版本)

3.DeRt*

在这里尝试! -请注意,链接可能不会持续很长时间

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

最新版本

3.DhRt*_

在这里尝试!

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

您能否提供(旧版本)
Downgoat

旧代码在此处工作的最新提交(今天是今天早些时候)
蓝色

2

J,27个字节

虽然不是最高尔夫的,但我更喜欢它,因为它使用了议程。

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

这是它的树分解:

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

这与Kenny的J答案非常相似,因为它可以选择大小和符号,但与之不同的是,我使用议程来选择符号。


2

MATL,8个字节

_3&\wq*_

此解决方案在序列中使用基于1的索引。

在线尝试

修改后的版本显示所有测试用例

说明

        % 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


2

其实是10个位元组

3@│\u)%1-*

在线尝试!

说明:

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

2

05AB1E,7个字节

码:

(3‰`<*(

解释:

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

2

GeoGebra,44个字节

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

哪里 n一索引。

说明:

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, 0, -n},但是比编写ceil(n/3)或实现此目的要短。请注意,n必须定义该对象才能创建此对象(如果在运行时未定义该对象,GeoGebra将提示您为创建一个滑块n)。


嗨,欢迎来到PPCG!您是否有可以测试的链接(最好是在线链接)?
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ,谢谢!这是在线小应用程序thingamabob 的链接。该页面空白了一段时间,但随后出现了。
2016年

太好了 但是如何在公式中输入?> _>我尝试将其粘贴到空白中,并提示创建一个滑块,但没有其他任何反应。
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ:在左侧,上面显示“输入...”,首先进行初始化 n,输入类似的内容n=297(这将为您提供配置良好的滑块)。然后将公式粘贴到“输入”框中,该框现在应位于下方n。(请确保按回车键;)该公式的计算结果应n为序列的第三个项,并且在移动滑块时应会更改。

2

迷宫17 15 14字节

使用Sok的1-(n%3)代替想法节省了3个字节~(n%3-2)

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

程序以错误(除以零)终止,但错误消息发至STDERR。

在线尝试!

说明

该程序是完全线性的,尽管最后会反向执行一些代码。

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.

现在,指令指针碰到死胡同并转过身来,因此它从头开始执行代码:

*     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.

2

Erlang,40个字节

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

可悲的是,Erlang没有'%'模运算符,'rem'甚至在3之前都需要空格。


2

六边形,25字节

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

或者,以非最小化格式:

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

在线尝试!

我第一次涉足Hexagony,所以我敢肯定,我在这方面做得还不够高效。

-(n%3 - 1)在一个内存边上进行计算,n/3 + 1在相邻的边上进行计算,然后将它们相乘。


哇,看到这个很有趣!:)
Adnan

2

R,28个字节

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

看起来这是此处大多数答案的变体。从零开始。

   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

它的好处是它可以处理多个输入

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

最初,我想执行以下操作,但无法修剪掉多余的字节。

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

用于rbind将0和负数加到1的范围,n然后返回n第n个项(基于1)。

# 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

2

批处理(Windows),86个字节

备用蝙蝠

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%

该程序运行的Alternate.bat n地方n是要调用的函数的数量。



2

爪哇7,38 37 36字节

我的第一个高尔夫,要温柔

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

在这里尝试!(包括测试用例)

编辑:我算错,也可以通过更换golfed关闭一个或多个字符(-i%3+1)(1-i%3)


1
您好,欢迎来到PPCG!您可以删除后面的空格return,并使用Java 8 lambda。
NoOneIsHere

我应该指定这是Java7。不过,我将删除该空间。谢谢!
Steven H.


1

MATLAB /八度,27字节

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

这将创建一个可以使用调用的匿名函数ans(n)。此解决方案使用基于1的索引。

所有测试用例


1

Mathematica 26字节

借助Martin Ender,节省了4个字节。

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

使用与Suever相同的方法。


1

八度,23字节

没有mod缺点

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

使用基于1的索引魔术。


说明

创建一个匿名函数,该函数将:

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

在乘法步骤之后,我们将得到一个3xn矩阵,如下所示(对于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

制作n专栏实在是太过分了,但这是一个方便的数字,可以保证足够大。线性索引从左到右递减每一列,因此线性索引处的元素42

所有的测试用例都在ideone上


1

直流10

?2+3~1r-*p

使用基于1的索引。

?              # Push input to stack
 2+            # Add 2
   3~          # divmod by 3
     1r-       # subtract remainder from 1
        *      # multiply by quotient
         p     # print
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.