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]

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.


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.


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.


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.




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!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.