Geschichte, oder warum wir das tun.
Keiner. Diese Übung ist völlig sinnlos ... es sei denn, Sie sind Stephen Hawking .
Die Herausforderung
Ermitteln Sie anhand einer Liste von Winkeln den Durchschnitt dieser Winkel. Zum Beispiel ist der Durchschnitt von 91 Grad und -91 Grad 180 Grad. Sie können dazu ein Programm oder eine Funktion verwenden.
Eingang
Eine Liste von Gradwerten, die Winkelmaße darstellen. Sie können davon ausgehen, dass es sich um ganze Zahlen handelt. Sie können in einem beliebigen Format eingegeben oder als Funktionsargumente angegeben werden.
Ausgabe
Der Durchschnitt der eingegebenen Werte. Wenn mehr als ein Wert für den Durchschnitt gefunden wird, sollte nur einer ausgegeben werden. Der Durchschnitt ist definiert als der Wert, für den
minimiert wird. Die Ausgabe muss im Bereich von (-180, 180] liegen und auf mindestens zwei Stellen hinter dem Dezimalpunkt genau sein.
Beispiele:
> 1 3
2
> 90 -90
0 or 180
> 0 -120 120
0 or -120 or 120
> 0 810
45
> 1 3 3
2.33
> 180 60 -60
180 or 60 or -60
> 0 15 45 460
40
> 91 -91
180
> -89 89
0
Wie bei Codegolf üblich, gewinnt die Einsendung mit den wenigsten Bytes.
Bestenliste
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Hier finden Sie einen Chatroom für Fragen zum Problem: http://chat.stackexchange.com/rooms/30175/room-for-average-of-angles
quelle
Antworten:
Python 3, 129 Bytes
Dieses Problem scheint ziemlich viel Verwirrung gestiftet zu haben. Intuitiv besteht die Idee darin, den Winkelkreis an einem bestimmten Punkt zu schneiden, den Kreis zu einer Linie zu lösen, den arithmetischen Mittelwert auf dieser Linie zu berechnen und das Ergebnis dann wieder in den Kreis zu setzen. Es gibt jedoch viele verschiedene Punkte, an denen Sie den Kreis abschneiden können. Es reicht nicht aus, einen willkürlich auszuwählen, z. B. 0 ° oder 180 °. Sie müssen sie alle ausprobieren und sehen, welches die kleinste Summe der quadratischen Abstände ergibt. Wenn Ihre Lösung wesentlich unkomplizierter ist, ist sie wahrscheinlich falsch.
quelle
s**2
aufs*s
Python 3, 85 Bytes
Profitiert von der Antwort, die nur auf zwei Dezimalstellen genau sein muss, indem alle möglichen Winkel in Schritten
1/200
von einem Grad ausprobiert werden . Dies dauert auf meinem Computer weniger als eine Sekunde.Da wir in Python die arithmetischen Abläufe von Gleitkommazahlen nicht bequem auflisten können, stellen wir die möglichen Winkel als ganze Zahl dar
[0,72000)
, die in einen Winkel als(-180,180]
umgerechnet werdenx -> 180 - x/200
. Wir finden diejenige, die die minimale Summe der quadratischen Winkeldifferenzen ergibt.Für zwei Winkel mit einer Winkelverschiebung von
d
wird der quadratische Winkelabstand durch Transformation in einen äquivalenten Winkel in ermittelt(-180,180]
as180-(d+180)%360
und anschließendes Quadrieren ermittelt. Zweckmäßigerweise ist der von angegebene Winkelx/200
bereits um180
Grad versetzt.quelle
1/200
ist tatsächlich problematisch. Für den Testfall wird[1, 3, 3]
diese Lösung zurückgegeben2.335
und auf2.34
die richtige Antwort gerundet2.33
.2.33
in diesem Beispiel richtig sind. Würde eine Änderung des200
to400
oder to2000
(und72000
entsprechend) trotz Rundung funktionieren? Wenn ich mir dieses alte Problem noch einmal ansehe, denke ich, dass ich vielleicht einen besseren Weg sehe.2.333...
und Ihr Programm zurückkehrt2.335
, ist sie bis auf zwei Dezimalstellen ohne Rundung korrekt. Das tut mir leid.Oktave,
9795 BytesDies erzeugt eine anonyme Funktion, die nur das Minimum der angegebenen Funktion in einem Raster durchsucht, das gerade gut genug ist. Als Eingabe akzeptiert die Funktion Spaltenvektoren, z
[180; 60; -60]
. Zum Testen müssen Sie der Funktion einen Namen geben. So könntest du zB den obigen Code ausführen und dann verwendenans([180, 60; -60])
.quelle
Javascript ES6, 87 Bytes
Beispiel läuft (Getestet in Firefox):
In Arbeit
Diese Version hat einen etwas anderen Ansatz als die Durchschnitts-Alles-Dann-Tun-Modul-Mathematik. Vielmehr werden die Winkel in Vektoren umgewandelt, die Vektoren addiert und der Winkel des resultierenden Vektors berechnet. Leider ist diese Version mit dem Trigger sehr instabil und ich werde an einer modularen Mathematikversion arbeiten.
quelle
f(-91,91)
sollte 180 zurückgeben.CJam,
4440 BytesProbieren Sie es online im CJam-Interpreter aus .
Testfälle
Idee
Wir berechnen die Abweichung für alle möglichen Durchschnitte von -179,99 bis 180,00 mit Schritten der Größe 0,01 , und wählen Sie den mit der niedrigsten Abweichung.
Für diesen Zweck spielt es keine Rolle, ob wir die Winkelabstände Grad oder Bogenmaß nehmen. Anstatt die Differenzen δ der Winkel von Eingangs- und Potentialmittelwerten in [0,360 °) abzubilden und das Ergebnis von 180 ° bedingt zu subtrahieren , können wir einfach Arccos (cos (πδ ÷ 180 °)) berechnen , da cos sowohl periodisch als auch gerade ist. und arccos ergibt immer einen Wert in [0, π) .
Code
quelle
MATLAB, 151
Okay, bis ich wirklich verstehe, was die Methodik ist, habe ich mir das ausgedacht. Es ist ein kleiner Hack, aber da die Frage besagt, dass die Antwort auf 2.dp korrekt sein muss, sollte es funktionieren.
Grundsätzlich überprüfe ich jeden Winkel zwischen 0 und 360 (in Schritten von 0,01) und löse dann die Formel in der Frage für jeden dieser Winkel. Dann wird der Winkel mit der kleinsten Summe ausgewählt und in einen Bereich von -180 bis 180 umgewandelt.
Der Code sollte mit Octave sein . Sie können es mit dem Online-Dolmetscher versuchen
quelle
JavaScript (ES6) 138
Da Sie nicht die geringste Ahnung von einem Algorithmus haben, werden alle möglichen Werte mit einer Genauigkeit von 2 Stellen (-179,99 bis 180,00) geprüft. Ziemlich schnell mit den Testfällen.
Testen Sie das folgende Snippet in einem EcmaScript 6-kompatiblen Browser (Implementierung von Pfeilfunktionen und Standardparametern - AFAIK Firefox)
quelle