Ripristino dei parametri di intervallo


11

Descrizione

Vengono forniti i risultati di una funzione di intervallo in cui ogni elemento è stato arrotondato per difetto al numero intero più vicino. Il tuo obiettivo è recuperare l'elenco originale.

Ad esempio, la seguente funzione (in Python3) produrrà un input per il tuo programma:

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

L'output del tuo programma dovrebbe essere un'ipotesi valida dei dati originali. In questo caso, un'ipotesi valida significa che deve corrispondere esattamente all'input quando pavimentato e deve essere un possibile output di una funzione di intervallo (cioè, quando viene rappresentato graficamente, deve formare una linea perfettamente dritta).

Esempi

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]

Dovresti richiedere che almeno uno dei valori di output sia decimale, altrimenti potremmo restituire l'input ogni volta.
Il ragazzo a caso il

@Therandomguy, quando rappresentato, deve formare una linea perfettamente dritta
Arnauld

Oooooh. non l'ho visto. Dovrebbe rendere le cose più piccanti.
Il ragazzo a caso il

1
Utilizzando la formula nella domanda, A, B, Cpuò essere qualsiasi tre float. L'intervallo di input floored può, ad esempio, iniziare alle 56.7, terminare alle 10.2e avere una dimensione del gradino di -2.159. L'unica cosa che conta è che i punti che emetti, quando pavimentati, corrispondono esattamente all'input. Ho aggiunto un esempio che lo dimostra.
Kyle G,

2
@Rod A mio modo di vedere, il punto del secondo caso di test originale era illustrare che sono possibili più uscite per lo stesso ingresso
Luis Mendo,

Risposte:


3

Ottava , 82 byte

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

Il tempo di esecuzione non è deterministico, ma il codice termina a tempo finito con probabilità 1.

Provalo online!

Spiegazione

Il codice definisce uno functiondi xquesti output y. La funzione è costituita da un whileloop.

In ogni iterazione, numel(x)viene generata la giusta quantità ( ) di valori spaziati linearmente ( linspace), iniziando da x(1)+rande terminando a x(end)+rand. Queste due chiamate alla randfunzione forniscono offset casuali tra 0e 1, che vengono applicati ai valori iniziale e finale di x.

Il loop viene ripetuto fino a quando anyi floorrisultati di ed differiscono ( -) dalla voce corrispondente in x.


78 byte usando a!=binvece diany(a-b)
ovs

@ovs Purtroppo non funziona, perché si interrompe non appena una voce di output è uguale a quella nell'input, non quando tutti lo fanno. Vedi la seconda voce della seconda uscita nel tuo link
Luis Mendo,

(perché è dimostrabile che la probabilità che una riga scelta a caso sia valida sia
diversa da

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

Provalo online!

Tempo cubico.

Ha alcuni problemi numerici.


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}

Provalo online!

R porto della risposta di Luis Mendo ; emette una serie di avvertimenti a causa della anyforzatura, logicalma questi possono essere ignorati.


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]

Provalo online! Spiegazione: gcalcola i valori limite per quelli Cche si trovano appena al di fuori dell'intervallo per Aed Besistere. Viene quindi presa la media per fornire un valore utilizzabile per C, quindi viene generato l'intervallo più basso possibile.




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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.