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]

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.


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.



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.




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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.