这是一个让我感兴趣的编程问题。
您可以为程序提供逗号分隔的数字序列。然后,它从这些数字中找到合适的公式,以找到序列中的下一个数字。
In: 1,2,3,4,5
Out: 6
In: 2,4,6,8
Out: 10
In: 10,8,6,4
Out: 2
我不确定这个问题是否比它看起来复杂得多,在这种情况下它可能不适合代码高尔夫。我只是在暗示它。
答案 0 :(得分:4)
(从我上面的评论复制):实际上,假设输入的大小是有限的,这总是可以解决的 - 你可以在任何给定的n-1
点序列上拟合n
度多项式。
平凡的,在MATLAB中(没有安装我,但它应该工作):
x = [1, 2, 3, 4]
y = [2, 4, 6, 8]
poly = polyfit(x, y, 3)
nextnum = polyval(poly, 5)
这将创建一个四点多项式,其中y
作为输入序列,拟合三次多项式并在下一个点(5)对其求值。当然,有无数个函数可以生成任何给定的n
点,因此猜测“正确”的下一个数字是不可能的。但是,此将为您提供一个函数,可以生成您的第一个n
输入数字,然后生成下一个数字。也许不是重点,但这可以在这里完成。
答案 1 :(得分:2)
正如其他一些人已经说过的那样:假设有限输入,总会有至少一个拟合这些点的多项式(或者,就此而言,序列),因此以下PowerShell脚本将始终生成有效的下一个数字,至少其中一个序列:
1
它也只有一个字节长,所以我猜它足够高了。
答案 2 :(得分:1)
这不是编程问题。有无数许多合适的公式,找到一个公式并不是一个特别有趣的问题。查找特定类型的公式 可能是一个有趣或有用的问题,具体取决于类型。
例如,给定 n 值,总会有一个合适的公式是{em> n 的polynomial。这对于证明其他数学定理通常很有用,但没有很多实际应用。
此类问题的关键字是interpolation。你给出的三个例子是线性插值;找出线性插值是否可行以及它的结果是一个相对容易的高尔夫问题。
The On-Line Encyclopedia of Integer Sequences是一个收集人们感兴趣的特定序列的网站。
答案 3 :(得分:1)
f = FindSequenceFunction[{#}, Length[{#}] + 1] &
>f[1,2,3,4,5]
6
>f[2,4,6,8]
10
>f[10, 8, 6, 4]
2
>f[1!, 2!, 3!, 4!, 5!]
720
>f[1, 4, 9, 16, 25]
36
>f[1, 1, 2, 3, 5, 8, 13] // Fibonacci numbers
21
>f[1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7] // Harmonics
1/8
>f[1, 1 + x, 1 + x + x^2, 1 + x + x^2 + x^3, 1 + x + x^2 + x^3 + x^4] // Polynomial sequences
(-1 + x^6)/(-1 + x)
>f[1, -1/2, 1/3, -1/4, 1/5, -1/6, 1/7] // Alternating signs
-1/8
>f[1^1, 2^2, 3^3, 4^4] // n^n sequence
3125
>f[Sin[Pi/4], 2 Sin[Pi/4], 3 Sin[Pi/4], 4 Sin[Pi/4]] // Trig series
5/Sqrt[2]
答案 4 :(得分:1)
(>:@$p.~p.@<)
说明:
>:@$ NB. One more than the size of the input list...
p.~ NB. ... substituted into the polynomial with coefficients...
p.@< NB. ... the coefficients of the polynomial with roots specified by the input list
用法:
(>:@$p.~p.@<) 1 2 3
6
(>:@$p.~p.@<) 10 8 6 4
_15
答案 5 :(得分:0)
这个问题表明大脑在模式匹配方面比计算机程序好多少。这种类型的编码并不容易。你必须编写一个(in)有限数量的可能模式和代码来检查输入,希望匹配 - 或多个匹配。这不是高尔夫类型的问题。