Bonjour!

21

Arrr ... Ahoy là, moi les copains! Dérouler la grand-voile! Plein à tribord! Ah, sens le vent dans tes cheveux!

Bon, mon coeur ... J'ai besoin d'un peu de compétences en codage! Mon équipage est un peu plus modernisé que moi-même ... Je préfère toujours les "points de la boussole" (voir ici pour plus d'informations, Arrr ...) tandis que mon équipage est toujours en train d'utiliser une tête. Je veux un moyen facile de convertir ce twaddle qu'ils appellent un headin en ce que je peux comprendre, Arrr!

Ce dont j'ai besoin, c'est d'un code qui prenne l'entrée d'un nombre (les décimales sont correctes) tel que ' 0 <= the headin' < 360et ça crache la réponse comme le point de boussole le plus proche! Arrr!

Voici quelques exemples:

> heading 0.1

North

> heading 11.25

North by East

> heading 22.7

North Northeast

> heading 44.99

Northeast

> heading 91

East

Maintenant, si vous êtes en train de donner de telle sorte qu'il tombe exactement au milieu de deux points cardinaux, ne vous inquiétez pas, mon cœur ... j'attends que le code crache Between <point 1> and <point 2>, par exemple heading 5.625dira que Between North and North by East cela ne se produit que pour une tête qui doit satisfaire l'équation H = 5.625 + 11.25(N)où H est la tête et N un entier compris entre 0 et 31 inclus ...

Deux restrictions ...

1) Je ne veux pas que vous utilisiez des tableaux pour stocker vos données pour les points ou les `` headin's '' ... t 'être calculé, jus' comme au bon vieux temps! Arrr!

2) Le code le plus court l'emporte, ou je vous fais marcher la planche ... Arrr!

WallyWest
la source
10
50 '(Apostrophe) en une seule question. Chapeau! : D
Wasi
Est-ce que l'utilisation d'un objet en javascript avec des touches numériques triche? Je veux dire yaarrr! que ce soit en train de tromper, toi landlubber?
Tim Seguine
1
Ne devrait-il pas s'agir de "N un entier compris entre 0 et 31 inclus"?
nwellnhof
@nwellnhof Vous avez raison! Mis à jour ... :)
WallyWest
1
Je pense que vous devriez lancer un code golf dont le but est de traduire votre question en anglais orthographiquement correct!
sergiol

Réponses:

6

Perl 5,10 en utilisant une substitution, 231 228 226 224

@c=(north,east,south,west);
@q=qw(P PbR P-Q QbP Q QbR R-Q RbP);
sub p{$j=$_[0]>>3&3;$_=$q[7&pop];s/P/$c[$j]/;s/Q/$c[$j+1&2]$c[$j|1]/;s/R/$c[$j+1&3]/;s/b/ by /;ucfirst}
$a=<>/11.25+.5;
say$a==int$a&&'Between '.p($a-1).' and ',p$a

Ajout de quatre nouvelles lignes pour plus de lisibilité.

Edit: Golfed 2 octets de plus en utilisant pop. Merci @Dom Hastings

Modifier: 2 octets de moins en utilisantqw()

nwellnhof
la source
22

Je passe trop de temps sur cette chasse au trésor ici, mais voici une solution en Java :

public class Aaaaarrrr {

    public static void main(String[] aaarrrgs) {

        float heading = Float.parseFloat(aaarrrgs[0]);

        final List<String> points = Arrays.asList("North",
                "North by east", "North-northeast", "Northeast by north",
                "Northeast", "Northeast by east", "East-northeast",
                "East by north", "East", "East by south", "East-southeast",
                "Southeast by east", "Southeast", "Southeast by south",
                "South-southeast", "South by east", "South", "South by west",
                "South-southwest", "Southwest by south", "Southwest",
                "Southwest by west", "West-southwest", "West by south", "West",
                "West by north", "West-northwest", "Northwest by west",
                "Northwest", "Northwest by north", "North-northwest",
                "North by west");


        float cp = heading / 360.0f * 32.0f;
        if (cp % 1 == 0.5f)
             System.out.print("Between " + points.get((int)Math.floor(cp)) + " and ");

         System.out.println(points.get(Math.round(cp)));

    }
}

modifier Si je minimise le code ci-dessus et le rend vraiment laid, il deviendrait ceci:

Java, 770 caractères

