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]

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.


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.


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.


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.




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!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.