Étant donné une chaîne de N, S, E et W, affichez un relèvement (angle dans le sens horaire à partir du nord en degrés), corrigez à 5 décimales.
En notation boussole traditionnelle , une chaîne est composée de seulement 2 de ces caractères (comme NNW ou ESE). Ici, vous devez également accepter les chaînes qui contiennent les 4 (comme WNNNSE) . L'utilisation de seulement 2 symboles permet aux humains de comprendre intuitivement la signification. Permettre 4 symboles le rend horrible à lire, mais permet des manières plus courtes de décrire un relèvement avec une précision donnée.
(Comme indiqué dans les commentaires de user2357112 , il s'avère que vous pouvez prouver que pour un roulement donné, la chaîne de 4 symboles aura exactement la même longueur que la chaîne de 2 symboles, j'ai donc basé ce défi sur une fausse hypothèse. Espérons que ce manque d'objectif pratique ne nuise pas à votre plaisir de relever le défi ...)
La méthode exacte est décrite ci-dessous et est équivalente à la notation traditionnelle (elle se développe sur elle plutôt que de la changer).
Contribution
- L'entrée est une chaîne unique contenant uniquement les caractères
NESW
. - L'entrée peut être une séquence de caractères si vous préférez, à condition que cela n'inclue aucun prétraitement. Par exemple, la prise d'une liste imbriquée
[N, [E, [S, [W]]]]
pour faciliter l'ordre de traitement n'est pas autorisée. - Il n'est pas permis de prendre des personnages différents. Vous ne pouvez pas prendre une chaîne de
1234
au lieu deNESW
.
Sortie
- La sortie doit être un nombre décimal ou une représentation sous forme de chaîne de un (pas une ration / fraction).
- Les zéros de fin n'ont pas besoin d'être affichés. Si le relèvement est
9.00000
, la sortie9
compte également comme correcte jusqu'à 5 décimales. - La sortie est dans la plage [0, 360). C'est-à-dire, y compris 0 mais à l'exclusion de 360.
- L'exactitude est vérifiée en arrondissant la sortie à 5 décimales. Si le relèvement est de 0,000005, il arrondit à 0,00001. Les sorties 0.00001 et 0.000005 sont toutes les deux correctes.
- La sortie en notation scientifique pour certaines entrées est acceptable. Par exemple,
1e-5
au lieu de0.00001
.
Conversion
- Les points du caractère unique
N
,E
,S
, etW
correspondent à 0, 90, 180 et 270 degrés respectivement. - Si vous ajoutez un de ces éléments à une chaîne, le relèvement divise le relèvement du caractère unique et le relèvement de la chaîne d'origine.
- Le plus proche des deux paliers bissecteurs possibles est choisi, de sorte que NE représente 45 degrés, et non 225 degrés.
- Ceci est sans ambiguïté sauf lorsque l'angle à bissecter est de 180 degrés. Par conséquent
NS
,SN
,WE
etEW
correspondent à des paliers non défini, et l'entrée ne sera jamais fin dans l' un de ces. Ils peuvent cependant apparaître n'importe où ailleurs dans la chaîne d'entrée, car cela ne crée aucune ambiguïté. - Si les deux derniers caractères sont identiques, le caractère final sera redondant car la bissection retournera le même relèvement. Comme cela n'ajoute rien à la notation, votre code n'a pas besoin de gérer cela. Par conséquent
NN
,EE
,SS
etWW
correspondent à des paliers non défini, et l'entrée ne sera jamais fin dans l' un de ces. Ils peuvent cependant apparaître n'importe où ailleurs dans la chaîne d'entrée.
Exemples
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
Cas de test
Une soumission n'est valide que si elle donne une sortie correcte pour tous les cas de test. Notez que les cas de test repoussent les limites de ce qui peut être traité avec une double précision. Pour les langues par défaut à simple précision, vous devrez probablement dépenser les octets pour spécifier la double précision afin d'obtenir des sorties correctes.
Les sorties des cas de test sont représentées arrondies à 5 décimales et avec une précision arbitraire. Les deux sont des sorties valides.
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
Notation
C'est du code-golf . Le score est la longueur du code source en octets, et le gain le plus court.
Pédantisme
J'ai fait l'erreur de penser que «North by North West» était une direction de boussole valide. Une erreur heureuse, car elle a conduit à une idée de défi, mais j'ai découvert à partir de la page Wikipedia :
"Le titre du film d'Alfred Hitchcock 1959, North by Northwest, n'est en fait pas un point de direction sur la boussole à 32 vents, mais le le film contient une référence à Northwest Airlines. "
Il s'avère également que la méthode utilisée pour ce défi est cohérente uniquement avec les points cardinaux traditionnels jusqu'au compas 16 points inclus. La boussole à 32 vents décrite sur cette page est subtilement différente et j'ai commodément ignoré son existence pour ce défi.
Enfin, pour tous ceux qui pensent que je devrais utiliser "Sud-Est" au lieu de "Sud-Est",.
WNNNSE
<= quelle serait la sortie de cet exemple d'entrée au début de votre message? cela me semble invalide, mais c'est difficile à dire.WNNNSE
la sortie serait323.4375
. Consultez l'exemple de section pour une procédure pas à pas qui s'appliquerait de la même manière à ce cas.f(N,N,N,S,E)
correcte?Réponses:
JavaScript (ES6),
8480787472 octetsUn octet enregistré grâce à @Titus, 1 grâce à @Neil
Cela a pris du temps, mais je pense que j'ai enfin perfectionné la formule ...
Extrait de test
Afficher l'extrait de code
Explication
Commençons par le cas le plus simple: une chaîne à un seul caractère. Le résultat est simplement sa position (indexée 0) dans la chaîne
NESW
, multipliée par 90.Pour une chaîne de deux caractères, le résultat se situe à mi-chemin entre le résultat du premier caractère et le résultat du second. Cependant, il y a un hic: si la différence absolue entre les deux est supérieure à 180 (par exemple
NW
ouWN
), nous devons 180 à l'angle afin qu'il ne pointe pas dans la direction opposée.Pour toute chaîne plus longue, le résultat se situe à mi-chemin entre le résultat du premier caractère et le résultat du reste de la chaîne. Cela peut être généralisé de la manière suivante:
NESW
fois 90.NESW
fois 45, plus la moitié du résultat du reste de la chaîne; ajoutez 180 supplémentaires si la différence absolue entre les deux est supérieure à 90.la source
search
au lieu de vousindexOf
faire économiser un octet.C # 6,
226217207185 octetsEdit: -10 octets par idée "d'emprunt" de la soumission d'ETHproductions
-22 octets grâce à @Titus
Non golfé
la source
b=(b+360)%360;
au lieu deb+=b>360?-360:b<0?360:0;
. Économisez encore 12 octets en divisant tout par 90 etreturn b*90;
.b=(b+f(c)+(b-f(c)>2?4:f(c)-b>2?-4:0)+8)/2%4;
puis distribuez-les+8
aux résultats ternairesb=(b+f(c)+(b-f(c)>2?12:f(c)-b>2?4:8))/2%4;
PHP,
958886100127104101 octetsN
(et plus, car cela permet de mettre la traduction à la tête de boucle:N
est vrai, mais évalue à0
dans le calcul.)strtr
par un de mes jonglagesC'est officiellement la première fois que j'utilise l'opérateur de coalescence nulle. Courez avec
-r
.PHP 7.1
Les décalages de chaîne négatifs dans la prochaine version PHP économiseront 12 octets:
Remplacez
strlen($s=$argv[1])
par0
et$s
par$argv[1]
.Octets gratuits pour (presque) tout le monde:
(a/2%6+2)%5
a<87?a/2&3^3:3
oua/2&3^3*(a<87)
a&1?a&2|a/4&1:0
a/.8-1&3
la source
Python 3,
133113 octetsJe viens d'améliorer la réponse de @ L3viathan parce que je viens de créer ce compte et que je ne peux donc pas encore faire de commentaires.
la source
05AB1E ,
48423732 octets6 octets enregistrés grâce à Emigna. 5 octets enregistrés grâce à l'idée de Titus de travailler sur la plage [0,4 [et de multiplier par 90 à la fin. 5 octets enregistrés grâce à la maîtrise d'Adnan de l'ancienne métamorphose xor / modulo.
Ainsi, chaque angle est réduit de la plage [0,360 [à la plage [0,4 [tout au long de l'exécution. Le résultat est ensuite multiplié par 90 et affiché.
Essayez-le en ligne!
Axes potentiels du golf:
la source
NNNNNNNNNNNNNNNNNNNNNNNE
etSNNNNNNNNNNNNNNNNNNNNNNNE
.v"NESW"yk90*})R¬U¦vXy+;DX-Ä89›180*+360%U}X
.89›
signifie en fait que la partie entière est supérieure à 89, ce qui équivaut à dire que le nombre complet est supérieur ou égal à 90 (ce qui fonctionne toujours bien car exactement 90 ne devrait jamais se produire). Actuellement, le commentaire dans le code expliqué donne l'impression qu'il vérifie plus de 89, alors que votre code passe les cas de test, il est donc clairement correct de vérifier plus de 90.›
doit se comporter envers les valeurs négatives à virgule flottante. Il n'y a pas de problème ici car cela fonctionne sur la valeur absolue, mais je préfère ne pas faire d'hypothèses trop fortes sur l'opérateur.v"NESW"yk})
parÇ30^5%
:)Python 3,
14614511710797949392 octetsAppelez
f
avec la chaîne.la source
...0else
qu'ils lancent SyntaxErrors.else
et-
aussi? (peut en 3.3.3)d.find
peut, j'ai eu l'idée exacte il y a une minute; voir la réponse mise à jour.C, 184 octets
Non golfé
la source
d
)?R,
172146 octetsNon golfé
Expliqué
c("N","E","S","W")
0:3*90
(au lieu dec(0,90,180,270)
)z
p
au degré équivalent au dernier caractère en entréel
p
surz
Essayez les cas de test sur R-fiddle (notez que c'est une fonction car vous
scan
ne travaillez pas sur R-fiddle)la source
Outputs 0.00001 and 0.000005 are both correct.
vous devriez donc être en mesure d'économiser quelques octets en ne l'arrondissant pasc("N","N","E")
au lieu de"NNE"
? Cela équivaut à une liste Python non imbriquée["N","N","E"]
.Haskell,
109 105103 octetsMerci pour -2 octets @xnor!
la source
f
semble longue, mais j'ai du mal à trouver quelque chose de plus court. Le plus proche que j'ai eu étaitf c=90*until(\i->"NESW"!!i==c)(+1)0
(35). Je pense que vous pouvez remplacer'W'
par_
._
!Dyalog APL ,
554538 octetsSolution
Requiert
⎕IO←0
, qui est par défaut sur de nombreux systèmes. Demande de la direction.Explication
Contourne le problème en convertissant chaque lettre en un nombre complexe 1∠ θ ⇔ a + b · i , puis en effectuant une réduction de la somme de droite à gauche (point fort d'APL) tout en normalisant à chaque étape. Le θ final est ensuite converti en degrés et normalisé pour être à l'intérieur de [0, 360):
'NES'⍳⍞
les indices de chaque lettre d'entrée dans "NES"; N → 0, E → 1, S → 2, toute autre chose → 3○2÷⍨
convertir en angles en radians; θ = π · x ∕ 2¯12○
convertir en nombres complexes sur le cercle unitaire; e i · θ(
...)/
réduisez la liste avec ... (ie insérez la fonction entre les éléments de ...)+÷(|+)
... la somme normalisée; x n - 1 + x n ∕ | x n - 1 + x n |12○
convertir en angle; θ÷○÷180×
convertir en degrés; 1 ∕ π · 1 ∕ 180 · x360|
reste de division divisé par 360TryAPL en ligne!
Anecdote
Si l'entrée et la sortie étaient des unités complexes orthogonales, la solution entière serait juste:
Le reste du code analyse les entrées et met en forme les sorties.
la source
⎕FR←1287
utilise des flottants de 128 bits, mais TryAPL ne le permet pas.Lisp commun,
347327 octetsMerci à @Titus d'avoir décollé quelques-uns
Cela peut probablement être plus joué au golf, mais au moins cela fonctionne (je pense):
Usage:
Fonction
d
prend un caractèreN
,E
,W
ouS
et retourne le degré approprié. La fonctionm
obtient le degré combiné approprié de deux directions données. La fonctionf
parcourt la chaîne fournie, calcule le degré approprié et l'imprime en virgule flottante.la source
Befunge,
183181175 octetsEssayez-le en ligne!
Explication
Cela suit un algorithme similaire à la plupart des autres réponses, seulement il utilise des calculs à virgule fixe émulés avec des nombres entiers puisque Befunge ne prend pas en charge les virgules flottantes.
Merci à @Titus pour la routine ASCII-to-int.
la source
APL (Dyalog Classic) ,
3027 octetsEssayez-le en ligne!
la source