import java.util.*;class A{public static void main(String[] r){List<String> l=Arrays.asList("North","North by east","North-northeast","Northeast by north","Northeast","Northeast by east","East-northeast","East by north","East","East by south","East-southeast","Southeast by east","Southeast","Southeast by south","South-southeast","South by east","South","South by west","South-southwest","Southwest by south","Southwest","Southwest by west","West-southwest","West by south", "West","West by north","West-northwest","Northwest by west","Northwest","Northwest by north","North-northwest","North by west");float c=Float.parseFloat(r[0])/360.0f*32.0f;if (c%1==0.5f) System.out.print("Between "+l.get((int)Math.floor(c))+" and ");System.out.println(l.get(Math.round(c)));}}
Jeen Broekstra
la source
24
+1 pouraaarrrgs
Danko Durbić
3
Je suis sûr que cela ne m'a pas aidé sur la règle des "gains de code les plus courts", mais puisque j'utilise Java de toute façon ...
Jeen Broekstra
J'admire l'approche, bien que vous utilisiez la Arrays.asListcommande, pardonnez-moi ici pour mon ignorance Java, mais n'est-ce pas en utilisant un tableau de stockage? Ou s'agit-il d'une manière sournoise d'introduire le tableau sous la forme d'une liste? ;)
WallyWest
@Jeen, pouvez-vous me montrer ce que vous pourriez obtenir si vous détruisez vraiment et réduisez le code là-bas?
WallyWest
2
@ Eliseod'Annunzio a écrit le tableau, je pensais que vous vouliez seulement dire que je ne pouvais pas l'utiliser pour stocker un mappage entre les noms et les intervalles de titre. Ce tableau (liste) stocke uniquement les noms réels. Mais si cela dépasse les règles, j'imagine que cela pourrait être modifié pour utiliser une switchinstruction à la place (avec quelques caractères supplémentaires, malheureusement). Oh et version condensée du même code ajoutée. Je vais penser à le réduire davantage en changeant réellement la façon dont cela fonctionne.
Jeen Broekstra
6

Python, 264

n='north'
e='east'
s='south'
w='west'
b=' by '
def f(H):x,y,z=(n,e,s,w,e,s,w,n,n+e,s+e,s+w,n+w)[int(H%360/90)::4];return(x,x+b+y,x+'-'+z,z+b+x,z,z+b+y,y+'-'+z,y+b+x)[int(H%90*4/45)].capitalize()
h=input()+5.625
print h%11.25and f(h)or'Between '+f(h-1)+' and '+f(h)

Cela utilise la capitalisation selon la page wikipedia et devrait fonctionner pour n'importe quel nombre.

grc
la source
1
Arrr, que ce soit une utilisation intelligente d'une fonction là-bas ...
WallyWest
4

Arrr Python, 336

A,R,r=int,input()/360.*32,' by #South#north#West#East#south#North#west#east#-#/#Between#and'.split('#')
a=''.join(r[A(c,16)]for c in'6A608A6928A6802A68A6808A4928A402A4A405A4958A1808A18A1805A1958A108A1A107A1957A1705A17A1707A3957A305A3A302A3927A6707A67A6702A6927A607').split('/')
if R%1==.5:print r[11],a[A(R)],r[12],
print a[A(round(R))]

Merci @Jeen

Demandes
la source
Je suis un peu confus ici @AsksAnyway, à quoi sert l 'utilisation du tha léviathan d'une chaîne? ... Arrr ...
WallyWest
Il "calcule" les noms des points cardinaux. C'est une façon de réduire la taille du code.
AsksAnyway
2

Perl 5.10, 262 257 254

Un peu similaire à l'une des solutions Python:

$n=north;$e=east;$s=south;$w=west;
@d=($n,$n.$e,$e,$s.$e,$s,$s.$w,$w,$n.$w,$n);
sub p{$j=pop;$i=$j>>2;ucfirst(($d[$i],"$d[$i] by $d[$i+2&~1]","$d[$i+1&~1]-$d[$i|1]","$d[$i+1] by $d[$i&~1]")[$j&3])}
$a=<>/11.25+.5;
say$a==int$a&&'Between '.p($a-1).' and ',p$a

Ajout de quatre nouvelles lignes pour plus de lisibilité.

Edit: trois octets de moins grâce à @Dom Hastings

nwellnhof
la source
Hé @nwellnhof, semble assez complet! Vous pouvez enregistrer quelques caractères supplémentaires, supprimer le ;à la fin de sub pet basculer shiftvers pop.
Dom Hastings
@nwellhoff Je ne savais pas que Perl pouvait accepter des chaînes sans qu'elles soient entre guillemets? (re: ligne 1)
WallyWest
1
@ Eliseod'Annunzio Perl accepte les chaînes sans guillemets en mode non strict si elles ne se heurtent pas aux noms de fonction ou aux mots réservés.
nwellnhof