创建一个指针序列


12

让我们定义指针序列是这样的任何序列A(N)= A((N-1) - (A(N-1)))的forall Ñ比一些有限数量。例如,如果我们的序列以

3 2 1 

我们的下一项将是2,因为a(n-1)= 1(n-1)-1 = 1a(1)= 2(此示例为零索引,但是使用计算将使用哪个索引并不重要总是一样。)。如果我们重复这个过程,我们将得到无限序列

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

任务

给定一些初始的正整数数组,输出从该数组开始的指针序列。

输出类型

输出是灵活的,如果您选择将函数编写为程序可以返回,则可以返回无限的整数列表或对序列进行索引的函数。如果您选择编写完整的程序,则可以无限期地输出序列的项。

您也可以选择采用两个输入,即起始数组和索引。如果选择这样做,则只需要在该索引处输出序列项。


您将永远不会得到需要在序列开始之前进行索引的序列。例如,3这不是有效的输入,因为您可能需要先输入术语才能3解析下一个术语。

这是因此您的分数将是程序中的字节数,分数越低越好。

测试用例

为了简单起见,测试用例被截断

2 1   -> 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 ...
2 3 1 -> 2 3 1 3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 ...
3 3 1 -> 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 ...
4 3 1 -> 4 3 1 3 4 4 3 3 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 ...

除输入数组外,是否还可以输出n个额外的项?还是从输入的第n个项开始?
路易斯·门多

@LuisMendo确保任何索引都可以。
Ad Hoc Garf Hunter '10 / 10/11

Answers:


8

JavaScript(ES6),25个字节

a=>f=n=>a[n]||f(--n-f(n))

一个匿名函数,当调用该函数时,将创建一个函数f,该函数以序列中的给定索引给出项目。

如果我误解了任何事情,请告诉我...


您是f(n)从打来的f(n)。我认为这种情况永远不会终止,但是我不了解JS。
Ad Hoc Garf Hunter '10 / 10/11

@FunkyComputerMan当n足够低时,a[n]它将返回真实值,因此,该||电路将短路并阻止其无限递归。
ETHproductions

是的,我明白了,但n每次电话都没有降低。我敢肯定,如果n大于a您的长度,它将永远不会停止。
Ad Hoc Garf Hunter '10 / 10/11

2
@FunkyComputerMan每次调用它都会降低,--n分配给nn-1因此对其的下一个引用将引用递减的n
暴民埃里克(Erik the Outgolfer)'17年

2
@FunkyComputerMan --n递减n,这意味着f(--n-f(n))f((n-1)-f(n-1))
ETHproductions '17

5

外壳7 6字节

¡S!o_L

返回无限列表。 在线尝试! 请注意,TIO截断并打印结果需要一些时间。

说明

运算符¡具有多种含义。在这里,我使用“通过迭代从现有元素列表中计算新元素的函数来构造无限列表”。给定长度为N的列表,新元素将具有基于1的索引N + 1。我们需要做的就是否定列表的最后一个元素(即先前的值),并使用结果将其索引到列表中。

¡S!o_L  Implicit input.
¡       Construct infinite list by iterating this function on input:
 S!      Element at index
    →    last element
  o_     negated.

4

Haskell,36个字节

取得列表并返回索引序列的函数

l!n|n<length l=l!!n|e<-n-1=l!(e-l!e)

在线尝试!

说明

在这里,我们定义一个!带有列表l和索引的函数n。如果n是小于的长度l,我们指数l通过n,否则我们返回l!((n-1)-l!(n-1))。这遵循了我在问题中给出的函数的递归定义。

这是相同的程序。

a l n
 |n<length l = l!!n
 |otherwise = (a l) ((n-1) - (a l) (n-1))

我使用e<-n-1而不是其他方式在分配时保存字节n-1e以便以后使用。


4

MATL13 9字节

:"tt0)_)h

输出初始项,后跟n个其他项(挑战允许),其中n是作为输入的正整数。

在线尝试!

说明

:"      % Implicitly input n. Do the following n times
  tt    %    Duplicate the sequence so far, twice. In the first iteration this
        %    implicitly inputs the array of initial terms
  0)    %    Get value of the last entry, say m
  _)    %    Get value of the entry which is m positions back from the last
  h     %    Append. This extends the array with the new entry
        % Implicit end. Implicitly display

