Oceń proporcje trójkąta

35

Biorąc pod uwagę trzy długości boczne trójkąta, oceń jego współczynnik proporcji AR na podstawie następującego wzoru:

wprowadź opis zdjęcia tutaj

gdzie

wprowadź opis zdjęcia tutaj

Im trójkąt jest bliższy równowadze, tym bliższy jest 1jego współczynnik kształtu. Współczynnik kształtu jest większy lub równy 1dla prawidłowych trójkątów.

Wejścia

Dane wejściowe to trzy rzeczywiste liczby dodatnie, które w razie potrzeby mogą być zawarte w liście lub czymkolwiek podobnym.

Twój program musi wypisywać tę samą wartość bez względu na kolejność wprowadzania trzech długości bocznych.

Te trzy liczby zawsze będą prawidłowymi długościami bocznymi trójkąta (zdegenerowane trójkąty, takie jak ta o długościach bocznych 1, 1i 2nie zostaną podane jako dane wejściowe). Nie musisz się martwić niedokładnościami liczb zmiennoprzecinkowych, gdy wartości stają się bardzo bliskie zdegenerowanemu trójkątowi (np. Dopuszczalne jest, że twój program popełnił błąd division by 0przy wprowadzaniu [1, 1, 1.9999999999999999]).

Dane wejściowe można podać STDINjako argument funkcji lub coś podobnego.

Wyjścia

Wynik jest liczbą rzeczywistą większą lub równą 1standardowej dokładności akceptowanej w Twoim języku.

Wyjście może być wydrukowane STDOUT, zwrócone z funkcji lub coś podobnego.

Przypadki testowe

Inputs                   Output

  1      1      1         1
  3      4      5         1.25
 42     42   3.14         ≈ 6.9476
 14      6     12         1.575
  6     12     14         1.575
0.5    0.6    0.7         ≈ 1.09375

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Fatalizować
źródło
NALEŻY s be (A + B + C) / 3 ?
costrom 28.11.16
3
@ costrom Nie, formuła jest poprawna. s jest semiperymetrem trójkąta . twoja formuła byłaby niezdefiniowana dla trójkąta równobocznego.
Fatalizuj
Czy mogę po prostu uzyskać zmiennoprzecinkowe dane wejściowe, czy też muszę również uzyskać liczby całkowite?
Erik the Outgolfer
@ErikGolfer エ リ ッ ク ゴ ル フ ァ ー Dopuszczalne jest wprowadzanie 42.0zamiast 42.
Fatalize
@Fatalize Thanks. Czy wszystkie dane wejściowe mogą być 0?
Erik the Outgolfer

Odpowiedzi:

19

Galaretka , 6 bajtów

Ta odpowiedź oparta jest na odpowiedzi Emabny 05AB1E . Ogromne podziękowania dla Dennisa i Lynn za pomoc w znalezieniu tej odpowiedzi. Zapraszamy do gry w golfa! Wypróbuj online!

S_Ḥ⁸÷P

Ungolfing

           Implicit argument [a, b, c].
S          Take the sum, a+b+c or 2*s
  Ḥ        Take the double, [2*a, 2*b, 2*c].
 _         Vectorized subtract, giving us [2*(s-a), 2*(s-b), 2*(s-c)].
   ⁸÷      Vectorized divide the initial left argument, the input [a, b, c],
             by [2*(s-a), 2*(s-b), 2*(s-c)].
     P     Take the product giving us the aspect ratio, abc/8(s-a)(s-b)(s-c).
Sherlock9
źródło
4
6 bajtów, a nadal chcesz sugestie dotyczące gry w golfa? :-D
Luis Mendo
1
@LuisMendo Jeśli to w ogóle możliwe, na pewno: D
Sherlock9
1
„Push” nie jest całkiem poprawną terminologią; Galaretka nie jest oparta na stosach. Zamiast tego ⁸÷zostaje odcięty od łańcucha jako jednostka i należy go odczytywać, dzieląc początkowy lewy argument przez to lub coś takiego.
Lynn
1
@ Lynn Gram w golfa Właściwie od kilku miesięcy. Terminologia oparta na stosie jest mocno osadzona w moim mózgu: D Powinien zostać naprawiony.
Sherlock9,
56

