Aralık Parametrelerini Kurtarma


11

Açıklama

Her öğenin en yakın tam sayıya yuvarlandığı bir aralık işlevinin sonuçları verilir. Amacınız orijinal listeyi kurtarmaktır.

Örneğin, aşağıdaki işlev (Python3'te) programınız için bir girdi oluşturur:

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

Programınızın çıktısı, orijinal verilerin geçerli bir tahmini olmalıdır. Burada, geçerli tahmin, katlandığında girişle tam olarak eşleşmesi ve bir aralık işlevinin olası bir çıkışı olması gerektiği anlamına gelir (yani, grafik halinde mükemmel düz bir çizgi oluşturmalıdır).

Örnekler

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]

Çıktı değerinden en az birinin ondalık olması gerekir, aksi takdirde girişi her zaman geri verebiliriz.
Rastgele adam

@Therandomguy grafik zaman mükemmel düz bir çizgi oluşturmak gerekir
Arnauld

Oooooh. Bunu görmedim. Bazı şeyleri renklendirmeli.
Rastgele adam

1
Sorudaki formülü kullanmak, A, B, Cherhangi bir üç yüzer olabilir. Giriş kat aralığı, örneğin başlangıç 56.7, bitiş 10.2ve bitiş boyutlarına sahip olabilir -2.159. Önemli olan tek şey, katlandığında çıkardığınız noktaların girdiyle tam olarak eşleşmesidir. Bunu gösteren bir örnek ekledim.
Kyle G

2
@Rod Gördüğüm gibi, orijinal ikinci test senaryosunun amacı aynı giriş için birkaç çıkışın mümkün olduğunu göstermekti
Luis Mendo

Yanıtlar:


3

Oktav , 82 bayt

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

Çalışma süresi belirleyici değildir, ancak kod olasılık 1 ile sınırlı bir sürede biter.

Çevrimiçi deneyin!

açıklama

Kod, bu çıktılardan functionbirini tanımlar . İşlev bir döngüden oluşur .xywhile

Her yinelemede, numel(x)çizgisinden linspacebaşlayıp x(1)+randbiten, doğrusal olarak aralıklı değerlerin doğru miktarı ( ) üretilir ( ) x(end)+rand. Bunlar iki arama randfonksiyonu arasında rasgele uzaklıklar vermek 0ve 1ilk ve son değerleri uygulanır, x.

Döngü sürece tekrar edilir anyve floorbaskı sonucu farklıdır ( -karşılık gelen girdi) x.


78 bayt kullanarak a!=byerineany(a-b)
ovs

@ovs Ne yazık ki bu işe yaramıyor, çünkü bazı çıkış girişleri girişe eşit olur olmaz, hepsi işe yaramazsa durur . Bağlantınızdaki ikinci çıktının ikinci girişini görün
Luis Mendo

(rastgele seçilen bir çizginin geçerli olma olasılığının sıfır olmadığı kanıtlanabilir)
user202729

3

Python 3 , 189 bayt

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

Çevrimiçi deneyin!

Kübik zaman.

Bazı sayısal sorunları var.


3

R , 86 bayt

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

Çevrimiçi deneyin!

Luis Mendo'nun R bağlantı noktası ; anyzorlama nedeniyle bir dizi uyarı verir, logicalancak bunlar göz ardı edilebilir.


1

Python 3 , 168 bayt

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]

Çevrimiçi deneyin! Açıklama: ve var olan aralığın hemen dışında gbulunan sınır değerlerini hesaplar . Daha sonra ortalama için kullanılabilir bir değer vermek üzere alınır ve daha sonra mümkün olan en düşük aralık oluşturulur.CABC




0

Python 2 , 212 bayt

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.