X向前前进,1向后退


21

这里是一个简单序列的前100个数字:

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

这个序列如何运作?

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
  • 对于每个奇数n(0索引),它都是a(n-1) + XX=1每次访问时在1 处加1)
  • 对于每个偶数n(0索引),a(n-1) - 1

挑战:

之一:

  • 给定输入整数n,输出n序列中的'th号。
  • 给定输入整数n,输出n序列的第一个数字。
  • 无限期地输出序列,而无需输入(或获取空的未使用输入)。

挑战规则:

  • 输入n可以是0或1的索引。
  • 如果输出序列(的一部分),则可以使用列表/数组,并使用任何定界符(空格,逗号,换行符等)打印到STDOUT。你的来电。
  • 请说明您在答案中使用的三个选项中的哪个。
  • 您必须至少支持前10,000个数字(第10,000个数字是12,497,501)。

一般规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于您的答案,因此您可以使用STDIN / STDOUT,具有正确参数的函数/方法和返回类型的完整程序。你的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接。
  • 另外,请尽可能添加说明。

测试用例:

粘贴序列中前10,001个数字。随意选择您想要的任何东西。

一些更高的数字:

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

Answers:



8

Excel,31个字节

答案已0编制索引。输出n数字。

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

最终描述的序列只是两个交错的序列:

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

将它们交织成一个0索引序列可得出:

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

这使:

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

我们打高尔夫球到31字节。


使用相同的方法,1索引给出37字节:

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

6

果冻,6个字节

Rj-ḣ⁸S

在线尝试!

0索引。返回n数字。

说明:

Rj-ḣ⁸S Arguments: z
R      [1..x]: z (implicit)
 j-    Join x with y: ^, -1
   ḣ⁸  Take first y of x: ^, z
     S Sum: ^


4

Haskell40 38 37字节

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

返回无限列表,在线尝试!

说明

scanl有三个参数finitxs[ X 0X 1 ... ]),并建立一个新的列表:

[ a 0 =初始a 1 = f(a 0,x 0a 2 = f(a 1,x 1 ... ]

我们制定init = 0并使用翻转($)应用操作(因此它适用一个给函数X ),现在我们只需要一个函数列表-该列表[1..]>>=(:[pred]).(+)是正确的函数的无穷列表:

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

有趣的选择,37字节

flip具有(a -> b -> c) -> b -> a -> c我们也可以使用的类型,id :: d -> d而不是($)因为Haskell的类型推断,该类型d将与统一a -> b,从而提供了相同的结果。

在线尝试!

编辑

使用-2个字节(>>=)代替do-notation。

-1字节,用scanl代替zipWith



3

05AB1E,10个字节

ÎF<NÈi¼¾>+

在线尝试!

说明

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

另一个10乘: ÎFNÈN;Ì*<O


ÎGDN+D<生成序列,但是抓取第n个元素似乎...很难占用3个字节。
魔术章鱼缸



3

果冻,6 个字节

HḶS‘_Ḃ

接受(n返回1)的单子链接a(n)

在线尝试!或查看测试套件

怎么样?

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)

嗯,有趣的方法就在那里。
暴民埃里克(Erik the Outgolfer)'18年

3

PHP73 64 55 51 47字节

第一种方法

高尔夫球第一码答案!
我敢肯定,有一些PHP技巧可以使它更短,并且数学可能会得到改善。

将n作为第一个参数,并输出序列中的第n个数字。

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

减去“ $ x = 0;”减去9个字节。和“ $ i = 0”。

减去9个字节,这要归功于@Kevin Cruijssen改进了for循环和结束标记的丢失。

减1字节,使用按位或“ |” 而不是“(int)”

由于@Dennis,减去了3个字节,因为您可以通过在命令行中使用“ php -r'code here'”运行该标签来删除标签

在线尝试!

第二种方法

使我以前的答案与全新的方法相匹配!

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

使用XOR和tenary运算符在循环中的总和之间切换。

编辑:这不适用于n = 0,我不知道为什么。没有分配$ i,因此它应该为0,因此循环($i<$argv[1])应失败为(0<0==false),因此未分配的$ x应该输出为0而不是1。

在线尝试!

第三种方法

将创建的Excel公式@Wernisch转换为PHP可提供47字节的解决方案

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

在线尝试!


1
嗨,欢迎来到PPCG!如果您还没有阅读过PHP高尔夫技巧<all language>高尔夫技巧,可能会很有趣。打高尔夫球的一些事情:您可以删除拖尾?>。确实可以删除$x=0$i=0(如果不允许的话,$x=$i=0也可以缩短)。同样,循环可以缩短为for(;$i<$y+1;)$x+=$i++;。共-15个字节。入住愉快!:)
凯文·克鲁伊森

@KevinCruijssen非常感谢!
山姆·迪恩

别客气。顺便说一句,您的TIO当前仍然是60字节而不是58字节。并且不确定为什么您声明了57。请在线尝试。
凯文·克鲁伊森

@KevinCruijssen我一直发布错误的TIO!TIO现在说58,但我已经发布了55,因为您可以从开始标记中删除“ php”,但不是在TIO中
Sam Dean

@Wernisch感谢您的配方!
山姆·迪恩

