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)

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

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 )

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.


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


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]

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

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

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

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

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.


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

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

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

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)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.