Finden Sie den Referenzwinkel

17

Dies ist eine ziemlich einfache Frage. Nach dieser zufälligen Website, die ich gefunden habe - Web Archive , ist ein Bezugswinkel the acute angle formed by the terminal side of the given angle and the x-axis.Sie müssen ein Programm schreiben, um diese zu finden.

Ich erinnere mich an nichts aus Algebra 2, was bedeutet das?

Winkel werden normalerweise in Standardform angegeben , die gemessen wird, indem eine Seite des Winkels platziert und zur anderen Seite entgegen dem Uhrzeigersinn gemessen wird.

Standardform

Dies wird Ihre Eingabe sein. Ihre Ausgabe wird der Referenzwinkel davon sein. Sie können sich dies als den kleinsten Abstand von der Klemmenseite zur x-Achse vorstellen. Es ist nur ein Winkel, keine Distanz. Hier sind einige Beispiele:

Quad 2 ref Quad 1 ref

Quad 3 ref Quad 4 ref

Klarstellungen

  • Alle Standardeinstellungen für Eingaben und Übermittlungen.
  • Winkel ist in Grad .
  • Negative Winkel, nicht ganzzahlige Winkel und Winkel> 360 ° sind zulässig.
  • Ausgabe in Form 60 deg.
  • Das ist , also gewinnt der kürzeste Code in Bytes!

Ein weiterer hilfreicher Link .

Testfälle

70      ->  70 deg
135     ->  45 deg
210     ->  30 deg
-60     ->  60 deg
91      ->  89 deg
610     ->  70 deg
-1000   ->  80 deg
Maltysen
quelle
1
Was machen wir mit der Eingabe von 90?
Lirtosiast
2
@ ThomasKwa wäre es 90 aus beiden Richtungen.
Maltysen
1
Eine kurze Lösung ist abs(arcsin(sin(input)))+" deg", obwohl ich nicht weiß, welche Sprache gewinnen würde (es müsste Grade und Zeichenkettenoperationen unterstützen).
Lirtosiast
Ist die Eingabe immer eine Ganzzahl?
Lirtosiast
6
Da nicht ganzzahlige Winkel zulässig sind, sollten Sie einen in die Testfälle einbeziehen.
Dennis

Antworten:

6

Pyth, 18 Bytes

+.a-%+QK90yKK" deg

Probieren Sie es online aus.

HainenNL
quelle
Mit Ihrem Algo auf 19 gekommen, aber mit Inline-Zuweisung können Sie
Folgendes
@Maltysen: Danke, ich habe auch eine weitere Verbesserung gefunden
grovesNL
5

Python 2, 34 Bytes

lambda x:`90-abs(x%180-90)`+' deg'

Die Verwendung der "%d deg"Zeichenfolgenformatierung würde aufgrund der erforderlichen Klammern länger dauern.

Sp3000
quelle
5

CJam (21 Bytes)

180qd1$%z_@@-e<" deg"

Online-Demo

Peter Taylor
quelle
4

dc, 25

90?90+d*v180%-d*vn[ deg]p

Hinweis dcwird _anstelle von als -ve-Zeichen verwendet -.

Testausgang:

$ for test in 70 135 210 _60 91 610 _1000; do dc -e'90?90+d*v180%-d*vn[ deg]p' <<< $test ; done
70 deg
45 deg
30 deg
60 deg
89 deg
70 deg
80 deg
$
Digitales Trauma
quelle
3

Mathematica, 22 31

