Récupération des paramètres de plage

11

La description

Vous obtenez les résultats d'une fonction de plage où chaque élément a été arrondi au nombre entier le plus proche. Votre objectif est de récupérer la liste d'origine.

Par exemple, la fonction suivante (en Python3) produira une entrée pour votre programme:

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

La sortie de votre programme doit être une estimation valide des données d'origine. Ici, une supposition valide signifie qu'elle doit correspondre exactement à l'entrée lorsqu'elle est posée au sol et qu'elle doit être une sortie possible d'une fonction de plage (c'est-à-dire que lorsqu'elle est représentée graphiquement, elle doit former une ligne parfaitement droite).

Exemples

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
la source
Vous devez exiger qu'au moins une des valeurs de sortie soit décimale, sinon nous pourrions retourner l'entrée à chaque fois.
Le gars au hasard
@Therandomguy une fois représenté, il doit former une ligne parfaitement droite
Arnauld
Oooooh. je n'ai pas vu ça. Cela devrait pimenter les choses.
Le gars au hasard
1
En utilisant la formule de la question, il A, B, Cpeut y avoir trois flotteurs. La plage en entrée en entrée peut, par exemple, commencer à 56.7, se terminer à 10.2et avoir une taille de pas de -2.159. La seule chose qui compte, c'est que les points que vous sortez, lorsqu'ils sont au sol, correspondent exactement à l'entrée. J'ai ajouté un exemple montrant cela.
Kyle G
2
@Rod Comme je le vois, le but du deuxième test original était d'illustrer que plusieurs sorties sont possibles pour la même entrée
Luis Mendo

Réponses:

3

Octave , 82 octets

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

Le temps d'exécution n'est pas déterministe, mais le code se termine en temps fini avec la probabilité 1.

Essayez-le en ligne!

Explication

Le code définit une functionde xces sorties y. La fonction consiste en une whileboucle.

Dans chaque itération, la bonne quantité ( numel(x)) de valeurs espacées linéairement est générée ( linspace), commençant à x(1)+randet finissant à x(end)+rand. Ces deux appels à la randfonction donnent des décalages aléatoires entre 0et 1, qui sont appliqués aux valeurs initiales et finales de x.

La boucle est répétée tant que anyles floorrésultats ed diffèrent ( -) de l'entrée correspondante dans x.

Luis Mendo
la source
78 octets utilisant a!=bau lieu deany(a-b)
ovs
@ovs Malheureusement cela ne fonctionne pas, car il arrête dès une entrée de sortie est égale à celle de l'entrée, pas quand tout faire. Voir la deuxième entrée de la deuxième sortie dans votre lien
Luis Mendo
(car il est prouvable que la probabilité pour qu'une ligne choisie au hasard soit valide est non nulle)
user202729
3

Python 3 , 189 octets

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

Essayez-le en ligne!

Heure cubique.

A quelques problèmes numériques.

user202729
la source
3

R , 86 octets

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

Essayez-le en ligne!

R port de la réponse de Luis Mendo ; il émet un certain nombre d'avertissements en raison de la anycontrainte, logicalmais ceux-ci peuvent être ignorés.

Giuseppe
la source
1

Python 3 , 168 octets

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]

Essayez-le en ligne! Explication: gcalcule les valeurs limites pour Cqui se trouvent juste en dehors de la plage pour Aet Bpour exister. La moyenne est ensuite prise pour donner une valeur utilisable pour C, puis la plage la plus basse possible est alors générée.

Neil
la source
0

Gelée , 31 octets

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

Essayez-le en ligne!

Avertissement : inexactitudes en virgule flottante.

Erik le Outgolfer
la source
1
Ne se termine pas [1,2,3,4,5,5]dans 30 secondes sur TIO. Une explication s'il vous plait?
user202729
@ user202729 Probablement des inexactitudes en virgule flottante. Je vérifierai.
Erik the Outgolfer
0

JavaScript (Node.js) , 94 octets, en supposant une longueur d'entrée> 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)

Essayez-le en ligne!

97 octets

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)
l4m2
la source
Échoue pour [1].
user202729
0

Python 2 , 212 octets

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

Essayez-le en ligne!

TFeld
la source