Risolutore di funzioni lineari da due punti (x, y)


10

L'obiettivo

Scrivi una funzione L () che accetta due argomenti Tuple di coordinate nella forma (x, y) e restituisce la rispettiva funzione lineare nella forma (a, c), dove a è il coefficiente di x termine ec è l'intercetta y.

Si può presumere che l'ingresso non sarà una linea perpendicolare all'asse x e che i due ingressi siano punti separati.

punteggio 

Questo è Code Golf: vince il programma più breve.

Nota: nessun uso di funzioni matematiche a parte gli operatori di base (+, -, /, *).

Esempio

Ecco la mia soluzione senza golf in 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)

Produzione:

>>> 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)

4
L( (0,0) , (0,1) )?
Howard,

1
Si può presumere che l'ingresso non sia una linea parallela all'asse X.
Harry Beadle,

2
Si può presumere che l'ingresso non sia una linea parallela all'asse X. Intendi l'asse Y?
Howard,

Siamo spiacenti, la modifica del post è stata corretta, perpendicolare all'asse X.
Harry Beadle,

2
L((0,0),(0,0))?
user12205,

Risposte:


1

J - 23 char

Abbastanza semplice. Definisce un verbo diadico Lda usare come (x1,y1) L (x2,y2).

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

Spiegazione:

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

Esempi:

   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 byte

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

Definisce una macro in modo Ltale che (x 1 , y 1 , x 2 , y 2 ) debba essere inserito nello stack in quell'ordine prima di chiamare e, dopo aver chiamato L, (a, c) possa essere estratto dallo stack (nell'ordine inverso di ovviamente - è uno stack).

Testcase (salva come "linear.dc" ed esegui dc linear.dc):

[sysxly-rlx- / dlx * lyr-] sL # Definisce la macro L.

10 # Spingi x1 nello stack
22.5 # Spingi y1 nello stack
5 # Spingere x2 nello stack
12.5 # Spingere y2 nello stack

lLx # Chiama la macro L
f # Scarica lo stack

L'output è:

$ dc linear.dc 
2.5
2
$ 

Spiegazione della macro L:

  • sypop 2 per yregistrarti
  • sxpop x 2 per xregistrarti
  • lypush push y(y 2 )
  • -sottrai y 2 da y 1
  • rscambia (y 1 - y 2 ) e x 1 in pila
  • lxpush push x(x 2 )
  • -sottrai x 2 da x 1
  • /dividere (y 1 - y 2 ) per (x 1 - x 2 ) per ottenere il gradiente
  • d gradiente duplicato
  • lxpush push x(x 2 )
  • *moltiplicare (x 2 ) per gradiente
  • lypush push y(y 2 )
  • rscambia (y 2 ) e (x 2 * gradiente) in pila
  • -sottrai (x 2 * gradiente) da (y 2 )

1
Grazie, niente male. Ammetto di essere stato picchiato. ;)
Martin Ender,

1
@ m.buettner Ri-golf e ri-spiegato.
Trauma digitale

5

Haskell, 41 personaggi

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

Qui non c'è molto da golf. È praticamente ciò che scriveresti normalmente meno gli spazi bianchi.


4

Mathematica, 55 38 byte

Questo è stato sorprendentemente lungo (quei fastidiosi nomi di funzioni lunghe ...) EDIT: ha cambiato l'approccio per l'intercettazione degli assi (prendendo ispirazione dalla risposta dell'OP). Si scopre che calcolarlo direttamente non è stata l'idea più intelligente.

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

Usa come

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

Grazie a Mathematica puoi anche ottenere il risultato generale:

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

(Quest'ultimo esempio mostra come lo avevo implementato in origine.)

Solo per la cronaca

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

che è tecnicamente corretto.


Ahh, Fantastico, avevo un po 'di mente nera a capirlo, lo biasimerei per la mia stanchezza
Harry Beadle,

1
+1. Perché ComplexInfinitye non semplicemente vecchio Infinity? (Non conosco Mathematica)
Digital Trauma,

3
@DigitalTrauma Penso che sia perché, senza dire esplicitamente a Mathematica che può funzionare nei reali, assume sempre che lo spazio in questione sia un numero complesso, in modo da non gettare via soluzioni complesse di equazioni reali.
Martin Ender,

2

JavaScript, 62 48

Grazie a @Michael per averlo giocato con ES 6.

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

Vecchia versione:

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

Input di esempio:

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

Uscita campione:

[0.14285714285714285, 0]

Per il record:

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. Sono una specie di principiante di JS, quindi non sapevo che potevi farlo. Grazie.
user12205,

@ m.buettner Hai ragione ... Risolto
user12205

1
Ora tutte le risposte sono esattamente a dieci caratteri di distanza. : D
Martin Ender,

1
Awww. Il coniglietto è cambiato!
Giustino,

2

Python3 (51)

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

2

105 byte C #

Questa non è solo la funzione e verrà compilata completamente da sola. Avevo messo Llo Systemspazio dei nomi per abbreviare l'utilizzo, ma è meglio qualificarsi completamente e risparmiare sull'uso di uno spazio dei nomi. Salvate le parentesi. Anche un risparmio da return new z[]inreturn 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]};}}

È (c*a[0])necessario? Non riesci a eliminare quelle parentesi e a salvare 2 byte?
Kyle Kanos,

@KyleKanos Sì, grazie. Mentre c # non usa BODMAS, la moltiplicazione verrà effettuata per prima (penso).
Nathan Cooper,

Direi che devi includere la namespacedichiarazione o cambiarla in System.Single, affinché questa soluzione sia valida.
Tim S.

1

Lua 5.1.4: 66 64 byte

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

Esempio di utilizzo:

> 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)

Migliorato: grazie per i tuoi commenti.

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

golfed:

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

Vedo uno spazio non necessario;)
Martin Ender,

1
Se è C ++, perché il typedef?
dyp,

Inoltre, penso che puoi sbarazzarti di 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

Questa potrebbe essere la prima voce di Swift su 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])}

Non vedo questa lingua come un grande successo per la comunità di Code Golf.


0

Golfscript: 25 byte

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

Poiché la funzione deve essere denominata "L", l'ho salvata localmente come "L.gs".

Il problema, come spiegato da @Dennis in questo post , è che dobbiamo ingannare Golfscript nell'usare numeri razionali anziché interi. Quindi funziona se sei disposto ad accettare input X1 Y1 X2 Y2 nella notazione 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

Rubino - 48 caratteri

Quasi identico alla risposta JavaScript:

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

0

Python3 - 64 57 byte

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

Puoi farlo scendere a 43 se non usi Tuple, cosa che molte persone stanno facendo ...

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 Grazie, era sciatto
Harry Beadle

0

PHP (75 caratteri)

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

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

produzione :

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

(grazie @ace)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.