Розв’язувач лінійної функції з двох точок (x, y)


10

Завдання

Напишіть функцію L (), яка приймає два аргументи кортежа координат у формі (x, y) і повертає їх відповідну лінійну функцію у вигляді (a, c), де a - коефіцієнт x члена і c є y-перехоплення.

Можна припустити, що вхід не буде прямою, перпендикулярною осі x, і що два входи є окремими точками.

Оцінка балів 

Це Code Golf: виграє найкоротша програма.

Зверніть увагу: Немає використання жодних математичних функцій, крім основних операторів (+, -, /, *).

Приклад

Ось моє рішення без гольфу в 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)

Вихід:

>>> 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) )?
Говард

1
Можна припустити, що вхід не є лінією, паралельною осі X.
Гаррі Бісл

2
Можна припустити, що вхід не є лінією, паралельною осі X. Ви маєте на увазі вісь Y?
Говард

Вибачте, редагування публікації було правильним, перпендикулярним до осі X.
Гаррі Бісер

2
L((0,0),(0,0))?
користувач12205

Відповіді:


1

J - 23 char

Досить прямо. Визначає дієслово Lз діадією, яке слід використовувати як (x1,y1) L (x2,y2).

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

Пояснення:

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

Приклади:

   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 байт

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

Визначає макрос Lтаким, що (x 1 , y 1 , x 2 , y 2 ) перед викликом слід натиснути на стек у такому порядку, а після виклику L, (a, c) може вискочити зі стека (у зворотному порядку звичайно - це стек).

Тестовий зразок (збережіть як "linear.dc" та запустіть dc linear.dc):

[sysxly-rlx- / dlx * lyr-] sL # Визначення макросу L

10 # Натисніть x1 до стеку
22.5 # Натисніть y1 до стеку
5 # Натисніть на х2 до стека
12.5 # Натисніть y2 до стеку

lLx # Макрос виклику L
f # скиньте стек

Вихід:

$ dc linear.dc 
2.5
2
$ 

Пояснення макросу L:

  • sypop y 2 для yреєстрації
  • sxpop x 2 для xреєстрації
  • lypush- yрегістр (y 2 )
  • -віднімаємо y 2 від y 1
  • rswap (y 1 - y 2 ) і x 1 на стеці
  • lxpush- xрегістр (х 2 )
  • -віднімаємо х 2 від х 1
  • /ділимо (y 1 - y 2 ) на (x 1 - x 2 ), щоб отримати градієнт
  • d дублікат градієнта
  • lxpush- xрегістр (х 2 )
  • *помножити (x 2 ) на градієнт
  • lypush- yрегістр (y 2 )
  • rswap (y 2 ) та (x 2 * градієнт) на стеці
  • -відняти ( градієнт х 2 *) від (y 2 )

1
Дякую, непогано. Я визнаю, що мене били. ;)
Мартін Ендер

1
@ m.buettner Повторно гольфував і повторював.
Цифрова травма

5

Хаскелл, 41 персонаж

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

Тут не так багато для гольфу. Це майже те, що ви б писали зазвичай мінус пробіл.


4

Математика, 55 38 байт

Це було напрочуд довго (ці прикрі довгі назви функцій ...) EDIT: Змінено підхід для перехоплення осі (взявши деяке натхнення з власної відповіді ОП). Виявляється, обчислення його безпосередньо було не найрозумнішою ідеєю.

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

Використовуйте як

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

Завдяки Mathematica ви також можете отримати загальний результат:

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

(Цей останній приклад показує, як я це спочатку реалізував.)

Просто для запису

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

що технічно правильно.


Ах, чудовий, у мене було трохи розуму, розібравшись у цьому, я буду звинувачувати це в своїй втомі
Гаррі Бісл

1
+1. Чому ComplexInfinityі не простий старий Infinity? (Я не знаю Mathematica)
Цифрова травма

3
@DigitalTrauma Я думаю, що це тому, що, не кажучи явно Mathematica, що вона може працювати в реалах, завжди передбачає, що простір, про який йде мова, є складними числами, щоб не викидати складні рішення реальних рівнянь.
Мартін Ендер

2

JavaScript, 62 48

Завдяки @Michael за те, що він пограв у ES 6.

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

Стара версія:

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

Зразок введення:

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

Вибірка зразка:

[0.14285714285714285, 0]

Для запису:

L([0,0],[0,1])
[Infinity, NaN]

46 за допомогою ES6:L=(a,b)=>[g=(p=a[1]-b[1])/(q=a[0]-b[0]),p-g*q]
Майкл М.

@Michael Cool. Я є новачком JS, тому я не знав, що ти можеш це зробити. Дякую.
користувач12205

@ m.buettner Ви маєте рацію ... Виправлено
користувач12205

1
Тепер усі відповіді рівно десять символів. : D
Мартін Ендер

1
Awww Зайчик змінився!
Джастін


2

C # 105 байт

Це не лише функція, і вона повністю складе самостійно. Я вклав Lу Systemпростір імен, щоб скоротити використання, але краще повністю кваліфікуватись та заощадити на використанні простору імен. Збережено дужки. Також економія return new z[]зсерединиreturn 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])потрібно? Ви не можете усунути ці дужки і зберегти 2 байти?
Кайл Канос

@KyleKanos Так, спасибі Поки c # не використовує BODMAS, множення буде зроблено спочатку (я думаю).
Натан Купер

Я б сказав, що ви повинні включити namespaceдекларацію або змінити її System.Single, щоб це рішення було дійсним.
Тім С.

1

Lua 5.1.4: 66 64 байт

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

Приклад використання:

> 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 (було 106)

Покращено: дякую за ваші коментарі.

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

Гольф:

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

Джерело

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

Я бачу зайвий простір;)
Мартін Ендер

1
Якщо це C ++, то чому typedef?
dyp

Крім того , я думаю , ви можете позбутися від 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

Це може бути перша запис Swift на 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])}

Я не вважаю, що ця мова є величезним ударом для спільноти Code Golf.


0

Гольфскрипт: 25 байт

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

Оскільки функцію потрібно назвати "L", я зберег її локально як "L.gs".

Улов, як пояснив @Dennis в цій публікації , полягає в тому, що нам потрібно обманути Гольфскрипт використовувати раціональні числа замість цілих чисел. Отже, це працює, якщо ви готові прийняти інформацію X1 Y1 X2 Y2 в нотації 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

Рубін - 48 символів

Практично ідентичний відповіді на JavaScript:

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

0

Python3 - 64 57 байт

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

Ви можете зменшити його до 43, якщо ви не використовуєте Tuple, що багато людей роблять ...

def L(x,y,q,w):a=(x-q)/(y-w);return a,y-a*x

return(a,q[1]-a*q[0])
користувач12205

@ace Спасибі, це було неохайно
Гаррі Бісл

0

PHP (75 символів)

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

тест: print_r(L([0,0],[7,1]));

вихід:

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

(спасибі @ace)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.