Zadanie
Napisz funkcję L (), która pobiera dwa argumenty Tuple o współrzędnych w postaci (x, y) i zwraca ich odpowiednią funkcję liniową w postaci (a, c), gdzie a jest współczynnikiem x składnika i c jest punktem przecięcia y.
Możesz założyć, że wejście nie będzie linią prostopadłą do osi x oraz że dwa wejścia są osobnymi punktami.
Punktacja
To jest Code Golf: wygrywa najkrótszy program.
Uwaga: Nie używa się żadnych funkcji matematycznych oprócz podstawowych operatorów (+, -, /, *).
Przykład
Oto moje rozwiązanie bez gry w golfa w Pythonie.
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)
Wynik:
>>> 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)
L( (0,0) , (0,1) )
?L((0,0),(0,0))
?Odpowiedzi:
J - 23 char
Dość bezpośredni. Definiuje czasownik dynamiczny,
L
który będzie używany jako(x1,y1) L (x2,y2)
.Wyjaśnienie:
Przykłady:
źródło
GNU dc ,
3024 bajtówDefiniuje makro
L
takie, że (x 1 , y 1 , x 2 , y 2 ) należy wypchnąć na stos w tej kolejności przed wywołaniem, a po wywołaniuL
(a, c) może zostać wyskakujący ze stosu (w odwrotnej kolejności oczywiście - jest to stos).Testcase (zapisz jako „linear.dc” i uruchom
dc linear.dc
):Dane wyjściowe to:
Objaśnienie makra L:
sy
pop y 2, aby sięy
zarejestrowaćsx
pop x 2, aby sięx
zarejestrowaćly
y
rejestr push (y 2 )-
odejmij y 2 od y 1r
zamień (y 1 - y 2 ) i x 1 na stosielx
x
rejestr push (x 2 )-
odejmij x 2 od x 1/
podziel (y 1 - y 2 ) przez (x 1 - x 2 ), aby uzyskać gradientd
zduplikowany gradientlx
x
rejestr push (x 2 )*
pomnóż (x 2 ) przez gradiently
y
rejestr push (y 2 )r
zamień (y 2 ) i (x 2 * gradient) na stosie-
odejmij ( gradient x 2 *) od (y 2 )źródło
Haskell, 41 znaków
Tutaj nie ma wiele do golfa. Jest to w zasadzie to, co piszesz normalnie bez białych znaków.
źródło
Mathematica,
5538 bajtówTo było zaskakująco długie (te nieznośne długie nazwy funkcji ...)EDYCJA: Zmieniłem podejście do przechwytywania osi (czerpiąc inspirację z własnej odpowiedzi PO). Okazuje się, że bezpośrednie obliczenie tego nie było najmądrzejszym pomysłem.Użyj jak
Dzięki Mathematica możesz również uzyskać ogólny wynik:
(Ten ostatni przykład pokazuje, jak pierwotnie to zaimplementowałem).
Dla przypomnienia
co jest technicznie poprawne.
źródło
ComplexInfinity
nie staryInfinity
? (Nie wiem Mathematica)JavaScript,
6248Dzięki @Michael za grę w golfa w ES 6.
Stara wersja:
Przykładowe dane wejściowe:
Przykładowe dane wyjściowe:
Dla przypomnienia:
źródło
L=(a,b)=>[g=(p=a[1]-b[1])/(q=a[0]-b[0]),p-g*q]
Python3 (51)
źródło
C # 105 bajtów
To nie jest tylko funkcja i skompiluje się całkowicie samodzielnie. I włożył
L
wSystem
przestrzeni nazw skrót do użycia, ale lepiej jest w pełni się zakwalifikować i zaoszczędzić na używaniu przestrzeni nazw. Zapisano nawiasy. Także z oszczędnościreturn new z[]
wreturn new[]
źródło
(c*a[0])
konieczne? Nie możesz wyeliminować tych nawiasów i zaoszczędzić 2 bajty?namespace
deklarację lub zmienić ją naSystem.Single
, aby to rozwiązanie było ważne.Lua 5.1.4:
6664 bajtówPrzykładowe użycie:
źródło
C ++ 88 (było 106)
Ulepszony: dzięki za komentarze.
Gra w golfa:
Źródło
źródło
typedef
?z
:u.x=(v.y-u.y)/(v.x-u.x); u.y=v.y-z.x*v.x; return u;
Apple Swift
9586To może być pierwszy wpis Swift na PCG.SE?
Nie widzę, aby ten język był wielkim hitem dla społeczności Code Golf.
źródło
Golfscript: 25 bajtów
Ponieważ funkcja musi mieć nazwę „L”, zapisałem ją lokalnie jako „L.gs”.
Złap, jak wyjaśniono w @Dennis w tym poście , polega na tym, że musimy oszukać Golfscript, aby używał liczb wymiernych zamiast liczb całkowitych. Działa to, jeśli chcesz zaakceptować dane wejściowe
X1 Y1 X2 Y2
w notacji golfowejźródło
Ruby - 48 znaków
Prawie identyczna z odpowiedzią JavaScript:
źródło
Python3 -
6457 bajtówMożesz zmniejszyć go do 43, jeśli nie używasz Tuple, co robi wiele osób ...
źródło
return(a,q[1]-a*q[0])
PHP (75 znaków)
test:
print_r(L([0,0],[7,1]));
wynik :
(dzięki @ace)
źródło