Solucionador de funções lineares de dois pontos (x, y)

10

A tarefa

Escreva uma função L () que recebe dois argumentos de tupla de coordenadas na forma (x, y) e retorna sua respectiva função linear na forma (a, c), onde a é o coeficiente do termo x ec é o intercepto em y.

Você pode assumir que a entrada não será uma linha perpendicular ao eixo xe que as duas entradas são pontos separados.

Pontuação 

Este é o Code Golf: o programa mais curto vence.

Nota: Não há uso de funções matemáticas além dos operadores básicos (+, -, /, *).

Exemplo

Aqui está minha solução não-golfe em Python.

def L(Point1, Point2):
    x = 0
    y = 1
    Gradient = (float(Point1[y]) - float(Point2[y])) / (float(Point1[x]) - float(Point2[x]))
    YIntercept = Point1[y] - Gradient * Point1[x] 
    return (Gradient, YIntercept)

Resultado:

>>> L( (0,0) , (1,1) )
(1.0, 0.0)

>>> L( (0,0) , (2,1) )
(0.5, 0.0)

>>> L( (0,0) , (7,1) )
(0.14285714285714285, 0.0)

>>> L( (10,22.5) , (5,12.5) )
(2.0, 2.5)
Harry Beadle
fonte
4
L( (0,0) , (0,1) )?
1211 Howard
11
Você pode assumir que a entrada não é uma linha paralela ao eixo X.
Harry Beadle
2
Você pode assumir que a entrada não é uma linha paralela ao eixo X. Você quer dizer eixo Y?
Howard
Desculpe, a edição na postagem estava correta, perpendicular ao eixo X.
Harry Beadle
2
L((0,0),(0,0))?
User12205

Respostas:

1

J - 23 char

Bastante direto. Define um verbo diádico La ser usado como (x1,y1) L (x2,y2).