Galaretka , 7 bajtów

SH_÷@HP

Wypróbuj online!

Wyjaśnienie

enter image description here

Przeczytajmy ten łańcuch:

  • Domniemany argument to lista [a, b, c].

  • Najpierw czytamy S. Dzieje sumę: a + b + c.

  • Potem czytamy H. Ten połówki go: (a + b + c)/2. (To jest s.)

  • Następnie czytamy diadę _(odejmujemy), a następnie kolejną diadę. To jest haczyk : brakuje mu właściwego argumentu, więc otrzymuje argument do tego łańcucha [a, b, c], dając nam [s-a, s-b, s-c]. (Jest to piąty wzór łańcucha w tabeli tutaj .)

  • Następnie czytamy parę diad-monada ÷@H. To jest rozwidlenie : ÷@jest to podział z odrzuconymi argumentami i Hjest o połowę, więc nasza wartość robocza dostaje Hprzez to argument do tego łańcucha ÷. To wektoryzuje; zostaliśmy z [(a/2)/(s-a), (b/2)/(s-b), (c/2)/(s-c)]. (To jest drugi wzór łańcucha w tabeli tutaj .)

  • Wreszcie, zabieramy produkt P, zabierając nas abc/(8(s-a)(s-b)(s-c)).

Zobacz podobny do drzewa wykres, w jaki sposób łączą się linki.

Lynn
źródło
8
Obrazy wyglądają świetnie! Miły dotyk!
DavidC
2
Sam zmniejszyłem górny obraz, a drugi zamieniłem w link (nie zamierzam używać słów).
Lynn
Zobaczyłem obraz i natychmiast pomyślałem: „Niezła, Lynn!” zanim
zobaczę,
7
Najlepsze wyjaśnienie, jakie widziałem na temat programu Jelly. Nadal nie rozumiem, ale bliżej!
Sparr
Uruchomiłem próbkę w stosunku do przypadku testowego „6.0, 12.0,14.0” i dało to „-0.8888888888888888” zamiast 1,575, jak pokazano w przypadkach testowych. Czy to problem z testami lub twoim kodem?
MBaas,
13

Galaretka , 6 bajtów

S÷_2Pİ

Wypróbuj online!

Jak to działa

S÷_2Pİ  Main link. Argument: [a, b, c]

S       Sum; compute 2s := a + b + c.
 ÷      Divide; yield [2s ÷ a, 2s ÷ b, 2s ÷ c].
  _2    Subtract 2; yield [2s ÷ a - 2, 2s ÷ b - 2, 2s ÷ c - 2].
    P   Product; yield (2s ÷ a - 2)(2s ÷ b - 2)(2s ÷ c - 2).
     İ  Invert; yield 1 ÷ (2s ÷ a - 2)(2s ÷ b - 2)(2s ÷ c - 2).
Dennis
źródło
Ahh, i próbowałem wykorzystać ³⁴⁵jako argument ...
Erik the Outgolfer
11

JavaScript, 38 bajtów

To jest ( curry ) lambda:

a=>b=>c=>a*b*c/(b+c-a)/(a+c-b)/(a+b-c)

(Jeśli przypiszesz ją do zmiennej f, musisz ją nazwać jak f(3)(4)(5))

wada
źródło
Pobij mnie do tego przez kilka sekund :) Czy możesz wyjaśnić, jak formuła działa podobnie do tej podanej w pytaniu?
Kritixi Lithos
@KritixiLithos Wystarczy podłączyć s = 1/2(a+b+c)do formuły i uprościć: D (np. s-a = .5*b+.5*c-.5*aI trzy czynniki .5anulowania za pomocą 8)
flawr
5
(a,b,c)=>ma taką samą długość i kosztuje mniej bajtów;)
ETHprodukcje
4
Ale uwielbiam curry: D
flawr
9

05AB1E , 11 7 bajtów

05AB1E wykorzystuje kodowanie CP-1252 .

O¹·-¹/P

Wypróbuj online!

Wyjaśnienie

O         # sum input
 ¹        # push input again
  ·       # multiply by 2
   -      # subtract from sum
    ¹/    # divide by input
      P   # product
Emigna
źródło
8

MATL , 8 7 bajtów

tsGE-/p

Wypróbuj online!

