Aufgabe: Finden Sie für die Fläche eines Dreiecks ein heronisches Dreieck mit dieser Fläche. Jedes heronische Dreieck mit der angegebenen Fläche ist zulässig.
Ein Heronianisches Dreieck ist ein Dreieck mit ganzzahligen Seiten und einer ganzzahligen Fläche . Nach der Formel von Heron hat ein Dreieck mit Seitenlängen a,b,c
eine Fläche
sqrt(s*(s-a)*(s-b)*(s-c))
wo s=(a+b+c)/2
ist der halbe Umfang des Dreiecks. Dies kann auch als geschrieben werden
sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)) / 4
Wenn kein solches Dreieck vorhanden ist, wird mit einem konsistenten Falsey-Wert ausgegeben.
Eingabe: Eine einzelne positive Ganzzahl, die die Fläche des Dreiecks darstellt.
Ausgabe: Beliebige drei Seitenlängen für ein solches Dreieck ODER ein falscher Wert.
Beispiele:
Input -> Output
6 -> 3 4 5
24 -> 4 15 13
114 -> 37 20 19
7 -> error
Dies ist Code Golf, die kürzeste Antwort in Bytes gewinnt.
Antworten:
Jelly ,
1716 Bytes-1 Byte danke an Erik den Outgolfer (benutze den Quick,
¥
)Brute-Force-Anwendung der Heron-Formel.
Probieren Sie es online! (Erreicht das 60er-Zeitlimitfür den 114-Testfall. Nimmt 3m 30s vor Ort inAnspruch- überprüft 114 3 = 1.481.544 Dreifache)
Wie?
Eine echte Golflösung - in einem bestimmten Gebiet
a
findet sie alle Tupel mit drei ganzen Zahlen zwischen1
unda
(auch bei wiederholten Dreiecken und solchen ohne Fläche), erhält ihre Fläche und filtert sie nach denjenigen mit der gewünschten Fläche (es hört nicht einmal auf, sobald Wenn eines gefunden wird, pflügt es durch alle und zeigt das erste Ergebnis an. Renditen,0
wenn keine vorhanden sind.quelle
ç
mitÇ⁼¥
und die zweite Zeile vollständig entfernen.JavaScript (ES7),
10910210098 ByteGibt entweder ein Array mit 3 Ganzzahlen oder zurück
false
. Wie die Gelee-Antwort zwingt dies Herons Formel brachial.Testfälle
Code-Snippet anzeigen
Rekursive Version, 83 Bytes
Gibt ein Array mit 3 Ganzzahlen zurück oder löst einen Rekursionsfehler aus. Leider funktioniert es nur bei kleinen Eingaben.
Demo
Code-Snippet anzeigen
quelle
Haskell , 69 Bytes
Probieren Sie es online!
Gibt einen Singleton aus einer Liste von drei Dreieckseiten wie aus
[[3.0,4.0,5.0]]
. Unmögliche Eingaben geben[]
. Nur technischFalse
ist Falsey nur für Haskell, aber da Haskell alle möglichen Ausgaben des gleichen Typs benötigt, kann es nicht verwendet werden. Wenn ein Fehler als Falsey verwendet werden könnte,[...]!!0
würden über 3 Bytes gesparttake 1[..]
.Versucht alle dreifachen
t
möglichen Seitenlängen von1
bis zum Bereicha
. Die Formel von Heron wird verwendet, um zu überprüfen, ob der Bereich über "(s-0)(s-x)(s-y)(s-z)==a*a
wheres=(x+y+z)/2
is" übereinstimmtsum t/2
. Das Produkt(s-0)(s-x)(s-y)(s-z)
wird alsproduct
mit Elementen aus ausgedrückt0:t
, dh das Dreifache sowie 0.quelle
F #,
170156152 BytesProbieren Sie es online!
"Ungolfed"
Wenn keine Ergebnisse gefunden werden, schlägt das Programm fehl. Wenn dies nicht gewünscht ist, muss ich
List.find
entweder ersetzenList.filter
(+2 Bytes) was eine leere Liste erzeugt, falls nichts gefunden wird, oderList.tryFind
(+3 Bytes), und None zurückgeben, falls kein Dreieck gefunden wurde.Ich finde immer, dass eine Golf-F # -Version noch vernünftig lesbar ist.
quelle
System.Math.Sqrt
und den resultierenden Wert mit vergleichenA * A
.1.0..A [...] 1.0..A [...] 1.0..A
durch1.0..A [...] a..A [..] b..A
sollte Ihnen ein paar Bytes sparen und Sie ein wenig beschleunigen (wenn es funktioniert; ich habe nur sehr wenig F # -Erfahrung).Python 2 (PyPy) ,
131123118 BytesProbieren Sie es online!
Dies funktioniert zwar auch mit CPython, PyPy ist jedoch viel schneller und kann das Dreieck für 114 im Zeitlimit von TIO berechnen.
Timings von meiner Maschine:
quelle
Pyth - 23 Bytes
Womit ein wahrer / falscher Wert ausgegeben wird, oder
Das druckt alle möglichen Lösungen aus und ist für große Eingaben furchtbar langsam. Setzen Sie 'h' an den Anfang, um nur eines zu drucken.
Erläuterung:
Versuch es
quelle
Perl 6 , 54 Bytes
Brute-Force-Suche aller möglichen Seiten bis zu einer Seite weniger als
a
dem Eingabebereich.^a
ist der Zahlenbereich von 0 bisa - 1
.[X] ^a xx 3
reduziert durch Kreuzprodukt drei Kopien dieses Bereichs und erzeugt alle Tripletts von(0, 0, 0)
bis(a - 1, a - 1, a - 1)
.first
Triplett so, dass die Fläche des Dreiecks mit diesen Seitena
nach der Formel von Heron gleich ist .Innerhalb des Codeblocks gegeben an
first
:$_
ist das Triplett. Nennen Sie es(x, y, z)
hier.(0,|$_)
ist die gleiche Triplett aber mit0
vorangestellt:(0, x, y, z)
..sum / 2
ist die Hälfte des Umfangs (eine Größe, dies
im üblichen Ausdruck der Heronschen Formel genannt wird)..sum / 2 «-« (0, |$_)
ist der Subtraktions-Hyperoperator mits
links und(0, x, y, z)
rechts, der gibt(s - 0, s - x, s - y, s - z)
.[*]
Dann wird das Quadruplett durch Multiplikation reduziert, wobei das Quadrat der Fläche erhalten wird.a * a ==
Sucht nach einer quadratischen Fläche, die dem Quadrat der angegebenen Fläche entspricht.Wird kein Triplett gefunden, wird
Nil
(was falsch ist) zurückgegeben.quelle
Haskell , 76 Bytes
Dies gibt eine Liste von Listen mit allen möglichen Integralgrößen aus, die den korrekten Bereich durch Brute Force erzeugen (Ausgabe der leeren Liste, falls keine vorhanden sind). Die Einschränkung ist, dass sie aufgrund dieser Unterteilung in der Mitte als Doppel ausgegeben werden, ihr Bruchteil jedoch immer 0 ist.
Wenn Sie aus irgendeinem Grund das nicht ertragen können,
Dies wird Ausgang die Antworten als eine Liste von Listen für die ganze Zahl
8977 Bytes insgesamt oder131 zusätzliches Byte. (Danke an Neil)Wenn Sie nur das erste Element brauchen / wollen
!!0
, erhalten Sie nur das erste Element, wenn es Zahlen gibt, die zutreffen, und einen Fehler, wenn es keine für 3 weitere Bytes gibt, undtake 1
am Anfang wird das erste Element genommen, ohne dass ein Fehler auftritt 6 weitere Bytes.Probieren Sie es online!
quelle
TI-Basic,
70 bis69 ByteZeigt die drei Seitenlängen an, wenn ein Dreieck vorhanden ist, und gibt einen Syntaxfehler aus, wenn dies nicht der Fall ist (dank der
/
am Ende).-1 Byte dank Seans Kommentar zu einer anderen Antwort
quelle
Mathematica, 77 Bytes
mit der mathematischen Lösung
Mathematica, 117 Bytes
rohe Gewalt
quelle
Area@SSSTriangle[a,b,c]
.Eigentlich 22 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Casio Basic, 123 Bytes
Standard-Brute-Force-Lösung. 122 Byte für den Code, 1 Byte
n
als Parameter anzugeben .quelle
Wolfram Language (Mathematica) , 59 Bytes
Probieren Sie es online!
quelle