Zadanie: Biorąc pod uwagę obszar trójkąta, znajdź trójkąt Heroński z tym obszarem. Dowolny trójkąt heroński o określonym obszarze jest dozwolony.
Trójkąt Heroński to trójkąt z bokami liczb całkowitych i obszarem liczb całkowitych . Według wzoru Herona trójkąt o długości boków a,b,c
ma powierzchnię
sqrt(s*(s-a)*(s-b)*(s-c))
gdzie s=(a+b+c)/2
jest połowa obwodu trójkąta. Można to również zapisać jako
sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)) / 4
Jeśli taki trójkąt nie istnieje, dane wyjściowe mają stałą wartość falsey.
Dane wejściowe: Pojedyncza dodatnia liczba całkowita reprezentująca obszar trójkąta.
Wyjście: dowolne trzy długości boków dla takiego trójkąta LUB fałszywa wartość.
Przykłady:
Input -> Output
6 -> 3 4 5
24 -> 4 15 13
114 -> 37 20 19
7 -> error
To jest kod golfowy, wygrywa najkrótsza odpowiedź w bajtach.
Odpowiedzi:
Galaretka ,
1716 bajtów-1 bajt dzięki Erikowi outgolferowi (skorzystaj z szybkiego,
¥
)Zastosowanie formuły Herona metodą brutalnej siły.
Wypróbuj online! (osiągalimit60 lat dla przypadku testu 114. Zajmuje lokalnie 3m 30s - sprawdza 114 3 = 1 481 544 trójek)
W jaki sposób?
Prawdziwe rozwiązanie do gry w golfa - biorąc pod uwagę obszar
a
, znajduje wszystkie krotki trzech liczb całkowitych pomiędzy1
ia
(nawet z powtarzającymi się trójkątami i te bez obszaru), pobiera ich obszar i filtruje dla tych z pożądanym obszarem (nawet nie zatrzymuje się, gdy tylko jeden zostaje znaleziony, przebija je wszystkie i potem wyskakuje pierwszy wynik) Daje,0
jeśli nie istnieje.źródło
ç
zÇ⁼¥
i zdjąć drugą linię w całości.JavaScript (ES7),
10910210098 bajtówZwraca tablicę 3 liczb całkowitych lub
false
. Podobnie jak odpowiedź Jelly , jest to brutalne wymuszanie formuły Herona.Przypadki testowe
Pokaż fragment kodu
Wersja rekurencyjna, 83 bajty
Zwraca tablicę 3 liczb całkowitych lub zgłasza błąd rekurencji. Niestety działa tylko w przypadku niewielkich nakładów.
Próbny
Pokaż fragment kodu
źródło
Haskell , 69 bajtów
Wypróbuj online!
Generuje singleton listy trzech trójkątów takich jak
[[3.0,4.0,5.0]]
. Niemożliwe dane wejściowe dają[]
. TechnicznieFalse
jest to tylko Falsey dla Haskell, ale ponieważ Haskell wymaga, aby wszystkie możliwe dane wyjściowe były tego samego typu, nie można go użyć. Jeśli błąd może być użyty jako Falsey,[...]!!0
zaoszczędziłby 3 bajtytake 1[..]
.Próbuje wszystkich trzech
t
możliwych długości boków, począwszy od1
obszarua
. Formuła Herona służy do sprawdzania, czy obszar pasuje przez(s-0)(s-x)(s-y)(s-z)==a*a
gdzies=(x+y+z)/2
jestsum t/2
. Produkt(s-0)(s-x)(s-y)(s-z)
jest wyrażany jakoproduct
z elementami wziętymi z0:t
, tj. Potrójny, a także 0.źródło
F #,
170156152 bajtówWypróbuj online!
„Niegolfowany”
Jeśli nie zostaną znalezione żadne wyniki, program się zepsuje. Jeśli nie jest to pożądane, muszę zamienić
List.find
naList.filter
(+2 bajty), które utworzą pustą listę w przypadku, gdy nic nie zostanie znalezione, lubList.tryFind
(+3 bajty), zwracając Brak w przypadku braku trójkąta.Zawsze uważam, że golfowa wersja F # jest nadal dość czytelna.
źródło
System.Math.Sqrt
i porównać wynikową wartośćA * A
?1.0..A [...] 1.0..A [...] 1.0..A
przez1.0..A [...] a..A [..] b..A
powinno zaoszczędzić kilka bajtów i nieco przyspieszyć (jeśli to działa; Mam bardzo minimalne doświadczenie w F #).Python 2 (PyPy) ,
131123118 bajtówWypróbuj online!
Chociaż działa to również na CPython, PyPy jest znacznie szybszy i jest w stanie obliczyć trójkąt dla 114 w limicie czasu na TIO.
Czasy z mojej maszyny:
źródło
Pyth - 23 bajty
Który drukuje wartość prawda / fałsz, lub
który drukuje wszystkie możliwe rozwiązania i jest strasznie wolny przy dużych nakładach. Wpisz „h” na początku, aby wydrukować tylko jeden.
Wyjaśnienie:
Spróbuj
źródło
Perl 6 , 54 bajtów
Brute force szukaj wszystkich możliwych stron do jednego mniej niż
a
obszar wejściowy.^a
to zakres liczb od 0 doa - 1
.[X] ^a xx 3
zmniejsza, w zależności od produktu, trzy kopie tego zakresu, tworząc wszystkie trojaczki od(0, 0, 0)
do(a - 1, a - 1, a - 1)
.first
trojaczki tak, aby pole trójkąta z tymi bokami było równea
, z wykorzystaniem wzoru Herona .W obrębie bloku kodu podanego dla
first
:$_
jest trojaczką. Nazwij to(x, y, z)
tutaj.(0,|$_)
jest taka sama, ale tryplet0
poprzedzany:(0, x, y, z)
..sum / 2
jest połową obwodu (ilość, która jest nazywanas
w zwykłym wyrażeniu wzoru Herona)..sum / 2 «-« (0, |$_)
hiperoperator odejmowania zs
po lewej i(0, x, y, z)
po prawej stronie, daje(s - 0, s - x, s - y, s - z)
.[*]
następnie zmniejsza ten kwadruplet z pomnożeniem, dając kwadrat obszaru.a * a ==
szuka kwadratu równego kwadratowi danego obszaru.Jeśli nie zostanie znaleziony triplet,
Nil
(który jest falsey) jest zwracany.źródło
Haskell , 76 bajtów
Spowoduje to wyświetlenie listy list zawierającej wszystkie możliwe całkowite rozmiary, które generują poprawny obszar za pomocą brutalnej siły (generując pustą listę, jeśli nie ma). Zastrzeżenie polega na tym, że powoduje ich podwojenie z powodu tego podziału na środku, ale ich część ułamkowa jest zawsze równa 0.
Jeśli z jakiegoś powodu nie możesz tego znieść,
Spowoduje to wyświetlenie odpowiedzi w postaci listy liczb całkowitych dla
8977 bajtów łącznie lub131 dodatkowych bajtów. (Dzięki Neil)Jeśli potrzebujesz / chcesz tylko pierwszego elementu, po prostu umieszczenie go
!!0
na końcu da ci tylko pierwszy element, jeśli są liczby, które mają zastosowanie, i błąd, jeśli nie będzie żadnych 3 kolejnych bajtów, atake 1
na początku zabierze pierwszy element bez pomyłki dla Jeszcze 6 bajtów.Wypróbuj online!
źródło
TI-Basic,
7069 bajtówWyświetla trzy długości boków, jeśli jest trójkąt, zgłasza błąd składniowy, jeśli go nie ma (dzięki
/
na końcu).-1 bajt dzięki komentarzowi Seana do innej odpowiedzi
źródło
Mathematica, 77 bajtów
z Mathematica's Solve
Mathematica, 117 bajtów
brutalna siła
źródło
Area@SSSTriangle[a,b,c]
.Właściwie 22 bajty
Wypróbuj online!
Wyjaśnienie:
źródło
Casio Basic, 123 bajty
Standardowe rozwiązanie brutalnej siły. 122 bajty dla kodu, 1 bajt do określenia
n
jako parametr.źródło
Wolfram Language (Mathematica) , 59 bajtów
Wypróbuj online!
źródło