Wyjaśnienie

[3 4 5]Jako przykład weźmy dane wejściowe

t    % Take input implicitly. Duplicate
     % STACK: [3 4 5], [3 4 5]
s    % Sum of array
     % STACK: [3 4 5], 12
G    % Push input again
     % STACK: [3 4 5], 12, [3 4 5]
E    % Multiply by 2, element-wise
     % STACK: [3 4 5], 12, [6 8 10]
-    % Subtract, element-wise
     % STACK: [3 4 5], [6 4 2]
/    % Divide, element-wise
     % STACK: [0.5 1 2.5]
p    % Product of array. Implicitly display
     % STACK: 1.25
Luis Mendo
źródło
8

R, 34 29 bajtów

x=scan();prod(x/(sum(x)-2*x))

Odczytuje dane wejściowe ze standardowego wejścia i przechowywać jako R-wektor x. Następnie skorzystaj z wektoryzacji R, aby utworzyć mianownik.

Billywob
źródło
7

Haskell, 36 bajtów

Definiuje funkcję, #która przyjmuje trzy argumenty.

(a#b)c=a*b*c/(b+c-a)/(a+c-b)/(a+b-c)

Musisz to nazwać w następujący sposób: (3#4)5

Trochę dłużej, ale być może bardziej golfowy:

p=product
f v=p v/p((sum v-).(2*)<$>v)
wada
źródło
6

MATLAB, 64 38 25 bajtów

Jest to jednoznaczna funkcja, która implementuje formułę podaną poniżej:

@(v)prod(v./(sum(v)-2*v))

Zakłada, że ​​dane wejściowe to lista trzech wartości, np [3,4,5]. Ten przykład został użyty w następującym objaśnieniu:

             sum(v)        = 3+4+5 = 12
             sum(v)-2*v    = 12 - 2*[3,4,5] = 12 - [6,8,10] = [6,4,2]
         v./(sum(v)-2*v))  = [3,4,5] ./ [6,4,2] = [0.5,1,2.5]
    prod(v./(sum(v)-2*v))  = 0.5 * 1 * 2.5 = 1.25
wada
źródło
6

Mathematica, 20 bajtów

1##&@@(#/(Tr@#-2#))&

Pobiera dane wejściowe jako listę trzech wartości, które są określane jako #wewnątrz funkcji. Tr@Jest to najkrótsza droga do sumowania listę (dostać 2s) i 1##&@@(...)mnoży trzech czynników i/(2s-2i)dla iw a, b, c.

Jeśli dane wejściowe są liczbami całkowitymi lub liczbami wymiernymi, otrzymasz dokładny wynik.

Martin Ender
źródło
5

OCaml, 51 bajtów

fun a b c->a*.b*.c/.(b+.c-.a)/.(a+.c-.b)/.(a+.b-.c)

Tak, oddzielne operatory dla pływaków ...

shooqie
źródło
5

Cud , 48 bajtów

@@@prod[#0#1#2/1- +#1#0#2/1- +#2#0#1/1- +#2#1#0]

ROZERWAĆ

Stosowanie:

(((@@@prod[#0#1#2/1* * - +#1#0#2- +#2#0#1- +#2#1#0])3)4)5

Wyjaśnienie

Wywołania funkcji są kosztowne w Wonder w porównaniu do operatorów infix w innych językach. Z tego powodu zawarłem wszystkie warunki w tablicy i otrzymałem wynik wyniku zamiast pomnożenia każdego terminu. Kod byłby równoważny do czegoś takiego jak:

(a,b,c)=>product([a,b,c,1/(b+c-a),1/(a+c-b),1/(a+b-c)])
Mama Fun Roll
źródło
1
Hmm, dlaczego „RIP”?
Luis Mendo
To znacznie dłużej, niż jest to konieczne / oczekiwane
Mama Fun Roll
5

Faktycznie , 10 8 bajtów

Ta odpowiedź jest oparta na doskonałej odpowiedzi Dennisa na żelki . Zapraszamy do gry w golfa! Wypróbuj online!

;Σ♀/♂¬πì

Ungolfing

     Implicit input [a, b, c].
;    Duplicate [a, b, c].
Σ    sum() to get twice the semiperimeter, 2*s.
♀/   Vectorized divide 2*s by [a, b, c] to get [2*s/a, 2*s/b, 2*s/c].
♂¬   Vectorized subtract 2 to get [2*s/a-2, 2*s/b-2, 2*s/c-2].
π    Get the product of the above to get 8*(s/a-1)*(s/b-1)*(s/c-1).
     This is the same as 8(s-a)(s-b)(s-c)/abc.
ì    Invert to get the aspect ratio, abc/8(s-a)(s-b)(s-c).
     Implicit return.
Sherlock9
źródło
5

Minecraft 1.8, 1607 bajtów + 85 bloków = 1692 blytów

Ostrzeżenie: Nie grał w golfa. Golfed będzie trwać do 1 / 3 mniej blytes.

Oto skomentowany zrzut ekranu:

enter image description here

  • Wejścia są a, bi c, a wyjście jestfin

  • fin, a wszystkie inne zmienne w Minecraft są liczbami całkowitymi, więc standardowa dokładność Minecraft wynosi 0 miejsc po przecinku

  • Zielona ramka: bloki poleceń po lewej aktywują się po blokach po prawej, które są tylko zmiennymi inicjalizacjami.

  • Dźwignia (szarobrązowy prostokąt w prawym dolnym rogu) to spust urządzenia

  • To zajmuje tak dużo ze względu na sposób, w jaki Minecraft obsługuje zmienne . Bardzo uproszczony przegląd:

    • /scoreboard objectives add name dummytworzy nową zmienną o nazwie „ name

    • /scoreboard players set @p name numberustawia zmienną namena number. Liczba musi być liczbą rzeczywistą, a nie zmienną.

    • /scoreboard players operation @p name += @p name2przyrosty nameo name2. name2musi być zmienną, a nie liczbą.

      • -=, /=, *=, =I inne mogą być stosowane zamiast +=, aby zmniejszyć pomnożyć, podzielić itp
  • Nie zamierzam tutaj publikować wszystkich 43 poleceń. Pomogłoby to w grę w golfa, ale również doprowadziłoby mnie do szaleństwa podczas kopiowania

  • Gdyby zastosowano bloki poleceń 1.9, rozwiązanie zużyłoby (przynajmniej) 42 bloki mniej. Gdyby zastosować zmienne jednoliterowe, zapisano by prawie 200 bajtów.

RudolfJelin
źródło
4

Java, 38 bajtów

(a,b,c)->a*b*c/(b+c-a)/(a-b+c)/(a+b-c)

Testowanie i nie golfista

public class Pcg101234 {
  interface F {
    double f(double a, double b, double c);
  }
  public static void main(String[] args) {
    F f = (a,b,c)->a*b*c/(b+c-a)/(a-b+c)/(a+b-c);

    System.out.println(f.f(1,1,1));
    System.out.println(f.f(3,4,5));
    System.out.println(f.f(42,42,3.14));
    System.out.println(f.f(14,6,12));
    System.out.println(f.f(6,12,14));
    System.out.println(f.f(0.5,0.6,0.7));
  }
}

Sprawdź to!

Wydajność

1.0
1.25
6.947606226693615
1.575
1.575
1.09375
Olivier Grégoire
źródło
Wydaje mi się, że (a,b,c)to trochę oszustwo, ponieważ nie zawiera żadnych informacji o typie. IMO niejawny interfejs lambda (w twoim przypadku F) powinien liczyć się w całkowitej sumie bajtów.
F. George
4
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Lambda są wysoce zalecane. Ponadto większość wpisów Java 8 działa w ten sposób bez żadnych uwag. Jeśli nie zgadzasz się i uważasz, że oszukiwałem, zapraszam do formalnego zapytania w meta, czy notacja ta jest akceptowana, czy nie. Tymczasem dostosowuję się do poprzednich odpowiedzi w Javie 8.
Olivier Grégoire
4

Meduza , 17 16 bajtów

Dzięki Zgarbowi za uratowanie 1 bajtu.

p%/*-)/+i
    2%

Wypróbuj online!

Wyjaśnienie

Jest to oparte na tej samej wzajemnej formule, co odpowiedź Dennisa .

W bardziej tradycyjnej notacji funkcjonalnej powyższy program brzmi następująco:

print(
  1 / fold(
    multiply,
    fold(add, i) / i - 2
  )
)

Gdzie ijest lista wejściowa. Pamiętaj, że fold(multiply, ...)po prostu oblicza produkt i fold(add, ...)sumę, dzięki czemu możemy dodatkowo uprościć to do:

print(1 / product(sum(i) / i - 2))

sum(i) / iJest realizowany poprzez haka )/+, który wyznacza nową funkcję jednoargumentowy do zrobienia zarówno czynności naraz.

Martin Ender
źródło
Zapisz bajt z hakiem .
Zgarb
4

Dyalog APL , 10 9 bajtów

×/⊢÷+/-+⍨

Jest to anonimowy ciąg funkcji (na szczycie rozwidlenia rozwidlenia rozwidlenia), co oznacza, że ​​każda podfunkcja jest stosowana do argumentu wewnątrz następującej struktury:

 ┌─┴─┐          
×/ ┌─┼───┐      
    ÷ ┌─┼──┐  
      +/ - +⍨

Wypróbuj APL online!

×/ produkt z

argumenty

÷ podzielony przez

+/ suma argumentów

- minus

+⍨ argumenty podwojone (dosł. dodane do siebie)

Tło matematyczne.

ngn ogolił bajt.

Adám
źródło
Cześć Adam, proszę. przypominam, żebym zapytał cię o „przyszły tydzień, jeśli zapomnę :-)
MBaas,
Nie wiem, jak link „w tle” rzekomo odnosi się do tej odpowiedzi, ponieważ nie widzę tam żadnego algorytmu. Czy możesz również dodać informacje o kolejności operacji? Próbowałem odtworzyć tę odpowiedź w kilku różnych językach z różną kolejnością operacji, ale zawsze otrzymuję odpowiedź inną niż ta w pytaniu.
kot
@cat Cóż, nie chodziło o podanie algorytmu, tylko o wyjaśnienie, jaki jest współczynnik kształtu, ponieważ na Wikipedii nie ma takiej strony. APL jest od prawej do lewej, co oznacza, że ​​każda funkcja przyjmuje za argument wszystko, co jest po prawej stronie. Dlatego można go czytać od lewej do prawej, jak w objaśnieniu.
Adám
3

dc, 49 bajtów

5k?dsa?dsb?dsc++2/sslalblc**lsla-lslb-lslc-8***/p

Bezpośrednie wdrożenie podanego wzoru. Monituje o trzy dane wejściowe po wywołaniu w trzech oddzielnych wierszach i wyświetla zmiennoprzecinkową wartość z 5 cyframi po przecinku do następnego wiersza.

Wyjaśnienie

5k                                                # Set the output precision to 5 digits after the decimal
  ?dsa                                            # Prompt for first input value on first line, duplicate it, and then store it in register `a`
      ?dsb                                        # Prompt for second input, duplicate it, and store it in register `b`
          ?dsc                                    # Prompt for third input, duplicate it, and store it in register `c`
              ++2/ss                              # Sum up the 3 values on the main stack, then divide sum by 2 and store the result in register `s`
                    lalblc**                      # Copy all three values from registers `a`,`b`,`c` onto the main stack, find their product, and push result to top of main stack
                            lsla-                 # Copy value from register `s` onto main stack, subtract register `a`'s value from it, and push result to main stack
                                 lslb-            # Copy value from register `s` onto main stack, subtract register `b`'s value from it, and push result to main stack
                                      lslc-       # Copy value from register `s` onto main stack, subtract register `c`'s value from it, and push result to main stack
                                           8***   # Find the product of the top three values and 8 and then push the result to main stack
                                               /p # Divide the second to top value (a*b*c) by the top of stack value (8*(s-a)*(s-b)*(s-c)), push the result to the main stack, and then output the result to STDOUT
R. Kap
źródło
3

TI-Basic, 11 bajtów

Dane wejściowe powinny mieć postać listy, np {A B C}.

prod(Ans)/prod(sum(Ans)-2Ans

Może ten obraz pomoże (pamiętaj o tym 2s = a+b+c):

      abc abc abc prod (Ans)
---------------- = --------------------- = ----------- -------- = -------------------
8 (sa) (sb) (sc) (2s-2a) (2s-2b) (2s-2c) (a + b + c) (1-2 {a, b, c}) prod (suma (Ans) -2Ans)
Timtech
źródło
2

Perl 6 , 44 bajtów

->\a,\b,\c{a*b*c/(b+c -a)/(a+c -b)/(a+b -c)}
Brad Gilbert b2gills
źródło
2

Python, 55 bajtów

def f(x,y,z):s=x+y+z;return 1/((s/x-2)*(s/y-2)*(s/z-2))

Podziękowania dla Dennisa . Właśnie przeniesiłem. W Pythonie, język bardzo zaniedbany.

Erik the Outgolfer
źródło
2

Dalej, 83 bajty

Zakłada, że ​​parametry zmiennoprzecinkowe zaczynają się na stosie zmiennoprzecinkowym. Pozostawia wynik na stosie zmiennoprzecinkowym. Używanie stosu do params / return jest standardem dla Forth.

: p 3 fpick ;
: T p p p ;
: f 0 s>f T f- f+ f- T f+ f- f* T f- f- f* 1/f f* f* f* ;

Wypróbuj online - zawiera wszystkie przypadki testowe

Korzysta ze wzoru a*b*c * 1/ ( -(a+b-c) * -(b+c-a) * (a+c-b) ). Prawie cały program używa tylko stosu zmiennoprzecinkowego. Wyjątkiem jest 3w 3 fpick. Ten program wymaga interpretera, który obsługuje fpick(Ideone działa, repl.it nie działa).

Wyjaśnienie: nieco mniej golfa

\ 3 fpick takes the 3rd element (0-indexed) and pushes a copy
\ Used to copy parameters on the stack over another number 'x' ( a b c x -> a b c x a b c )
: f3p 3 fpick 3 fpick 3 fpick ;

: f                     \ define a function f
0 s>f f3p f- f+ f-      \ push a zero, copy params, compute 0-(a+b-c)
                        \ the zero allows me to copy (I need an 'x' to jump over)
f3p f+ f- f*            \ copy params and compute -(b+c-a), multiply by previous result
                        \ the negatives miraculously cancel
f3p f- f- f*            \ copy and compute (a+c-b), multiply by previous result
1/f f* f* f* ;          \ take the reciprocal and multiply by a*b*c
                        \ the result is left on the floating point stack
mbomb007
źródło
2

Ised : 19 bajtów

@*$1/@*{@+$1-2.*$1}

Nazwać jako ised --l 'inputfile.txt' '@*$1/@*{@+$1-2.*$1}' gdzie inputfile.txtmogą być oddzielone w przestrzeni plików tablicy, albo -otrzymać od rury / standardowego wejścia.

Wersja Unicode (ta sama liczba bajtów, ale 3 znaki mniej):

Π$1/Π{Σ$1-2.*$1}

Niestety isedmarnuje wiele znaków na składnię argumentów wejściowych.

orion
źródło
2

vba, 76

Function r(a,b,c)
s=(a+b+c)/2:r=(a*b*c)/(8*(s-a)*(s-b)*(s-c))
End Function

Zadzwoń z

? r (3,4,5)

lub w Excelu

= r (5,12,13)

SeanC
źródło
Zaoszczędziłbyś 6 bajtów dzięki algorytmowi @ SuperJedi224:Public Function r(a,b,c):r=a*b*c/(b+c-a)/(a-b+c)/(a+b-c):End Function
steenbergh
2

C #, 82 bajty

void ar(double a,double b,double c)=>Console.Write(a*b*c/(b+c-a)/(a+c-b)/(a+b-c));

Stosowanie:

ar(42, 42, 3.14);
WeskerTyrant
źródło
2

k, 19 bajtów

{(*/x)%8*/-x-+/x%2}

Ocenia od prawej do lewej - Podziel listę x przez 2, zsumuj wynik i odejmij go od pierwotnego x. Pomiń odpowiedź i uzyskaj iloczyn wyniku i 8. Wynik jest mianownikiem, licznik jest iloczynem listy.

Paul Kerrigan
źródło
1

Lua, 45 bajtów

a,b,c=...print(a*b*c/(b+c-a)/(a+c-b)/(a+b-c))

Mocno oparty na odpowiedzi JavaScript.

Zrobiłem
źródło