我正在建造一个奇特的示波器,但我需要你的帮助。示波器可以同时显示任意数量的单个波形(例如正弦波),但我不知道如何同步显示,这样它就不会跳得太多了。
挑战
您的程序或函数将以一系列浮点数作为输入。第一个数字是示波器屏幕的宽度(会有不同型号的大屏幕或小屏幕)。其余的数字将是每个波形的波长(而不是频率),并且总是小于显示器的宽度。波形的振幅是不重要的,所以没有给出。关于振幅,你唯一需要知道的是它永远不会是零。
您的代码必须输出从开始的距离,其中所有的波形是尽可能同步的宽度显示。当每个波形在0度时(因此,也是高度为零)时,假定存在最小的水平距离。如果有多个最佳匹配,请使用最大匹配(离显示的左边缘最远)。
下面显示了一个示例。垂直线是每个波与其他波最不同步的地方.输入是100 [3.14159265358979, 2.71828182845905, 1.41421356237310] (图像被放大了10倍),输出依次是[40.8407044966673, 40.7742274268858, 41.0121933088199]。除非十进制表示形式在此之前结束,否则您的代码必须至少显示5个有效数字。数字必须以与输入相同的顺序输出。

您需要找到每个输入数字的最大倍数,其中它们之间的最大距离都是尽可能小的,而不超过屏幕宽度的上限。即使存在一个单一的非理性比,对于有限个数,最小的最大距离也不会是0。[0 ...]永远不会是一个答案,因为所有的波形在重复之前至少会在显示器上放一次。计算数字的数学比最初看上去容易得多。您可以用任何分隔符分隔输出数字--它不必是空格或逗号;如果您的语言中有更容易的选项,请使用括号,只要数字正确到所示的位置。对于输入,同样的情况也是如此;例如,如果标签更容易将数字分开,那就可以了,就像任何其他分隔符一样,只要输入的数字与测试数据中所显示的完全一样。
测试数据:
In: 10 [3.16227766016838]
Out: [9.48683298050514]
In: 100 [3.16227766016838]
Out: [98.0306074652198]
In: 105 [6, 7]
Out: [84, 84]
In: 1050 [6, 7]
Out: [1050, 1050]
In: 90 [5, 6, 7]
Out: [85, 84, 84]
In: 100 [5, 6, 7]
Out: [90, 90, 91]
In: 200 [5, 6, 7]
Out: [175, 174, 175]
In: 300 [5, 6, 7]
Out: [210, 210, 210]
In: 100 [1.4142135623731, 3.14159265358979, 2.71828182845905]
Out: [41.0121933088199, 40.8407044966673, 40.7742274268858]
In: 100 [3.14159265358979, 2.71828182845905, 1.4142135623731]
Out: [40.8407044966673, 40.7742274268858, 41.0121933088199]
In: 300 [3.14159265358979, 2.71828182845905, 1.4142135623731]
Out: [141.371669411541, 141.350655079871, 141.42135623731]
In: 900 [3.14159265358979, 2.71828182845905, 1.4142135623731]
Out: [383.274303737954, 383.277737812726, 383.25187540311]
In: 1000 [3.14159265358979, 2.71828182845905, 1.4142135623731]
Out: [907.920276887449, 907.906130705323, 907.92510704353]
In: 100 [1.73205080756888, 2, 2.23606797749979, 2.44948974278318, 2.64575131106459]
Out: [24.2487113059643, 24, 24.5967477524977, 24.4948974278318, 23.8117617995813]
In: 1000 [1.73205080756888, 2, 2.23606797749979, 2.44948974278318, 2.64575131106459]
Out: [129.903810567666, 130, 129.691942694988, 129.822956367509, 129.641814242165]作为一个例子,让我们以下面的测试用例为例:
In: 200 [5, 6, 7]
Out: [175, 174, 175]在[5, 6, 7] ([1*5, 1*6, 1*7]),您可以显示每个数字尽可能接近它的邻居,而不改变任何倍数。包含所有数字的最小距离是2 (7-5)。但是有比200更小的解决方案吗?在[35, 36, 35] ([7*5, 6*6, 5*7]),包含所有数字的最小距离现在只有1 (36-35)。我们能把它变小点吗?下一个最小的距离是在[210, 210, 210] ([42*5, 35*6, 30*7]),在0 (210-210)是最优的,但是210比200大,所以在这种情况下是不允许的。低于或等于200的最大解是[175, 174, 175] ([35*5, 29*6, 25*7]),距离也是1 (175-174)。
这是密码-高尔夫,所以最短的解决方案获胜!
发布于 2016-02-08 16:47:41
非最优解它适用于所有的测试,但这是一个非常缓慢的解决方案,因为我们测试每一种可能性。
import numpy as n
def f(w,s):
l = len(s)
def g(t,m,k,z):
if t!=[]:
u,*v=t
for i in n.arange(u,w+1,u):
m,k=g(v,m,k,[*z,i])
else:
j=sum(abs(sum(z[1:])/l-i) for i in z[1:])
if j<=m+1e-9 :
return j,z
return m,k
print(g(s,w,0,[0])[1][1:])numpy模块的进口
import numpy as n功能定义w:屏幕长度S:“波长”
def f(w,s):
l = len(s)具有t波长、m最小值、最小点k值、z电流点的递归函数的刻划
def g(t,m,k,z):递归测试:如果t是非空的,则在递归中“更深”。
if t!=[]:
u,*v=t在窦性函数的每个零点上循环
for i in n.arange(u,w+1,u):调用递归函数
m,k=g(v,m,k,[*z,i])
else:最小化的“函数”
j=max(z[1:])-min(z[1:])测试最小值(1e-9,因为有一个精确的issu)
if j<=m+1e-9 :
return j,z
return m,k
print(g(s,w,0,[0])[1][1:])>>> f(300, [5, 6, 7])
[210, 210, 210]
>>> f(100, [5, 6, 7])
[90, 90, 91]在第一次尝试中,我使用点与重心之间的距离
j=sum(abs(sum(z[1:])/l-i) for i in z[1:])https://codegolf.stackexchange.com/questions/70605
复制相似问题