Bereichsparameter wiederherstellen

11

Beschreibung

Sie erhalten die Ergebnisse einer Bereichsfunktion, bei der jedes Element auf die nächste ganze Zahl abgerundet wurde. Ihr Ziel ist es, die ursprüngliche Liste wiederherzustellen.

Die folgende Funktion (in Python3) erzeugt beispielsweise eine Eingabe für Ihr Programm:

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

Die Ausgabe Ihres Programms sollte eine gültige Schätzung der Originaldaten sein. Eine gültige Vermutung bedeutet hier, dass sie genau mit der Eingabe im Boden übereinstimmen muss und eine mögliche Ausgabe einer Bereichsfunktion sein muss (dh, wenn sie grafisch dargestellt wird, muss sie eine perfekt gerade Linie bilden).

Beispiele

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.
quelle
Sie sollten mindestens einen der Ausgabewerte als Dezimalzahl festlegen, da wir sonst die Eingabe jedes Mal zurückgeben können.
Der zufällige Typ
@Therandomguy, wenn grafisch dargestellt, muss es eine vollkommen gerade Linie bilden
Arnauld
Oooooh. Ich habe das nicht gesehen. Es sollte die Dinge aufpeppen.
Der zufällige Kerl
1
Mit der Formel in der Frage A, B, Ckönnen drei beliebige Floats sein. Der Eingangsbereich kann beispielsweise bei beginnen, bei 56.7enden 10.2und eine Schrittgröße von haben -2.159. Das einzige, was zählt, ist, dass die Punkte, die Sie ausgeben, wenn sie auf dem Boden liegen, genau mit der Eingabe übereinstimmen. Ich habe ein Beispiel hinzugefügt, das das zeigt.
Kyle G
2
@ Rod Wie ich es sehe, war der Punkt des ursprünglichen zweiten Testfalls zu veranschaulichen, dass mehrere Ausgaben für dieselbe Eingabe möglich sind
Luis Mendo

Antworten:

3

Oktave , 82 Bytes

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

Die Laufzeit ist nicht deterministisch, aber der Code endet mit der Wahrscheinlichkeit 1 in endlicher Zeit.

Probieren Sie es online aus!

Erläuterung

Der Code definiert eine functionvon xdaß Ausgängen y. Die Funktion besteht aus einer whileSchleife.

In jeder Iteration wird die richtige Menge ( numel(x)) von linear beabstandeten Werten generiert ( linspace), beginnend bei x(1)+randund endend bei x(end)+rand. Diese beiden Aufrufe der randFunktion ergeben zufällige Offsets zwischen 0und 1, die auf die Anfangs- und Endwerte von angewendet werden x.

Die Schleife wird so lange wiederholt, wie sich anydie floorErgebnisse -von dem entsprechenden Eintrag in unterscheiden x.

Luis Mendo
quelle
78 Bytes mit a!=banstelle vonany(a-b)
ovs
@ovs Leider funktioniert das nicht, da es stoppt, sobald ein Ausgabeeintrag dem in der Eingabe entspricht, nicht wenn alle dies tun. Siehe zweiten Eintrag der zweiten Ausgabe in Ihrem Link
Luis Mendo
(weil es nachweisbar ist, dass die Wahrscheinlichkeit, dass eine zufällig ausgewählte Zeile gültig ist, ungleich Null ist)
user202729
3

Python 3 , 189 Bytes

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

Probieren Sie es online aus!

Kubische Zeit.

Hat einige numerische Probleme.

user202729
quelle
1

Python 3 , 168 Bytes

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]

Probieren Sie es online aus! Erläuterung: gBerechnet die Grenzwerte dafür C, die knapp außerhalb des Bereichs für Aund liegen liegen B. Der Durchschnitt wird dann genommen, um einen verwendbaren Wert für zu geben C, und dann wird der niedrigstmögliche Bereich erzeugt.

Neil
quelle
0

Gelee , 31 Bytes

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

Probieren Sie es online aus!

Warnung : Gleitkomma-Ungenauigkeiten.

Erik der Outgolfer
quelle
1
Wird [1,2,3,4,5,5]bei TIO nicht innerhalb von 30 Sekunden beendet . Eine Erklärung bitte?
user202729
@ user202729 Höchstwahrscheinlich Gleitkomma-Ungenauigkeiten. Ich werde das überprüfen.
Erik der Outgolfer
0

JavaScript (Node.js) , 94 Byte, unter der Annahme einer Eingabelänge> 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)

Probieren Sie es online aus!

97 Bytes

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)
14 m2
quelle
0

Python 2 , 212 Bytes

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

Probieren Sie es online aus!

TFeld
quelle