Solucionador de funciones lineales desde dos puntos (x, y)

10

La tarea

Escriba una función L () que tome dos argumentos Tuple de coordenadas en la forma (x, y), y devuelva sus respectivas funciones lineales en la forma (a, c), donde a es el coeficiente del término x y c es la intersección en y.

Puede suponer que la entrada no será una línea perpendicular al eje xy que las dos entradas son puntos separados.

Puntuación 

Este es Code Golf: el programa más corto gana.

Nota: no se utilizan funciones matemáticas aparte de los operadores básicos (+, -, /, *).

Ejemplo

Aquí está mi solución sin golf en 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)

Salida:

>>> 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
fuente
44
L( (0,0) , (0,1) )?
Howard
1
Puede suponer que la entrada no es una línea paralela al eje X.
Harry Beadle
2
Puede suponer que la entrada no es una línea paralela al eje X. ¿Te refieres al eje Y?
Howard
Lo sentimos, la edición en la publicación fue correcta, perpendicular al eje X.
Harry Beadle
2
L((0,0),(0,0))?
user12205

Respuestas:

1

J - 23 char

Bastante sencillo. Define un verbo diádico Lpara ser utilizado como (x1,y1) L (x2,y2).

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

Explicación:

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

Ejemplos:

   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
Algoritmo de tiburón
fuente
7

GNU dc , 30 24 bytes

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

Define una macro Ltal que (x 1 , y 1 , x 2 , y 2 ) se debe empujar a la pila en ese orden antes de llamar, y después de llamar L, (a, c) se puede extraer de la pila (en orden inverso de Por supuesto, es una pila).

Testcase (guardar como "linear.dc" y ejecutar dc linear.dc):

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

10 # Empuja x1 a la pila
22.5 # Empuje y1 a la pila
5 # Empuje x2 a la pila
12.5 # Empuje y2 a la pila

Macro LLx # Call L
f # Volcar la pila

Salida es:

$ dc linear.dc 
2.5
2
PS 

Explicación de la macro L:

  • sypop y 2 para yregistrarse
  • sxpop x 2 para xregistrarse
  • lyyregistro de inserción (y 2 )
  • -reste y 2 de y 1
  • rswap (y 1 - y 2 ) y x 1 en la pila
  • lxxregistro de inserción (x 2 )
  • -restar x 2 de x 1
  • /divide (y 1 - y 2 ) por (x 1 - x 2 ) para obtener el gradiente
  • d gradiente duplicado
  • lxxregistro de inserción (x 2 )
  • *multiplicar (x 2 ) por gradiente
  • lyyregistro de inserción (y 2 )
  • rintercambiar (y 2 ) y ( gradiente x 2 *) en la pila
  • -restar (x 2 * gradiente) de (y 2 )
Trauma digital
fuente
1
Gracias no esta mal. Admito haber sido golpeado. ;)
Martin Ender
1
@ m.buettner Re-golfed y re-explicado.
Trauma digital
5

Haskell, 41 personajes

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

No hay mucho para jugar golf aquí. Es más o menos lo que escribiría normalmente menos el espacio en blanco.

hammar
fuente
4

Mathematica, 55 38 bytes

Esto fue sorprendentemente largo (esos molestos nombres de funciones largas ...) EDITAR: Cambió el enfoque para la intercepción del eje (inspirándose en la propia respuesta del OP). Resulta que calcularlo directamente no era la idea más inteligente.

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

Usar como

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

Gracias a Mathematica también puede obtener el resultado general:

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

(Este último ejemplo muestra cómo lo implementé originalmente).

Para que conste

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

que es técnicamente correcto

Martin Ender
fuente
Ahh, increíble, tenía un poco de mente negra al descubrir eso, lo culpo por mi cansancio
Harry Beadle
1
+1. ¿Por qué ComplexInfinityy no simplemente viejo Infinity? (No sé Mathematica)
Trauma digital
3
@ DigitalTrauma Creo que es porque, sin decirle explícitamente a Mathematica que puede funcionar en reales, siempre asume que el espacio en cuestión son números complejos, para no tirar soluciones complejas de ecuaciones reales.
Martin Ender
2

JavaScript, 62 48

Gracias a @Michael por jugar golf con ES 6.

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

Versión antigua:

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

Entrada de muestra:

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

Salida de muestra:

[0.14285714285714285, 0]

Para el registro:

L([0,0],[0,1])
[Infinity, NaN]
usuario12205
fuente
46 usando ES6:L=(a,b)=>[g=(p=a[1]-b[1])/(q=a[0]-b[0]),p-g*q]
Michael M.
@Michael Cool. Soy una especie de novato de JS, así que no sabía que podías hacer eso. Gracias.
user12205
@ m.buettner Tienes razón ... Solucionado
user12205
1
Ahora todas las respuestas tienen exactamente diez caracteres de diferencia. : D
Martin Ender
1
Awww. ¡El conejito cambió!
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
fuente
2

C # 105 bytes

Esta no es solo la función y se compilará completamente por sí misma. Había puesto Len el Systemespacio de nombres para acortar el uso, pero es mejor calificar completamente y ahorrar en el uso de un espacio de nombres. Guardado los corchetes. También un ahorro de return new z[]enreturn 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
fuente
Es (c*a[0])necesario? ¿No puedes eliminar esos paréntesis y guardar 2 bytes?
Kyle Kanos
@KyleKanos Sí, gracias. Si bien C # no usa BODMAS, la multiplicación se realizará primero (creo).
Nathan Cooper
Diría que debe incluir la namespacedeclaración, o cambiarla System.Single, para que esta solución sea 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

Ejemplo 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
fuente
1

C ++ 88 (era 106)

Mejorado: gracias por tus comentarios.

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;}

Golfizado:

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;}

Fuente

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
fuente
Veo un espacio innecesario;)
Martin Ender
1
Si es C ++, ¿por qué typedef?
dyp
Además, creo que puede deshacerse 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 puede ser la primera entrada de Swift en PCG.

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

No veo que este lenguaje sea un gran éxito para la comunidad de Code Golf.

Harry Beadle
fuente
0

Golfscript: 25 bytes

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

Como la función debe llamarse 'L', la guardé como 'L.gs' localmente.

El problema, como lo explicó @Dennis en esta publicación , es que necesitamos engañar a Golfscript para que use números racionales en lugar de números enteros. Entonces esto funciona si está dispuesto a aceptar información X1 Y1 X2 Y2 en notación de 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
fuente
0

Ruby - 48 caracteres

Casi idéntico a la respuesta de JavaScript:

L=->u,v{a,b,c,d=*u,*v;[s=(d-b).fdiv(c-a),b-s*a]}
OI
fuente
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]

Puede bajarlo a 43 si no usa Tuple, que muchas personas están haciendo ...

def L(x,y,q,w):a=(x-q)/(y-w);return a,y-a*x
Harry Beadle
fuente
return(a,q[1]-a*q[0])
user12205
@ace Gracias, eso fue descuidado
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])];}

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

salida:

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

(gracias @ace)

Fabien Sa
fuente