3

Mathematica,63个字节

需要两个输入

(Clear@a;(a@#2[[1]]=#)&~MapIndexed~#;a@n_:=a[n-1-a[n-1]];a@#2)&  

在线尝试!

Martin Ender的-3个字节




2

果冻,6个字节

NṪịṭµ¡

取一个序列S和一个整数k,并将k个项加到S上

在线尝试!

怎么运行的

NṪịṭµ¡  Main link. Left argument: S (sequence). Right argument: k (integer)

    µ¡  Combine the links to the left into a (variadic) chain and call it k times.
        The new chain started by µ is monadic, so the chain to the left will be
        called monadically.
N           Negate; multiply all elements in S by -1.
 Ṫ          Tail; retrieve the last element, i.e., -a(n-1).
  ị         At-index; retrieve the element of S at index -a(n-1).
            Since indexing is modular and the last element has indices n-1 and 0,
            this computes a( (n-1) - a(n-1) ).
   ṭ        Tack; append the result to S.


1

CJam,10个字节

{{(_j-j}j}

对于CJam来说,这非常好(甚至击败了05ab1e!)。

这是一个匿名块,期望i n以堆栈上的形式输入,其中i是序列中的索引,并且n是起始编号的数组。

之所以如此有效,是因为j运算符可以根据一组初始值提供建议的递归。

说明:

{    Function j(n) with [j(0), j(1), j(2)] = [4, 3, 1], return j(6):
 (    Decrement:    5
 _    Duplicate:    5 5
 j    j(5):
  (    Decrement:   5 4
  _    Duplicate:   5 4 4
  j    j(4):
   (    Decrement:  5 4 3
   _    Duplicate:  5 4 3 3
   j    j(3):
    (    Decrement: 5 4 3 2
    _    Duplicate: 5 4 3 2 2
    j    j(2) = 1:  5 4 3 2 1
    -    Subtract:  5 4 3 1
    j    j(1) = 3:  5 4 3 3
   -    Subtract:   5 4 0
   j    j(0) = 4:   5 4 4
  -    Subtract:    5 0
  j    j(0) = 4:    5 4
 -    Subtract:     1
 j    j(1) = 3:     3
}j   End:           3

1

Java(8),60个字节

int a(int[]a,int n){return n<a.length?a[n]:a(a,--n-a(a,n));}

接受两个输入(整数数组a和整数n),并输出n序列的'th值。

说明:

在这里尝试。(可能要花几秒钟。)

int a(int[]a,int n){        // Method with int[] and int parameters and int return-type
  return n<a.length?        //  If input `n` is smaller than the length of the array:
          a[n]              //   Output the `n`'th item of the array
         :                  //  Else:
          a(a,--n-a(a,n));  //   Recursive call with `n-1-a(n-1)`
}                           // End of method


0

05AB1E,20个字节

#`r[=ˆŽ¼}[¯¾¯¾è-è=ˆ¼

期望输入以空格分隔的字符串,并无限期地输出;非常简单的实现

示例运行:

$ 05ab1e -e '#`r[=ˆŽ¼}[¯¾¯¾è-è=ˆ¼' <<< '3 2 1'
3
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2

0

Java(OpenJDK 8)95 93 91 90字节

a->i->{int j=0,b[]=new int[++i];for(;j<i;j++)b[j]=j<a.length?a[j]:b[~-j-b[j-1]];return b;}

在线尝试!


b[(j-1)-...]等于b[~-j-...]
乔纳森·弗雷奇

您可以扭转三元从j>=a.lengthj<a.length保存一个字节:j<a.length?a[j]:b[~-j-b[j-1]]。我也很好奇:为什么在挑战说明中也说明的递归方法只有60个字节时,为什么要采用循环方法呢?
凯文·克鲁伊森

我不喜欢用方法和AFAIK进行回答,自引用函数需要完整的程序答案
Roberto Graham

@RobertoGraham不,递归方法不能是lambda,因此必须是Java 7样式方法。但是仍然允许只发布(Java 7样式)方法而不是完整程序。
凯文·克鲁伊森

@KevinCruijssen我已经将您的答案变成了BiFunction,请在线尝试!。有可能,但是您需要发布整个程序,因为它引用了Main
Roberto Graham

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.