Recuperando parâmetros de intervalo


11

Descrição

Você recebe os resultados de uma função de intervalo em que cada elemento foi arredondado para o número inteiro mais próximo. Seu objetivo é recuperar a lista original.

Por exemplo, a seguinte função (no Python3) produzirá uma entrada para o seu programa:

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

A saída do seu programa deve ser uma estimativa válida dos dados originais. Aqui, suposição válida significa que ela deve corresponder exatamente à entrada quando colocada no chão e deve ser uma saída possível de uma função de faixa (ou seja, quando representada graficamente, deve formar uma linha perfeitamente reta).

Exemplos

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]

Você deve exigir que pelo menos um valor de saída seja decimal, caso contrário, poderíamos retornar a entrada toda vez.
O cara aleatório

@Therandomguy quando representados graficamente ele deve formar uma linha reta perfeita
Arnauld

Oooooh. eu não vi isso. Deve apimentar as coisas.
O cara aleatório

1
Usando a fórmula na pergunta, A, B, Cpode haver três flutuadores. O intervalo de entrada do piso pode, por exemplo, começar em 56.7, terminar em 10.2e ter um tamanho de etapa de -2.159. A única coisa que importa é que os pontos que você produz, quando colocados no chão, correspondem exatamente à entrada. Eu adicionei um exemplo mostrando isso.
Kyle G

2
@Rod A meu ver, a ponto da caixa de origem segundo teste foi para ilustrar várias saídas que são possíveis para a mesma entrada
Luis Mendo

Respostas:


3

Oitava , 82 bytes

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

O tempo de execução não é determinístico, mas o código termina em tempo finito com probabilidade 1.

Experimente online!

Explicação

O código define um functiondesses xresultados y. A função consiste em um whileloop.

Em cada iteração, a quantidade correta ( numel(x)) de valores espaçados linearmente é gerada ( linspace), iniciando x(1)+rande terminando em x(end)+rand. Essas duas chamadas para a randfunção fornecem deslocamentos aleatórios entre 0e 1, que são aplicados aos valores inicial e final de x.

O loop é repetido enquanto anyos floorresultados do ed diferem ( -) da entrada correspondente em x.


78 bytes usando em a!=bvez deany(a-b)
ovs 17/04/19

@ovs Infelizmente isso não funciona, porque para assim que alguma entrada de saída é igual à da entrada, não quando todos funcionam. Veja a segunda entrada da segunda saída no seu link
Luis Mendo

(porque é provável que a probabilidade de uma linha escolhida aleatoriamente para ser válido é diferente de zero)
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

Experimente online!

Tempo cúbico.

Tem alguns problemas numéricos.



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]

Experimente online! Explicação: gcalcula os valores-limite para Caqueles que estão fora do intervalo para Ae Bpara existir. A média é tomada para fornecer um valor utilizável para Ce, em seguida, o menor intervalo possível é gerado.




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

Experimente online!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.