Memulihkan Parameter Rentang

11

Deskripsi

Anda diberi hasil fungsi rentang di mana setiap elemen telah dibulatkan ke bilangan bulat terdekat. Tujuan Anda adalah memulihkan daftar asli.

Misalnya, fungsi berikut (dalam Python3) akan menghasilkan input untuk program Anda:

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

Output dari program Anda harus merupakan tebakan yang valid dari data asli. Di sini, tebakan yang valid berarti bahwa itu harus benar-benar cocok dengan input ketika lantai dan itu harus menjadi output yang mungkin dari fungsi rentang (yaitu, ketika grafik itu harus membentuk garis lurus sempurna).

Contohnya

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
sumber
Anda harus meminta setidaknya satu dari nilai output menjadi desimal, jika tidak kita dapat mengembalikan input setiap kali.
Pria acak 17
@Therandomguy saat membuat grafik harus membentuk garis lurus sempurna
Arnauld
Oooooh. Saya tidak melihat ini. Itu harus membumbui segalanya.
Pria acak 17
1
Menggunakan rumus dalam pertanyaan, A, B, Cbisa tiga mengapung. Rentang lantai input dapat, misalnya, mulai dari 56.7, berakhir pada 10.2dan memiliki ukuran langkah -2.159. Satu-satunya hal yang penting adalah bahwa poin yang Anda hasilkan, ketika lantai, persis cocok dengan input. Saya telah menambahkan contoh yang menunjukkan hal itu.
Kyle G
2
@Rod Seperti yang saya lihat, titik dari test case asli kedua adalah untuk menggambarkan bahwa beberapa output mungkin untuk input yang sama
Luis Mendo

Jawaban:

3

Oktaf , 82 byte

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

Waktu berjalan adalah non-deterministik, tetapi kode berakhir pada waktu yang terbatas dengan probabilitas 1.

Cobalah online!

Penjelasan

Kode mendefinisikan a functiondari xoutput itu y. Fungsi terdiri dari satu whilelingkaran.

Dalam setiap iterasi, jumlah yang tepat ( numel(x)) dari nilai spasi linear dihasilkan ( linspace), mulai dari x(1)+randdan berakhir pada x(end)+rand. Kedua panggilan ke randfungsi ini memberikan offset acak antara 0dan 1, yang diterapkan pada nilai awal dan akhir x.

Loop diulang selama anysatu floorberbeda hasil ed ( -) dari yang sesuai entri dalam x.

Luis Mendo
sumber
78 byte menggunakan a!=bbukannyaany(a-b)
ov
@ovs Sayangnya itu tidak berfungsi, karena berhenti segera setelah beberapa entri keluaran sama dengan yang ada di input, tidak ketika semua melakukannya. Lihat entri kedua dari output kedua di tautan Anda
Luis Mendo
(karena dapat dibuktikan bahwa kemungkinan untuk jalur yang dipilih secara acak valid adalah nol)
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

Cobalah online!

Waktu kubik.

Memiliki beberapa masalah numerik.

pengguna202729
sumber
3

R , 86 byte

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

Cobalah online!

Port jawaban Luis Mendo ; itu memang mengeluarkan sejumlah peringatan karena anypaksaan logicaltapi ini bisa diabaikan.

Giuseppe
sumber
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]

Cobalah online! Penjelasan: gmenghitung nilai pembatas untuk Ckebohongan di luar kisaran untuk Adan Bada. Rata-rata kemudian diambil untuk memberikan nilai yang dapat digunakan untuk C, dan kemudian rentang serendah mungkin kemudian dihasilkan.

Neil
sumber
0

Jelly , 31 byte

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

Cobalah online!

Peringatan : Ketidakakuratan titik-mengambang.

Erik the Outgolfer
sumber
1
Tidak berhenti [1,2,3,4,5,5]dalam 30 detik pada TIO. Tolong, beberapa penjelasan?
user202729
@ user202729 Kemungkinan besar ketidaktepatan floating-point. Saya akan mengeceknya.
Erik the Outgolfer
0

JavaScript (Node.js) , 94 byte, dengan asumsi panjang input> 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)

Cobalah online!

97 byte

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
sumber
Gagal untuk [1].
user202729
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

Cobalah online!

TFeld
sumber