L=:%~/@:-,-/@(*|.)%-&{.

Explicação:

L=:%~/@:-,-/@(*|.)%-&{.  NB. the function L
                    &{.  NB. x coord of both points
                   -     NB. left x minus right x
             ( |.)       NB. flip right argument: (y2,x2)
              *          NB. pointwise multiplication of (x1,y1) and (y2,x2)
          -/@            NB. subtract the two results: (x1*y2)-(y1*x2)
                  %      NB. divide: (x1*y2 - y1*x2)/(x1-x2)
        -                NB. pointwise subtraction
   %~/@:                 NB. divide y difference by x diff: (y1-y2)/(x1-x2)
         ,               NB. append results together
L=:                      NB. assign function to L

Exemplos:

   L=:%~/@:-,-/@(*|.)%-&{.
   0 0 L 1 1
1 0
   0 0 L 2 1
0.5 0
   0 0 L 7 1
0.142857 0
   10 22.5 L 5 12.5
2 2.5
   0 0 L 0 1  NB. __ is negative infinity
__ 0
algoritmshark
fonte
7

GNU dc , 30 24 bytes

[sysxly-rlx-/dlx*lyr-]sL

Define uma macro de Lmodo que (x 1 , y 1 , x 2 , y 2 ) deve ser empurrada para a pilha nessa ordem antes da chamada e, após a chamada L, (a, c) pode ser removida da pilha (na ordem inversa de claro - é uma pilha).

Caixa de teste (salve como "linear.dc" e execute dc linear.dc ):

[sysxly-rlx- / dlx * lyr-] sL # Definir macro L

10 # Empurre x1 para a pilha
22.5 # Empurre y1 para a pilha
5 # Empurre x2 para a pilha
12.5 # Empurre y2 para a pilha

macro lLx # Call L
f # Despejar a pilha

A saída é:

$ dc linear.dc 
2.5
2
$ 

Explicação da macro L:

  • sypop y 2 para yregistrar
  • sxpop x 2 para se xregistrar
  • lyempurre o yregistro (y 2 )
  • -subtrair y 2 de y 1
  • rswap (y 1 - y 2 ) ex 1 na pilha
  • lxempurre o xregistro (x 2 )
  • -subtrair x 2 de x 1
  • /divida (y 1 - y 2 ) por (x 1 - x 2 ) para obter gradiente
  • d gradiente duplicado
  • lxempurre o xregistro (x 2 )
  • *multiplicar (x 2 ) por gradiente
  • lyempurre o yregistro (y 2 )
  • rswap (y 2 ) e (x 2 * gradiente) na pilha
  • -subtrair (x 2 * gradiente) de (y 2 )
Trauma Digital
fonte
11
Obrigado, nada mal. Eu admito ter sido espancado. ;)
Martin Ender
11
@ m.buettner Jogou novamente e explicou novamente.
Digital Trauma
5

Haskell, 41 caracteres

f(x,y)(u,v)=(a,y-a*x)where a=(y-v)/(x-u)

Não é muito para jogar golfe aqui. É basicamente o que você escreveria normalmente menos espaço em branco.

hammar
fonte
4

Mathematica, 55 38 bytes

Isso foi surpreendentemente longo (esses nomes de função longos e irritantes ...) EDIT: Mudou a abordagem para a interceptação de eixos (inspirando-se na resposta do próprio OP). Acontece que calculá-lo diretamente não foi a idéia mais inteligente.

L={g=1/Divide@@(#2-#),#[[2]]-g#[[1]]}&

Use como

L[{10,22.5},{5,12.5}]
> {2., 2.5}

Graças ao Mathematica, você também pode obter o resultado geral:

L[{r,s},{p,q}]
> {(p - r)/(q - s), (q r - p s)/(q - s)}

(Este último exemplo mostra como eu havia implementado isso originalmente.)

Apenas para o registro

L[{0,0},{0,1}]
> {ComplexInfinity, Indeterminate}

o que é tecnicamente correto.

Martin Ender
fonte
Ahh, impressionante, eu tinha um pouco de preto mente descobrir isso, eu vou pôr a culpa no meu cansaço
Harry Beadle
11
+1. Por que ComplexInfinitye não claramente velho Infinity? (Eu não sei Mathematica)
Digital Trauma
3
@DigitalTrauma Acho que é porque, sem dizer explicitamente ao Mathematica que ele pode funcionar em reais, ele sempre assume que o espaço em questão é um número complexo, para não descartar soluções complexas de equações reais.
Martin Ender
2

JavaScript, 62 48

Obrigado a @ Michael por jogar com o ES 6.

L=(a,b)=>[s=(b[1]-a[1])/(b[0]-a[0]),a[1]-s*a[0]]

Versão antiga:

function L(a,b){return[s=(b[1]-a[1])/(b[0]-a[0]),a[1]-s*a[0]]}

Entrada de amostra:

L([0,0],[7,1])

Saída de amostra:

[0.14285714285714285, 0]

Para o registro:

L([0,0],[0,1])
[Infinity, NaN]
user12205
fonte
46 usando ES6:L=(a,b)=>[g=(p=a[1]-b[1])/(q=a[0]-b[0]),p-g*q]
Michael M.
@Michael Cool. Eu sou uma espécie de novato em JS, então não sabia que você poderia fazer isso. Obrigado.
User12205
@ m.buettner Você está certo ... Corrigido
user12205
11
Agora, todas as respostas têm exatamente dez caracteres de diferença. : D
Martin Ender
11
Awww. O coelho mudou!
1155 Justin Justin
2

Python3 (51)

def L(p,q):x,y=p;X,Y=q;m=(Y-y)/(X-x);return m,y-x*m
xnor
fonte
2

Bytes C # 105

Esta não é apenas a função e será compilada completamente por si própria. Eu coloquei Lno Systemespaço de nomes para reduzir o uso, mas é melhor qualificar-se completamente e economizar usando um espaço de nome. Salvou os colchetes. Também uma poupança de return new z[]emreturn new[]

using z=System.Single;class P{z[] L(z[]a,z[]b){z c=(a[1]-b[1])/(a[0]-b[0]);return new[]{c,a[1]-c*a[0]};}}
Nathan Cooper
fonte
É (c*a[0])necessário? Você não pode eliminar esses parênteses e salvar 2 bytes?
Kyle Kanos
@KyleKanos Sim, obrigado. Enquanto o c # não usa o BODMAS, a multiplicação será feita primeiro (eu acho).
Nathan Cooper
Eu diria que você precisa incluir a namespacedeclaração ou alterá-la para System.Singleque esta solução seja válida.
Tim S.
1

Lua 5.1.4: 66 64 bytes

function L(q,w)a=(q[2]-w[2])/(q[1]-w[1])return a,q[2]-a*q[1];end

Exemplo de uso:

> print(L( {0,0}, {1,0} ))
-0   0
> print(L( {0,0}, {1,1} ))
1    0
> print(L( {0,0}, {7,1} ))
0.14285714285714    0
> print(L( {0,0}, {0,1} ))
-inf   -nan
> print(L( {0,0}, {0,0} ))
-nan   -nan
Kyle Kanos
fonte
1

C ++ 88 (era 106)

Melhorado: obrigado por seus comentários.

struct t{double x,y;};
t L(t u, t v){u.x=(v.y-u.y)/(v.x-u.x);u.y=v.y-u.x*v.x;return u;}

Golfe:

typedef struct T{double x,y;}t;
t line(t u, t v){t z;z.x=(v.y-u.y)/(v.x-u.x);z.y=v.y-(z.x*v.x);return z;}

Fonte

typedef struct T{
    double x,y;
} t;

t line(t u, t v)
{
t z;
z.x=(v.y-u.y)/(v.x-u.x);
z.y=v.y-(z.x*v.x);
return z;
}
bacchusbeale
fonte
Vejo um espaço desnecessário;)
Martin Ender
11
Se for C ++, por que o typedef?
dyp 12/05
Além disso, acho que você pode se livrar de z:u.x=(v.y-u.y)/(v.x-u.x); u.y=v.y-z.x*v.x; return u;
dyp
1

Apple Swift 95 86

Esta pode ser a primeira entrada do Swift no PCG.SE ??

func L(x:Float...)->(Float,Float){var a=(x[3]-x[1])/(x[2]-x[0]);return(a,x[1]-a*x[0])}

Não vejo esse idioma como um grande sucesso para a comunidade do Code Golf.

Harry Beadle
fonte
0

Golfscript: 25 bytes

~:y\:x;-\x--1?*.x-1**y+\p

Como a função precisa ser denominada 'L', salvei-a como 'L.gs' localmente.

O problema, conforme explicado por @Dennis neste post , é que precisamos induzir o Golfscript a usar números racionais em vez de números inteiros. Portanto, isso funciona se você estiver disposto a aceitar informações X1 Y1 X2 Y2 na notação golfscript

# L( (0,0) , (1,1) )
echo "0 0 1 1" | golfscript L.gs
> 1/1
> 0/1
#L( (10,22.5) , (5,12.5) )
echo "10 22 2-1?+ 5 12 2-1?+" | golfscript L.gs
> 2/1
> 5/2
wrongu
fonte
0

Ruby - 48 caracteres

Quase idêntico à resposta JavaScript:

L=->u,v{a,b,c,d=*u,*v;[s=(d-b).fdiv(c-a),b-s*a]}
OI
fonte
0

Python3 - 64 57 bytes

def L(q,w):a=(q[1]-w[1])/(q[0]-w[0]);return a,q[1]-a*q[0]

Você pode reduzi-lo para 43 se não usar o Tuple, o que muitas pessoas estão fazendo ...

def L(x,y,q,w):a=(x-q)/(y-w);return a,y-a*x
Harry Beadle
fonte
return(a,q[1]-a*q[0])
User12205
@ace Obrigado, isso foi desleixado
Harry Beadle
0

PHP (75 caracteres)

function L($u,$v){return[$s=($v[1]-$u[1])/($v[0]-$u[0]),$v[1]-($s*$v[0])];}

teste : print_r(L([0,0],[7,1]));

resultado :

Array
(
    [0] => 0.14285714285714
    [1] => 0
)

(obrigado @ace)

Fabien Sa
fonte