Восстановление параметров диапазона

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, когда он в графическом виде, должен образовывать совершенно прямую линию
Арно
Oooooh. я этого не видел Это должно оживить вещи.
Случайный парень
1
Используя формулу, о которой идет речь, A, B, Cмогут быть любые три числа с плавающей запятой. Диапазон входных этажей может, например, начинаться с 56.7, заканчиваться на 10.2и иметь размер шага -2.159. Единственное, что имеет значение, это то, что точки, которые вы выводите, будучи напольными, точно соответствуют входным данным. Я добавил пример, показывающий это.
Кайл Г
2
@Rod На мой взгляд, смысл второго тестового примера заключался в том, чтобы проиллюстрировать, что для одного и того же входа возможны несколько выходов
Луис Мендо,

Ответы:

3

Октава , 82 байта

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

Время выполнения недетерминировано, но код заканчивается за конечное время с вероятностью 1.

Попробуйте онлайн!

объяснение

Код определяет один functionиз xэтих выходов 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 К сожалению, это не работает, потому что оно останавливается, как только некоторые выходные данные совпадают с входными данными, а не когда все это делают. Смотрите вторую запись второго выхода в вашей ссылке
Луис Мендо
(потому что доказуемо, что вероятность того, что случайно выбранная строка будет действительной, отлична от нуля)
user202729
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

Попробуйте онлайн!

Кубическое время

Имеет некоторые числовые проблемы.

user202729
источник
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этого значения, которые находятся за пределами диапазона для Aи Bсуществуют. Затем берется среднее значение C, чтобы дать полезное значение для , а затем генерируется минимально возможный диапазон.

Нил
источник
0

Желе , 31 байт

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

Попробуйте онлайн!

Предупреждение : неточности с плавающей точкой.

Эрик Outgolfer
источник
1
Не завершается в течение [1,2,3,4,5,5]30 секунд на TIO. Некоторое объяснение, пожалуйста?
user202729
@ user202729 Скорее всего неточности с плавающей точкой. Я проверю это.
Эрик Outgolfer
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

Попробуйте онлайн!

TFeld
источник