半指数函数


21

半指数函数是一个当它与本身组成给出了一个指数函数。例如,如果为f(f(x)) = 2^x,则将f为半指数函数。在此挑战中,您将计算一个特定的半指数函数。

具体来说,您将使用以下属性计算从非负整数到非负整数的函数:

  • 单调递增:如果x < y,则f(x) < f(y)

  • 至少有一半指数:对于所有的xf(f(x)) >= 2^x

  • 词典上最小的:在具有以上属性的所有函数中,输出一个使maximums最小的函数f(0),给定选择,minimizes f(1),然后f(2),依此类推。

对于输入,此函数的初始值为0, 1, 2, ...

[1, 2, 3, 4, 8, 9, 10, 11, 16, 32, 64, 128, 129, 130, 131, 132, 256, 257, ...]

您可以通过以下任意一种方法将其输出为函数或完整程序:

  • x作为输入,输出f(x)

  • 采取x作为输入,输出所述第一xf

  • 无限输出所有f

如果要取x并输出f(x)x必须为零索引。

参考实施

这是代码高尔夫-以字节为单位的最短代码获胜。一如既往,禁止出现标准漏洞


似乎未针对0验证定义:f(f(0))= f(1)= 2但2 ^ 0 = 1
Nahuel Fouilleul

并且对于1:f(f(1))= f(2)= 3但2 ^ 1 = 2
Nahuel Fouilleul

1
@NahuelFouilleul要求是f(f(x))> = 2 ^ x。
马丁·恩德

1
我们应该提交给OEIS吗?
杰普·斯蒂格·尼尔森

Answers:


8

JavaScript(ES7),51 48字节

@Arnauld节省了3个字节

f=i=>i?f[f[q=f(i-1),r=f[i]||q+1]=(i>1)<<i,i]=r:1

接收n并按顺序输出第n个项目。


JavaScript(ES7),70 68 64字节

f=(n,a=[],q=1)=>n?f(n-1,a,(n=2**a.indexOf(a.push(q)))<++q?q:n):a

一个递归函数,它接受x并返回x序列的第一项作为数组。

怎么运行的

该阵列一个是程序产生的,每次一个项目,直到其到达期望的长度。(xnor出色的Python答案中使用的无限技术的端口可能会更短。)

我们可以对每个索引i(0索引)进行以下观察:

  • 如果存在作为一个项目一个在索引ĴA [j]的= I),那么A [1]需要为至少2 Ĵ

这是正确的,因为f(f(j))必须至少为2 j,并且f(f(j))等于a [a [j]],而a [a [j]]则又等于a [i]

通常正确的选项是2 j。然而,对于单数的情况下I = 22存在数组中的索引在J = 1,这意味着2 Ĵ2 -丁这意味着我们将有2在两个A [1]A [2] 。为了解决这个问题,我们取最大值2 ja [i-1] + 1(比前一项大1),对于i = 2给出3

该技术还碰巧确定j是否存在-如果不存在,JS的.indexOf()方法将返回-1,这将导致a [i-1] + 12 -1 = 0.5的最大值。由于序列中的所有项目均至少为1,因此它将始终返回前一个项目加1。

(我将在深夜编写此说明,所以请让我知道是否有混淆或遗漏的内容)


请注意,272由于整数溢出问题,输入及以上给出错误的答案。很好,因为它可以达到数据类型的限制。
isaacg

使用2**代替1<<希望解决问题。
user202729

现在,.99杀死了解决方案。但是为什么要使用+.99而不仅仅是+.9?有什么不同?
user202729 '17

@ user202729我感觉像个白痴-我以前使用的那个版本遗留在那儿Math.log2(...),不得不计算上限。现在根本不需要。谢谢!我会调查一下2**-我本来是用的2**...+.99|0,但是1<<因为我不需要,所以使用了更短的内容|0。现在我认为没有区别……
ETHproductions'Dec 7'17




1

果冻,14字节

iL’2*»Ṁ‘$ṭ
⁸Ç¡

在线尝试!

怎么运行的

⁸Ç¡         Main link. No arguments.

⁸           Set the left argument and the return value to [].
 Ç¡         Read an integer n from STDIN and call the helper link n times, first on
            [], then on the previous result. Return the last result.


iL’2*»Ṁ‘$ṭ  Helper link. Argument: A (array)

 L          Take the length of A. This is the 0-based index of the next element.
i           Find its 1-based index in A (0 if not present).
  ’         Decrement to a 0-based index (-1 if not present).
   2*       Elevate 2 to the 0-based index.
      Ṁ‘$   Take the maximum of A and increment it by 1.
            Note that Ṁ returns 0 for an empty list.
     »      Take the maximum of the results to both sides.
         ṭ  Tack (append) the result to A.

0

Python 2,111字节

def f(x):
 a=range(1,2**x)
 for i in range(1,x):a[i]=max(a[i],a[i-1]+1);a[a[i]]=max(a[a[i]],2**i)
 return a[:x]

在线尝试!

这是对user202729答案的重大修改。我会将此改进作为评论发布,但是答案被删除,因此评论被禁用。


输入258出现“列表索引超出范围”异常,此操作失败。我认为问题x**2是太小了。
isaacg

嗯... Python的2是不同的(通常小于字节)在Python 3
user202729

1
不出所料,半指数比平方大得多。解决方案在处获得“列表索引超出范围” x=1000。您可能想要尝试2**x-非常大,但是codegolf是codegolf。
user202729

@ user202729啊,这是真的。不幸的是,现在使用较大的输入2**x会遇到一个完全不同的问题,即创建的范围太大,Python无法继续。
notjagan

0

迅捷,137字节

func f(n:Int){var l=Array(1...n).map{$0>3 ?0:$0},p=8;if n>3{for i in 3..<n{if l[i]<1{l[i]=l[i-1]+1};if l[i]<n{l[l[i]]=p};p*=2}};print(l)}

将输入作为Int(整数)并打印为[Int](整数数组)。

非高尔夫版本

func f(n:Int){
    var l = Array(1...n).map{$0 > 3 ? 0 : $0} // Create the range from 1 to n and set all
    var p = 8                                 // values greater than 3 to 0
    if n > 3 {
        for i in 3 ..< n {
            if l[i] < 1 {
                l[i] = l[i - 1] + 1
            }
            if l[i] < n {
                l[l[i]] = p
            }
            p *= 2
        }
    }
    print(l)
}

我很好奇,如果您删除空格,会发生什么?
ETHproductions '17

@ETHproductions导致编译器错误,因为整数不能是可选的chained
Herman L
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.