Geben Sie bei einer Folge von N, S, E und W eine Peilung aus (Winkel im Uhrzeigersinn von Norden in Grad), die auf 5 Dezimalstellen genau ist.
In der herkömmlichen Kompassnotation besteht eine Zeichenfolge nur aus zwei dieser Zeichen (wie NNW oder ESE). Hier müssen Sie auch Zeichenfolgen akzeptieren, die alle 4 enthalten (wie WNNNSE) . Die Verwendung von nur 2 Symbolen ermöglicht es dem Menschen, die Bedeutung intuitiv zu verstehen. Das Zulassen von 4 Symbolen erschwert das Lesen, ermöglicht jedoch kürzere Möglichkeiten, eine Peilung mit einer bestimmten Genauigkeit zu beschreiben.
(Wie in den Kommentaren von user2357112 ausgeführt , können Sie nachweisen, dass die Zeichenfolge mit 4 Symbolen für jede Peilung genau die gleiche Länge hat wie die Zeichenfolge mit 2 Symbolen. Daher habe ich diese Herausforderung auf einer falschen Annahme basiert. Hoffentlich beeinträchtigt dieses Fehlen eines praktischen Zwecks nicht Ihre Freude an der Herausforderung ...)
Die genaue Methode wird im Folgenden beschrieben und entspricht der herkömmlichen Notation (sie wird erweitert, anstatt sie zu ändern).
Eingang
- Die Eingabe ist eine einzelne Zeichenfolge, die nur die Zeichen enthält
NESW
. - Die Eingabe kann eine Folge von Zeichen sein, sofern dies keine Vorverarbeitung beinhaltet. Es ist beispielsweise
[N, [E, [S, [W]]]]
nicht zulässig , eine verschachtelte Liste zu verwenden, um die Verarbeitungsreihenfolge zu verbessern. - Das Verwenden anderer Zeichen ist nicht zulässig. Sie können nicht eine Reihe von nehmen
1234
stattNESW
.
Ausgabe
- Die Ausgabe muss eine Dezimalzahl oder eine Zeichenfolgendarstellung von eins sein (kein Rational / Bruch).
- Nachgestellte Nullen müssen nicht angezeigt werden. Wenn die Peilung stimmt, zählt
9.00000
die Ausgabe9
auch mit 5 Dezimalstellen als korrekt. - Die Ausgabe liegt im Bereich [0, 360). Das heißt, einschließlich 0, aber ausschließlich 360.
- Die Richtigkeit wird überprüft, indem die Ausgabe auf 5 Dezimalstellen gerundet wird. Wenn das Lager 0,000005 ist, wird es auf 0,00001 gerundet. Die Ausgaben 0.00001 und 0.000005 sind beide korrekt.
- Die Ausgabe in wissenschaftlicher Notation für einige Eingaben ist akzeptabel. Zum Beispiel
1e-5
anstelle von0.00001
.
Umwandlung
- Das einzelne Zeichen Kompaßstriche
N
,E
,S
, undW
entsprechen 0, 90, 180 und 270 Grad sind. - Das Voranstellen einer dieser Zeichenfolgen führt dazu, dass die Peilung die Peilung des einzelnen Zeichens und die Peilung der ursprünglichen Zeichenfolge halbiert.
- Das nächstgelegene der beiden möglichen halbierenden Lager wird so gewählt, dass NE 45 Grad und nicht 225 Grad darstellt.
- Dies ist eindeutig, es sei denn, der zu halbierende Winkel beträgt 180 Grad. Daher
NS
,SN
,WE
, undEW
entsprechen nicht definiert Lager, und der Eingang wird nie in einer dieser Punkte enden. Sie können jedoch an einer anderen Stelle in der Eingabezeichenfolge erscheinen, da dies keine Mehrdeutigkeit verursacht. - Wenn die letzten beiden Zeichen identisch sind, ist das letzte Zeichen überflüssig, da die Halbierung dieselbe Peilung ergibt. Da dies der Notation nichts hinzufügt, muss Ihr Code dies nicht verarbeiten. Daher
NN
,EE
,SS
, undWW
entsprechen nicht definiert Lager, und der Eingang wird nie in einer dieser Punkte enden. Sie können jedoch an einer anderen Stelle in der Eingabezeichenfolge erscheinen.
Beispiele
N: 0
E: 90
S: 180
SE: halfway between S and E: 135
NSE: halfway between N and SE: 67.5
NNSE: halfway between N and NSE: 33.75
NNNSE: halfway between N and NNSE: 16.875
NNNNSE: halfway between N and NNNSE: 8.4375
Testfälle
Eine Einreichung ist nur gültig, wenn sie für alle Testfälle die richtige Ausgabe liefert. Beachten Sie, dass die Testfälle an die Grenzen dessen gehen, was mit doppelter Genauigkeit gehandhabt werden kann. Bei Sprachen, die standardmäßig mit einfacher Genauigkeit arbeiten, müssen Sie wahrscheinlich die Bytes für die Angabe der doppelten Genauigkeit verwenden, um korrekte Ausgaben zu erhalten.
Testfallausgaben werden auf 5 Dezimalstellen gerundet und auch auf eine willkürliche Genauigkeit dargestellt. Beides sind gültige Ausgaben.
WNE 337.5 337.5
WEN 337.5 337.5
WEWEWEWEWEWEWEWEWEWEWEN 330.00001 330.000007152557373046875
NESWNESWNESWNESWNESWNESWNESW 90 89.99999932944774627685546875
NNNNNNNNNNNNNNNNNNNNNNNE 0.00001 0.0000107288360595703125
NNNNNNNNNNNNNNNNNNNNNNNW 359.99999 359.9999892711639404296875
SNNNNNNNNNNNNNNNNNNNNNNNE 90.00001 90.00000536441802978515625
SNNNNNNNNNNNNNNNNNNNNNNNW 269.99999 269.99999463558197021484375
Wertung
Das ist Code-Golf . Die Punktzahl ist die Länge des Quellcodes in Bytes und die kürzesten Gewinne.
Pedanterie
Ich habe den Fehler gemacht, zu denken, dass "North by North West" eine gültige Kompassrichtung ist. Ein glücklicher Fehler, da er zu einer Herausforderungsidee führte, die ich dann von der Wikipedia-Seite entdeckte :
"Der Titel des Alfred Hitchcock-Films von 1959, North by Northwest, ist eigentlich kein Richtungspunkt auf dem 32-Wind-Kompass, sondern der Film enthält einen Verweis auf Northwest Airlines. "
Es stellt sich auch heraus, dass die für diese Herausforderung verwendete Methode nur mit traditionellen Kompasspunkten bis einschließlich des 16-Punkte-Kompasses übereinstimmt. Der auf dieser Seite beschriebene 32-Wind-Kompass unterscheidet sich geringfügig und ich habe seine Existenz für diese Herausforderung leicht übersehen.
Schließlich für alle, die denken, ich sollte "Südosten" anstelle von "Südosten" verwenden,.
WNNNSE
<= Was wäre die Ausgabe für diesen Beispieleintrag zu Beginn Ihres Beitrags? es klingt für mich ungültig, aber es ist schwer zu sagen.WNNNSE
die Ausgabe323.4375
. Im Beispielabschnitt finden Sie eine exemplarische Vorgehensweise, die in diesem Fall auf die gleiche Weise angewendet werden würde.f(N,N,N,S,E)
Ordnung?Antworten:
JavaScript (ES6),
8480787472 ByteDank @Titus ein Byte gespeichert, dank @Neil ein Byte
Es hat eine Weile gedauert, aber ich glaube, ich habe die Formel endlich perfektioniert ...
Testschnipsel
Code-Snippet anzeigen
Erläuterung
Beginnen wir mit dem einfachsten Fall: einer Zeichenfolge. Das Ergebnis ist einfach die (0-indizierte) Position im String
NESW
, multipliziert mit 90.Bei einer Zeichenfolge mit zwei Zeichen liegt das Ergebnis in der Mitte zwischen dem Ergebnis des ersten Zeichens und dem Ergebnis des zweiten Zeichens. Es gibt jedoch einen Haken: Wenn der absolute Unterschied zwischen den beiden Werten größer als 180 ist (z. B.
NW
oderWN
), müssen wir den Winkel auf 180 einstellen, damit er nicht in die entgegengesetzte Richtung zeigt.Bei längeren Zeichenfolgen liegt das Ergebnis in der Mitte zwischen dem Ergebnis des ersten Zeichens und dem Ergebnis des Restes der Zeichenfolge. Dies kann auf folgende Weise verallgemeinert werden:
NESW
mal 90 zurück.NESW
mal 45 plus die Hälfte des Ergebnisses der restlichen Zeichenfolge zurück. Addieren Sie weitere 180, wenn die absolute Differenz zwischen den beiden Werten größer als 90 ist.quelle
search
anstattindexOf
dir ein Byte zu sparen.C # 6,
226217207185 BytesEdit: -10 Bytes durch "Ausleihen" der Idee von ETHproductions
-22 Bytes dank @Titus
Ungolfed
quelle
b=(b+360)%360;
anstelle vonb+=b>360?-360:b<0?360:0;
. Speichern Sie weitere 12 Bytes, indem Sie alles durch 90 und teilenreturn b*90;
.b=(b+f(c)+(b-f(c)>2?4:f(c)-b>2?-4:0)+8)/2%4;
Dann verteilen+8
sie auf die ternären Ergebnisseb=(b+f(c)+(b-f(c)>2?12:f(c)-b>2?4:8))/2%4;
PHP,
958886100127104101 BytesN
(und mehr, weil das erlaubt, die Übersetzung auf den Schleifenkopf zu setzen:N
ist wahr, wird aber0
in der Berechnung ausgewertet .)strtr
mit einem meiner Bit-JonglierenDies ist offiziell das erste Mal, dass ich den Null-Koaleszenz-Operator verwende. Laufen Sie mit
-r
.PHP 7.1
Negative String-Offsets in der kommenden PHP-Version sparen 12 Bytes:
Ersetzen Sie
strlen($s=$argv[1])
mit0
und$s
mit$argv[1]
.Freie Bytes für (fast) alle:
(a/2%6+2)%5
a<87?a/2&3^3:3
odera/2&3^3*(a<87)
a&1?a&2|a/4&1:0
a/.8-1&3
quelle
Python 3,
133113 BytesIch habe gerade die Antwort von @ L3viathan verbessert, weil ich gerade diesen Account erstellt habe und daher noch keine Kommentare abgeben kann.
quelle
05AB1E ,
48423732 Bytes6 Bytes gespart dank Emigna. 5 Bytes gespart dank der Idee von Titus, den Bereich [0,4 [zu bearbeiten und am Ende mit 90 zu multiplizieren. 5 Bytes gespart dank Adnans Beherrschung der alten Xor / Modulo-Metamorphose.
So wird jeder Winkel während der Ausführung von Bereich [0,360] auf Bereich [0,4] reduziert. Das Ergebnis wird dann mit 90 multipliziert und angezeigt.
Probieren Sie es online!
Mögliche Golfachsen:
quelle
NNNNNNNNNNNNNNNNNNNNNNNE
undSNNNNNNNNNNNNNNNNNNNNNNNE
Testfälle zu liefern .v"NESW"yk90*})R¬U¦vXy+;DX-Ä89›180*+360%U}X
.89›
tatsächlich bedeutet, dass der ganzzahlige Teil größer als 89 ist, was bedeutet, dass die vollständige Zahl größer oder gleich 90 ist (was immer noch gut funktioniert, da genau 90 niemals vorkommen sollte). Gegenwärtig klingt der Kommentar im erklärten Code so, als würde nach mehr als 89 gesucht, während Ihr Code die Testfälle besteht, sodass eindeutig korrekt nach mehr als 90›
gegenüber negativen Gleitkommawerten verhalten soll. Es gibt hier kein Problem, da es auf dem absoluten Wert funktioniert, aber ich bevorzuge es, keine zu starken Annahmen über den Operator zu machen.v"NESW"yk})
mitÇ30^5%
:)Python 3,
14614511710797949392 BytesRuf
f
mit der Schnur an.quelle
...0else
sie SyntaxErrors werfen.else
und-
auch entfernen ? (can in 3.3.3)d.find
kann, ich hatte die genaue Idee vor einer Minute; Siehe aktualisierte Antwort.C 184 Bytes
Ungolfed
quelle
d
)?R,
172146 BytesUngolfed
Erklärt
c("N","E","S","W")
0:3*90
(anstelle vonc(0,90,180,270)
)z
p
auf den Grad, der dem letzten Zeichen in der Eingabe entsprichtl
p
aufz
Probieren Sie die Testfälle für R-Fiddle aus (beachten Sie, dass dies eine Funktion ist, da
scan
R-Fiddle nicht funktioniert).quelle
Outputs 0.00001 and 0.000005 are both correct.
So sollten Sie in der Lage sein, einige Bytes zu retten, indem Sie nicht rundenc("N","N","E")
statt"NNE"
? Dies entspricht einer nicht verschachtelten Python-Liste["N","N","E"]
.Haskell,
109 105103 BytesVielen Dank für -2 Byte @xnor!
quelle
f
sieht lang aus, aber ich habe Probleme, etwas Kürzeres zu finden. Am nächsten war ichf c=90*until(\i->"NESW"!!i==c)(+1)0
(35). Ich glaube , Sie können ersetzen'W'
mit_
._
!Dyalog APL ,
554538 BytesLösung
Benötigt
⎕IO←0
, was bei vielen Systemen Standard ist. Fragt nach richtungErläuterung
Geht um das Problem , indem man jeden Buchstaben in eine komplexe Zahl 1∠ & thgr; ⇔ a + b · i , dann tun eine Summe Reduktion von rechts nach links (APL forte) , während Normalisieren bei jedem Schritt. Das endgültige θ wird dann in Grad umgerechnet und so normiert, dass es innerhalb von [0, 360] liegt:
'NES'⍳⍞
die Indizes jedes eingegebenen Buchstabens in "NES"; N → 0, E → 1, S → 2, alles andere → 3○2÷⍨
in Winkel im Bogenmaß umrechnen; θ = π · x ∕ 2¯12○
auf dem Einheitskreis in komplexe Zahlen umwandeln; e i · θ(
...)/
reduzieren Sie die Liste mit ... (dh fügen Sie die Funktion zwischen die Elemente von ... ein)+÷(|+)
... die normalisierte Summe; x n - 1 + x n ∕ | x n - 1 + x n |12○
in Winkel umwandeln; θ÷○÷180×
in grad umrechnen; 1 ≤ π · 1 ≤ 180 · x360|
Divisionsrest bei Division durch 360TryAPL online!
Anekdote
Wenn Eingabe und Ausgabe als orthogonale komplexe Einheiten wären, wäre die gesamte Lösung einfach:
Der Rest des Codes analysiert die Eingabe und formatiert die Ausgabe.
quelle
⎕FR←1287
verwendet 128-Bit-Floats, aber TryAPL lässt dies nicht zu.Gemeines Lisp,
347327 BytesVielen Dank an @Titus fürs Abheben
Dies kann wahrscheinlich mehr Golf gespielt werden, aber zumindest funktioniert es (glaube ich):
Verwendung:
Funktion
d
nimmt ein ZeichenN
,E
,W
, oderS
und gibt den entsprechenden Grad. Die Funktionm
erhält den passenden kombinierten Grad zweier gegebener Richtungen. Die Funktionf
durchläuft die angegebene Zeichenfolge, berechnet den entsprechenden Grad und gibt ihn als Gleitkomma aus.quelle
Befunge,
183181175 BytesProbieren Sie es online!
Erläuterung
Dies folgt einem ähnlichen Algorithmus wie bei vielen anderen Antworten, verwendet jedoch Festkomma-Berechnungen, die mit Ganzzahlen emuliert wurden, da Befunge keine Gleitkomma-Berechnungen unterstützt.
Vielen Dank an @Titus für die ASCII-to-Int-Routine.
quelle
APL (Dyalog Classic) ,
3027 BytesProbieren Sie es online!
quelle