3

R,35个字节

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

在线尝试!

我认为这是@JayCe答案的一种有趣的替代方法,因为在没有内置支持矩阵的情况下,它不能很好地移植到语言中,并且碰巧像高尔夫球一样。

1索引,返回n序列的第一个元素。

怎么运行的:

rbind(n<-1:scan(),-1) 构造以下矩阵:

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

因为R以列优先顺序持有矩阵,所以如果将其转换为a vector,我们将获得一个向量

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

如果我们取一个累加的总和,我们将得到

1 0 2 1 4 3 7 6

这是序列,只是没有前导0diffinv幸运的是,加上前导零,因此我们n-1从矩阵及其中diffinv获取第一个n值,从而获得序列的第一个值。


2
我非常支持您的“ diffinv”答案。
JayCe


3

R35 34字节

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

在线尝试!

第一个输出选项。公式与其他答案相同(我想指出提供该公式的第一个答案,我不知道它是哪个)。

下面的第二和第三输出选项:

R,43个字节

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

在线尝试!

R,51字节

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

在线尝试!


3

Matlab / Octave,31 26字节

将5个字节保存到Luis Mendo!

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

1
您可能可以使用fix代替floor,以及n/2+.5代替ceil(n/2)
Luis Mendo,

@LuisMendo Ty!不知道fix()也不希望1:n/2+.5工作-可能会出错的很多事情,但实际上却不行:)
Leander Moesinger




3

QBasic,31个字节

规范实施的解决方案比Erik的解决方案要长一些。

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

这将无限期地输出。为了运行它,我建议将最后一行更改为LOOP WHILE INPUT$(1) <> "q",这样将在每第二次输入序列之后等待按键,如果按下的键是,则退出q


2

C#(.NET Core),56个字节

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

-2个字节,感谢Kevin Crujssen

在线尝试!

1个索引。退货a(n)

取消高尔夫:

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++)可以i=0;for(;++i<n;)并且i%2==0可以i%2<1
凯文·克鲁伊森

@KevinCruijssen所以我可以,谢谢!我应该看到第二个循环,但是我没有想到第一个循环会工作,因为我认为for循环仅在第一个循环之后检查条件。TIL
Skidsdev '18年

不,它已经在第一次迭代之前检查了。A do-while将在完成第一次迭代后进行检查。:)
凯文·克鲁伊森

在极少数情况下,您甚至可以将- iffor-loop 合并。例如:if(t>0)for(i=0;i<l;i++)for(i=0;t>0&i<l;i++)。不过,我几乎从来无法在答案中使用它。
凯文·克鲁伊森

这是相当真棒,我一定要记住这一点我下次做C#的高尔夫球场,这是这些天相当罕见的:P我的大部分C#的工作是决然ungolfy
Skidsdev

2

外壳11 9 8字节

ΘṁṠe→Θ∫N

感谢H.PWiz,节省了一个字节。
输出为无限列表。
在线尝试!

说明

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

2

渡渡鸟,69字节

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

在线尝试!


不知何故,这是最长的答案。

说明。

┌────┬─────────────────────────────────────────────────┐
│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

木炭,15字节

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

在线尝试!0索引。链接是详细版本的代码。公式可能会更短,但是这样做的乐趣是什么?说明:

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

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

在线尝试!

不像@tsh答案那么漂亮,但是我的适用于更大的数字。

现在,感谢@tsh提供eval解决方案!


<=x+1可以是<x+2
凯文·克鲁伊森

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')应该更短。
tsh

是否eval返回最后修改的值?我仍然不完全了解它可以做什么。
随机家伙

它返回语句的值(可能do在更高版本的语句中涵盖)。
tsh



1

Pyth,8个字节

s<s,R_1S

返回n序号为0的数字。在线尝试

说明,例如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个字节

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

试试吧

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

基于逆向工程TFeld的Python answer
试试吧

展开式

38字节(序列发生器):

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

请注意,这样做的好处是您可以传递 *以获取整个序列,或传入Range以更有效地生成多个值。

26字节(直接计算):

{  # 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个字节

;L¨O>¹É-

在线尝试!

基于乔纳森·艾伦(Jonathan Allan)的Jelly方法(这可能是基于OP用另一个序列定义来编辑问题),因此采用1索引。


+1。我曾在05AB1E中准备了类似的方法,如果没有其他人发布,我计划在几天内发布。稍有不同(我在创建列表之前先减小一半,而不是删除尾部;然后使用I代替¹),但一般的方法和字节数完全相同:;<LO>IÉ-
Kevin Cruijssen

@KevinCruijssen如果我有能力更深入地思考的话,将在昨天发布,但是,好,这是期末考试,禁止对此进行深入思考。:P
暴民埃里克(Erik the Outgolfer)

啊,很高兴我没有总决赛。我也很忙于工作,有时不得不推迟代码发布时间,而这比我想要的要频繁得多。; p祝您考试顺利!
凯文·克鲁伊森

1

10 9字节

_½,ª)\2%-

在线尝试!

基于乔纳森·艾伦(Jonathan Allan)的Jelly方法(这可能是基于OP用另一个序列定义来编辑问题)。1个索引。

说明:

_½,ª)\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]%]-]

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.