Odzyskiwanie parametrów zakresu

11

Opis

Otrzymujesz wyniki funkcji zakresu, w której każdy element został zaokrąglony w dół do najbliższej liczby całkowitej. Twoim celem jest odzyskanie oryginalnej listy.

Na przykład następująca funkcja (w Python3) wygeneruje dane wejściowe dla Twojego programu:

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

Dane wyjściowe programu powinny być prawidłowym odgadnięciem oryginalnych danych. Prawidłowe zgadywanie oznacza tutaj, że musi dokładnie pasować do wejścia, gdy jest zmiennoprzecinkowy i musi być możliwym wyjściem funkcji zakresu (tj. Po wykreśleniu musi tworzyć idealnie prostą linię).

Przykłady

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.
źródło
Powinieneś wymagać, aby przynajmniej jedna z wartości wyjściowych była dziesiętna, w przeciwnym razie moglibyśmy zwrócić dane wejściowe za każdym razem.
Przypadkowy facet
@Therandomguy po
Arnauld
Ooooch nie widziałem tego. Powinno to urozmaicić.
Przypadkowy facet
1
Korzystając ze wzoru w pytaniu, A, B, Cmogą być dowolne trzy zmiennoprzecinkowe. Wejściowy zakres zmiennoprzecinkowy może na przykład zaczynać 56.7, kończyć o 10.2i mieć wielkość kroku wynoszącą -2.159. Liczy się tylko to, że punkty, które wyprowadzasz, gdy są zmiennoprzecinkowe, dokładnie pasują do danych wejściowych. Dodałem przykład pokazujący to.
Kyle G
2
@Rod Jak widzę, pierwotnym drugim przypadkiem testowym było zilustrowanie, że kilka wyjść jest możliwych dla tego samego wejścia
Luis Mendo

Odpowiedzi:

3

Oktawa , 82 bajty

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

Czas działania nie jest deterministyczny, ale kod kończy się w czasie skończonym z prawdopodobieństwem 1.

Wypróbuj online!

Wyjaśnienie

Kod definiuje functionz xgenerującego y. Funkcja składa się z whilepętli.

W każdej iteracji numel(x)generowana jest odpowiednia ilość ( ) liniowo rozmieszczonych wartości ( linspace), zaczynająca się od x(1)+randi kończąca na x(end)+rand. Te dwa wywołania randfunkcji dają losowe przesunięcia między 0i 1, które są stosowane do wartości początkowej i końcowej x.

Pętla jest powtarzana tak długo, jak anyz floorwyników ed różni ( -) z odpowiednim wpisem x.

Luis Mendo
źródło
78 bajtów używając a!=bzamiastany(a-b)
ovs
@ovs Niestety to nie działa, ponieważ zatrzymuje się, gdy tylko jakaś pozycja wyjściowa zrówna się z wartością na wejściu, a nie kiedy wszystkie robią. Zobacz drugi wpis drugiego wyniku w linku
Luis Mendo
(ponieważ można udowodnić, że prawdopodobieństwo, że losowo wybrana linia będzie ważna, jest niezerowe)
user202729
3

Python 3 , 189 bajtów

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

Wypróbuj online!

Czas sześcienny

Ma pewne problemy numeryczne.

użytkownik202729
źródło
3

R , 86 bajtów

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

Wypróbuj online!

Port R odpowiedzi Luisa Mendo ; generuje wiele ostrzeżeń z powodu anyprzymusu, logicalale można je zignorować.

Giuseppe
źródło
1

Python 3 , 168 bajtów

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]

Wypróbuj online! Objaśnienie: goblicza wartości graniczne Ctego, które leżą tuż poza zakresem Ai Bistnieją. Następnie przyjmuje się średnią, aby podać wartość użytkową C, a następnie generuje najniższy możliwy zakres.

Neil
źródło
0

Galaretka , 31 bajtów

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

Wypróbuj online!

Ostrzeżenie : niedokładności zmiennoprzecinkowe.

Erik the Outgolfer
źródło
1
Nie kończy się [1,2,3,4,5,5]w ciągu 30 sekund w TIO. Jakieś wyjaśnienie, proszę?
user202729
@ user202729 Najprawdopodobniej niedokładności zmiennoprzecinkowe. Sprawdzę to.
Erik the Outgolfer
0

JavaScript (Node.js) , 94 bajty, przy założeniu długości wejściowej> 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)

Wypróbuj online!

97 bajtów

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
źródło
0

Python 2 , 212 bajtów

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

Wypróbuj online!

TFeld
źródło