Phục hồi các thông số phạm vi


11

Sự miêu tả

Bạn được cung cấp kết quả của một hàm phạm vi trong đó mọi phần tử đã được làm tròn xuống đến số nguyên gần nhất. Mục tiêu của bạn là để phục hồi danh sách ban đầu.

Ví dụ: hàm sau (trong Python3) sẽ tạo đầu vào cho chương trình của bạn:

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

Đầu ra của chương trình của bạn phải là một phỏng đoán hợp lệ của dữ liệu gốc. Ở đây, đoán hợp lệ có nghĩa là nó phải khớp chính xác với đầu vào khi được thả nổi và nó phải là đầu ra khả dĩ của hàm phạm vi (nghĩa là khi được vẽ biểu đồ, nó phải tạo thành một đường thẳng hoàn hảo).

Ví dụ

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]

Bạn nên yêu cầu ít nhất một trong các giá trị đầu ra là số thập phân, nếu không chúng tôi có thể trả về đầu vào mọi lúc.
chàng ngẫu nhiên

@Therandomguy khi vẽ biểu đồ, nó phải tạo thành một đường thẳng hoàn hảo
Arnauld

Ôi trời ơi. tôi đã không nhìn thấy điều này. Nó nên gia vị mọi thứ lên.
chàng ngẫu nhiên

1
Sử dụng công thức trong câu hỏi, A, B, Ccó thể là bất kỳ ba phao. Ví dụ, phạm vi thả nổi có thể bắt đầu tại 56.7, kết thúc tại 10.2và có kích thước bước là -2.159. Điều duy nhất quan trọng là các điểm bạn xuất ra, khi được thả nổi, khớp chính xác với đầu vào. Tôi đã thêm một ví dụ cho thấy điều đó.
Kyle G

2
@Rod Như tôi thấy, điểm của trường hợp thử nghiệm thứ hai ban đầu là để minh họa rằng một số đầu ra có thể cho cùng một đầu vào
Luis Mendo

Câu trả lời:


3

Octave , 82 byte

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

Thời gian chạy là không xác định, nhưng mã kết thúc trong thời gian hữu hạn với xác suất 1.

Hãy thử trực tuyến!

Giải trình

Mã xác định một functiontrong xnhững đầu ra đó y. Hàm này bao gồm một whilevòng lặp.

Trong mỗi lần lặp, số lượng đúng ( numel(x)) của các giá trị cách nhau tuyến tính được tạo ( linspace), bắt đầu từ x(1)+randvà kết thúc tại x(end)+rand. Hai lệnh gọi randhàm này cung cấp các giá trị bù ngẫu nhiên giữa 01, được áp dụng cho các giá trị ban đầu và giá trị cuối cùng của x.

Vòng lặp được lặp lại cho đến khi nào anynhững floorkhác kết quả ed ( -) từ mục tương ứng trong x.


78 byte sử dụng a!=bthay vìany(a-b)
ovs

@ovs Thật không may, điều đó không hoạt động, bởi vì nó dừng ngay khi một số mục nhập đầu ra bằng với đầu vào, không phải khi tất cả làm. Xem mục thứ hai của đầu ra thứ hai trong liên kết của bạn
Luis Mendo

(vì có thể chứng minh rằng xác suất cho một dòng được chọn ngẫu nhiên là hợp lệ là khác không)
user202729

3

Python 3 , 189 byte

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

Hãy thử trực tuyến!

Thời gian khối.

Có một số vấn đề về số.



1

Python 3 , 168 byte

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]

Hãy thử trực tuyến! Giải thích: gtính toán các giá trị giới hạn cho Cnằm ngoài phạm vi cho ABtồn tại. Trung bình sau đó được lấy để đưa ra một giá trị có thể sử dụng được C, và sau đó phạm vi thấp nhất có thể được tạo ra.




0

Python 2 , 212 byte

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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.