恢复范围参数


11

描述

您会得到一个范围函数的结果,其中每个元素都已四舍五入到最接近的整数。您的目标是恢复原始列表。

例如,以下函数(在Python3中)将为您的程序产生一个输入:

from numpy import arange, floor
def floored_range(A, B, C):
    return list(floor(arange(A, B, C)))

程序的输出应该是原始数据的有效猜测。在这里,有效的猜测意味着它必须在落地时与输入完全匹配,并且必须是范围函数的可能输出(即,在绘制时必须形成一条完美的直线)。

例子

Input: [1,2,3,4]  
Output: [1,2,3,4]  

Input: [1,2,3,4]  
Output: [1.9,2.7,3.5,4.3]  

Input: [1,2,3,4,5,5]  
Output: [1.9,2.7,3.5,4.3,5.1,5.9]  

Input: [1,1,2,2,3,3,4,4]  
Output: [1,1.5,2,2.5,3,3.5,4,4.5]  

Input: [1,1,2,3,3,4]  
Output: [1,1.7,2.4,3.1,3.8,4.5]

Input: [56, 54, 52, 50, 48, 45, 43, 41, 39, 37, 35, 32, 30, 28, 26, 24, 22, 19, 17, 15, 13, 11]
Output: [56.7  , 54.541, 52.382, 50.223, 48.064, 45.905, 43.746, 41.587,
   39.428, 37.269, 35.11 , 32.951, 30.792, 28.633, 26.474, 24.315,
   22.156, 19.997, 17.838, 15.679, 13.52 , 11.361]

您应该至少要求输出值之一为十进制,否则我们可能每次都返回输入。
随机家伙

@Therandomguy 绘制时必须形成一条完美的直线
Arnauld

哦 我没看到这个。它应该使事情变得有趣。
随机的家伙

1
使用问题中的公式,A, B, C可以是任何三个浮点数。输入下限范围可以例如从开始,在56.7结束10.2并具有的步长-2.159。唯一重要的是,输出的点在铺展时与输入完全匹配。我添加了一个示例来说明这一点。
凯尔·G

2
@Rod正如我看到的那样,原始的第二测试情况的一点是,以说明几个输出是可能对于相同的输入
路易斯Mendo

Answers:


3

八度,82字节

function y=f(x)
while any(floor(y=linspace(x(1)+rand,x(end)+rand,numel(x)))-x),end

运行时间是不确定的,但是代码在有限时间内以概率1结束。

在线尝试!

说明

该代码定义了functionx该输出y。该函数包含一个while循环。

在每次迭代中,都会numel(x)生成(linspace)正确的数量()线性间隔值(),始于,x(1)+rand结束于x(end)+rand。对rand函数的这两个调用给出0和之间的随机偏移1,这些偏移将应用于的初始值和最终值x

该循环重复进行,只要any所述的floor编辑结果不同(-从在相应的条目)x


78个字节a!=b而不是使用any(a-b)
-ovs

@ovs不幸的是,这是行不通的,因为它会在某些输出条目等于输入中的条目时立即停止,而不是在所有条目都生效时才停止。在链接中查看第二个输出的第二个条目
Luis Mendo,

(因为可以证明随机选择的行有效的概率为非零)
user202729 '18

3

Python 3,189字节

def f(l):
 R=range(len(l));e=1-1e-9
 for j in R:
  for I in range(j*4):
   i=I//4;L=[((l[i]+I//2%2*e)*(x-j)-(l[j]+I%2*e)*(x-i))/(i-j)for x in R]
   if[x//1 for x in L]==l:return L
 return l

在线尝试!

立方时间。

有一些数值问题。



1

Python 3,168字节

def f(l):r=range(len(l));g=lambda n:[(l[b]+n-l[a])/(b-a)for a in r for b in r if b>a]or[0];s=(max(g(-1))+min(g(1)))/2;m=min(a*s-l[a]for a in r);return[a*s-m for a in r]

在线尝试!说明:g计算C位于AB存在范围之外的极限值。然后取平均值以给出的可用值C,然后生成最低可能范围。




0

Python 2,212字节

def f(l):
 C=[(0,1.,0,1.)]
 for a,A,b,B in C:
  x,y=(A+a)/2,(B+b)/2;r=[l[0]+x+i*(l[-1]+y-l[0]-x)/(~-len(l)or 1)for i in range(len(l))];C+=[(x,A,y,B),(a,x,y,B),(x,A,b,y),(a,x,b,y)]
  if[n//1for n in r]==l:return r

在线尝试!

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.