ToString@Abs@Mod[#,180,-90]deg&
Alephalpha
quelle
1
@ LegionMammal978 Wenn ich es nur multipliziere deg, 0 degwird es werden 0.
Alephalpha
1
Da Sie sich nicht für den Ausgabetyp interessieren, können Sie 2 Bytes wie Row@{Abs@Mod[#,180,-90],deg}&
folgt
3

Python 2, 35

lambda x:`min(x%180,-x%180)`+' deg'

Der kleinere Winkel und sein negatives Modulo 180. Wandelt den Winkel effektiv in einen Bereich von 0 bis 180 um und berechnet den Abstand zum näheren Endpunkt. Beachten Sie, dass -x%180Gruppen als (-x)%180.

Gleiche Länge mit String-Formatierung für Python 3:

lambda x:'%d deg'%min(x%180,-x%180)
xnor
quelle
3

Pyth 25 30 Bytes

Schmerzhaft unkreative Lösung mit Triggerfunktionen. Permalink

+.R.t.a.t.t.tQ7Z3 6?%Q1Q0" deg

Anregungen willkommen.

Winny
quelle
1
Wir haben es auf 28 geschafft, indem wir die .tAnrufe entgegengenommen und zusammengefaltet haben:+.R.t.a.tF[Q7Z3)6?%Q1Q0" deg
Maltysen,
Ordentlich. Ich bemerkte es nicht mit einem Floating - Point - Eingang zur Arbeit erscheint: 90.5 => 90.0 deg, though.
Winny
Das liegt daran, dass Sie es auch nicht tun
Maltysen
Interessanter Fang. Mit Eingabe -60.5 => 60.5 degaber mit 60.5 => 60.0 deg. Sieht aus wie ein Problem mit Pyth - Beispiel mit pyth / macros.py
Winny
1

JavaScript (ES6), 43 Byte

Ähnlich wie die Antwort von Sp3000 , obwohl das Modulo aufgrund des Verhaltens in JavaScript ziemlich langwierig ist .

f=x=>90-Math.abs((x%180+180)%180-90)+' deg'

Demo

Code wird in ES5 aus Gründen der Browserkompatibilität neu geschrieben:

function f(x){return 90-Math.abs((x%180+180)%180-90)+' deg'}

// Snippet stuff
console.log = function(x){document.body.innerHTML += x + '<br>'};
[70,135,210,-60,91,610,-1000].map(function(v){console.log(f(v))});

CoffeeScript, 45 Bytes

f=(x)->90-Math.abs((x%180+180)%180-90)+' deg'
rink.attendant.6
quelle
5
Ich nehme an, es war eine Designentscheidung eines PDP-Hardware-Ingenieurs, die dafür verantwortlich ist, dass wir einige Jahrzehnte später noch sehr wenige Sprachen haben, die %sinnvoll implementiert werden .
Peter Taylor
Das Ersetzen der ersten 180 durch das (t=180)Ersetzen der folgenden 180 durch t würde wahrscheinlich ein paar Bytes sparen
Downgoat
@ vihan1086 Es ist dasselbe
rink.attendant.6
1

J, 26 Bytes

m=:180&|
' deg',~m@-":@<.m

Das gleiche wie xnor Methode .

Legendre
quelle
1

Matlab, 44

Verwenden einer anonymen Funktion:

f=@(x)[num2str(min(mod([x -x],180))) ' deg']

Beispiel:

>> f=@(x)[num2str(min(mod([x -x],180))) ' deg']
f = 
    @(x)[num2str(min(mod([x,-x],180))),' deg']

>> f(70)
ans =
70 deg

>> f(210)
ans =
30 deg

>> f(-1000)
ans =
80 deg
Luis Mendo
quelle
4
Das 'deg' wird jedoch nicht am Ende angehängt. (Hat nicht abgelehnt.)
Legendre
@Legendre Ups. Vielen Dank! Korrigiert
Luis Mendo
1

Scala, 40 35 Zeichen

(a:Int)⇒s"${90-(a%180-90).abs} deg"
Gilad hoch
quelle
-1

PHP, 44 Bytes

Nimmt einen Befehlszeilenparameter an. Wieder leidet PHP unter dem gleichen Problem wie JavaScript .

<?=90-abs(($argv[1]%180+180)%180-90)+' deg';

Für die Verwendung der kanonischen Lösung sind 53 Byte erforderlich (die Umrechnung von Grad und Bogenmaß erfordert viele Zeichen):

<?=rad2deg(abs(asin(sin(deg2rad($argv[1])))))+' deg';
rink.attendant.6
quelle
1
Wird PHP nicht .zur Verkettung verwendet?
Downgoat
@ vihan1086 Ja, PHP verwendet .. Abgestimmt, bis es behoben ist
Ismael Miguel