Es ist Zeit, Ihre alten Trigonometrie-Notizen von der High School zu sammeln! Die Herausforderung besteht darin, die unbekannten Seiten und Winkel verschiedener Dreiecke zu lösen. Und wie im Codegolf üblich, gewinnt der kleinste Arbeitscode.
Dies ist kein triviales Problem. Meine Referenzimplementierung in Python ist derzeit auf 838 837 Zeichen beschränkt, aber ich bin sicher, dass Sie in der Lage sind, Lösungen zu entwickeln, die viel kleiner sind.
Wenn Sie nicht weiterkommen, hilft Ihnen dieser Abschnitt auf Wikipedia außerdem weiter: Dreieck: Berechnen der Seiten und Winkel .
Eingang
Das folgende Dreieck zeigt die Namen der Seiten und Winkel, die bei dieser Herausforderung verwendet wurden. Beachten Sie, dass die Seiten in Kleinbuchstaben und die Winkel in Großbuchstaben geschrieben sind.
Die Eingabe erfolgt als sechs durch Leerzeichen getrennte Werte, entweder in stdin
oder als Befehlszeilenargumente (Ihre Wahl). Die sechs Werte entsprechen den Seiten a, b, c
und den Winkeln A, B, C
. Die unbekannten Seiten werden als Fragezeichen ( ?
) angegeben. Sowohl der Eingangs- als auch der Ausgangswinkel müssen im Bogenmaß angegeben werden. Sie können davon ausgehen, dass die Eingabewerte korrekt sind (Sie müssen nichts validieren). Sie können auch davon ausgehen, dass das Eingabedreieck nicht entartet ist und dass alle Seiten und Winkel ungleich Null sind.
Das folgende Beispiel Eingabe sagt Ihnen , dass Seite a
ist 8
, Seite b
ist 12
und der Winkel A
ist 0.5
Radiant:
8 12 ? 0.5 ? ?
Ausgabe
Die Ausgabe erfolgt im gleichen Format wie die Eingabe - sechs durch Leerzeichen getrennte Zahlen an stdout
. Die einzige Ausnahme ist, wenn es nicht möglich ist, das Eingabedreieck zu lösen - dann "No solution"
muss in die Zeichenfolge geschrieben werden stdout
. Wenn zwei Lösungen möglich sind, werden beide mit einem Zeilenumbruch ausgegeben.
Es folgt die Ausgabe für die obige Eingabe:
8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714
Die Ausgabe muss nicht sehr genau sein, es sind jedoch mindestens einige Dezimalstellen erforderlich.
Regeln
- Die Eingabe wird aus
stdin
oder Befehlszeilenargumenten gelesen - Die Ausgabe wird in geschrieben
stdout
- Wenn mit der angegebenen Eingabe zwei Lösungen möglich sind, geben Sie beide aus
- Wenn es zu wenig Informationen gibt, um eine oder zwei eindeutige Lösungen zu erhalten, sollten Sie
"No solution"
dies in Betracht ziehen - Es darf kein eingebauter oder bereits vorhandener Code verwendet werden (Sie können natürlich auch Triggerfunktionen verwenden, jedoch keinen "
solveTriangle
" oder einen solchen). - Kürzester Code gewinnt
Testfälle
Im 3 4 5 ? ? ?
aus 3.0 4.0 5.0 0.643501108793 0.927295218002 1.57079630572
Im ? 4 ? 0.64 0.92 1.57
aus 3.00248479301 4.0 5.02764025486 0.64 0.92 1.57
Im ? ? 5 ? 0.92 ?
aus No solution
Im ? ? 5 ? 0.92 1.57
aus 3.03226857833 3.97800936148 5.0 0.65159265359 0.92 1.57
Im 8 12 ? 0.5 ? ?
Out (zwei Lösungen)
8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714
Im 8 12 ? ? .5 ?
aus 8.0 12.0 18.3912222133 0.325325285223 0.5 2.31626736837
Viel Glück!
quelle
Antworten:
Python, 441 Zeichen
Hat dein typischer Trigger die Antwort zu berechnen. Die aktuell möglichen Lösungen werden als Tupel in V gespeichert. Alle unbekannten Werte werden als 0 aufgezeichnet. Eine siebte Variable R ist der Wert
a/sin(A)==b/sin(B)==c/sin(C)
.Ich benutze einen Trick, bei dem die a / b / c-Werte bei jeder Iteration durchlaufen werden, um viel redundante Logik zu vermeiden. Die innere Schleife muss nur die Werte der A-Seite oder des Winkels berechnen.
quelle
8 12 ? ? .5 ?
.if a
mitif not a
und die conditionals auf 1 Ebene zu.Plain C,
565555530 ZeichenC ist wohl nicht die beste Sprache für Code Golf, also nur zum Spaß.
Kompiliert mit
cc -o trig trig.c -lm
. Liest Eingaben als Befehlszeilenargumente.quelle
8 12 ? ? .5 ?
- ich habe sie als zusätzlichen Testfall im OP hinzugefügt.Perl - 412 Zeichen
Als Perl-Einzeiler, basierend auf Keith Randalls Python-Lösung:
Hier in besser lesbarer Form:
quelle