Recuperando Parámetros de Rango

11

Descripción

Se le dan los resultados de una función de rango donde cada elemento se ha redondeado al número entero más cercano. Su objetivo es recuperar la lista original.

Por ejemplo, la siguiente función (en Python3) producirá una entrada para su programa:

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

La salida de su programa debe ser una suposición válida de los datos originales. Aquí, una suposición válida significa que debe coincidir exactamente con la entrada cuando está en el piso y debe ser una salida posible de una función de rango (es decir, cuando se grafica debe formar una línea perfectamente recta).

Ejemplos

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]
Kyle G
fuente
Debería requerir que al menos uno de los valores de salida sea decimal, de lo contrario podríamos devolver la entrada cada vez.
El tipo aleatorio
@Therandomguy cuando se grafica debe formar una línea perfectamente recta
Arnauld
Oooooh No vi esto. Debería condimentar las cosas.
El tipo aleatorio
1
Usando la fórmula en la pregunta, A, B, Cpuede haber tres flotadores. El rango de entrada del piso puede, por ejemplo, comenzar en 56.7, finalizar en 10.2y tener un tamaño de paso de -2.159. Lo único que importa es que los puntos de salida, cuando están en el piso, coinciden exactamente con la entrada. He agregado un ejemplo que muestra eso.
Kyle G
2
@ Rod Tal como lo veo, el objetivo del segundo caso de prueba original era ilustrar que varias salidas son posibles para la misma entrada
Luis Mendo

Respuestas:

3

Octava , 82 bytes

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

El tiempo de ejecución no es determinista, pero el código termina en tiempo finito con probabilidad 1.

Pruébalo en línea!

Explicación

El código define una functionde xesas salidas y. La función consiste en un whilebucle.

En cada iteración, numel(x)se genera la cantidad correcta ( ) de valores espaciados linealmente ( linspace), comenzando en x(1)+randy terminando en x(end)+rand. Estas dos llamadas a la randfunción dan compensaciones aleatorias entre 0y 1, que se aplican a los valores inicial y final de x.

El ciclo se repite mientras anylos floorresultados de la edición difieran ( -) de la entrada correspondiente en x.

Luis Mendo
fuente
78 bytes usando en a!=blugar deany(a-b)
ovs
@ovs Desafortunadamente eso no funciona, porque se detiene tan pronto como una entrada de salida es igual a la entrada, no cuando todo lo hace. Vea la segunda entrada de la segunda salida en su enlace
Luis Mendo
(porque es comprobable que la probabilidad de que una línea elegida al azar sea válida no es cero)
usuario202729
3

Python 3 , 189 bytes

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

Pruébalo en línea!

Tiempo cúbico.

Tiene algunos problemas numéricos.

usuario202729
fuente
3

R , 86 bytes

function(n){while(any(n-(x=seq(n[1]+runif(1),tail(n,1)+runif(1),l=sum(n|1)))%/%1))0;x}

Pruébalo en línea!

R port de la respuesta de Luis Mendo ; emite una serie de advertencias debido a la anycoacción, logicalpero se pueden ignorar.

Giuseppe
fuente
1

Python 3 , 168 bytes

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]

Pruébalo en línea! Explicación: gcalcula los valores límite para Cque se encuentran justo fuera del rango para Ay Bpara existir. Luego se toma el promedio para dar un valor utilizable para C, y luego se genera el rango más bajo posible.

Neil
fuente
0

Jalea , 31 bytes

ṾṚ”.;V×LḶ$}+©1ị$}IEȧḞ⁼¥ʋ
0ç1#®ḷ

Pruébalo en línea!

Advertencia : imprecisiones de coma flotante.

Erik el Outgolfer
fuente
1
No termina [1,2,3,4,5,5]en 30 segundos en TIO. Alguna explicación por favor?
user202729
@ user202729 Probablemente inexactitudes de punto flotante. Lo comprobaré.
Erik the Outgolfer
0

JavaScript (Node.js) , 94 bytes, suponiendo una longitud de entrada> 1

f=x=>(t=x.map(_=>a+=b,b=x[1]+(c=Math.random)(a=x[0]+c())-a,a-=b)).map(Math.floor)+''==x?t:f(x)

Pruébalo en línea!

97 bytes

f=x=>(t=x.map(_=>a+=b,b=x[1]+(c=Math.random)(a=x[0]+c())-a||0,a-=b)).map(Math.floor)+''==x?t:f(x)
l4m2
fuente
Falla por [1].
user202729
0

Python 2 , 212 bytes

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

Pruébalo en línea!

TFeld
fuente