Dann bläst sie!

21

Arrr ... Ahoi da, ich maties! Lass das Großsegel los! Voll an Steuerbord! Ah, fühl den Wind in deinen Haaren!

Richtig, ich Herzchen ... Ich brauche ein bisschen von deinen Fähigkeiten als Programmierer! Meine Crew ist ein bisschen moderner als ich selbst ... Ich bevorzuge immer noch die Himmelsrichtungen (siehe hier für weitere Informationen, Arrr ...), während meine Crew immer einen Headin verwendet. Ich möchte diesen Trottel auf einfache Weise in das umwandeln, was ich verstehen kann, Arrr!

Was ich brauche, ist Code, der eine Zahl 0 <= the headin' < 360eingibt (Dezimalstellen sind in Ordnung), und die Antwort wird als der nächstgelegene Kompasspunkt ausgegeben! Arrr!

Hier einige Beispiele:

> heading 0.1

North

> heading 11.25

North by East

> heading 22.7

North Northeast

> heading 44.99

Northeast

> heading 91

East

Nun, wenn Sie so weit gehen, dass es genau in die Mitte von zwei Kompasspunkten fällt, ärgern Sie sich nicht, ich Herzliche ... Ich erwarte, dass der Code ausspuckt Between <point 1> and <point 2>zB heading 5.625wird sagen Between North and North by East Diese happenin nur sein für eine Headin Tha ‚sein satisfyin' der Gleichung H = 5.625 + 11.25(N)wobei H sein th‘ Headin und N eine ganze Zahl zwischen 0 und einschließlich 31 ist ...

Zwei Einschränkungen, die ...

1) Ich möchte nicht, dass Sie Arrays verwenden, um Ihre Daten für die Punkte oder den Kopf zu speichern. Das ist Betrug, Sir, und Sie wollen einen Vorgeschmack auf mich bekommen t 'berechnet werden, jus' wie die alten Tage! Arrr!

2) Der kürzeste Code gewinnt, oder ich mache dich fertig ... Arrr!

WallyWest
quelle
10
50 '(Apostroph) in einer einzigen Frage. Hut ab! : D
Wasi
Wird bei der Verwendung eines Objekts in Javascript mit numerischen Tasten betrogen? Ich meine, yaarrr! sei es betrogen, ya Landratte?
Tim Seguine
1
Sollte dies nicht "N ist eine ganze Zahl zwischen 0 und einschließlich 31" sein?
Nwellnhof
@nwellnhof Du hast recht! Aktualisiert ... :)
WallyWest
1
Ich denke, Sie sollten ein Codegolf starten, bei dem das Ziel darin besteht, Ihre Frage in orthographisch korrektes Englisch zu übersetzen!
Sergiol

Antworten:

6

Perl 5.10 mit 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

Zur besseren Lesbarkeit wurden vier neue Zeilen hinzugefügt.

Bearbeiten: Golfed 2 weitere Bytes mit pop. Vielen Dank an Dom Hastings

Bearbeiten: 2 Bytes weniger mitqw()

nwellnhof
quelle
22

Ich verbringe viel zu viel Zeit mit dieser Schatzsuche, aber hier ist eine Lösung in 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)));

    }
}

bearbeiten Wenn ich den obigen Code minimieren und machen es wirklich hässlich es dies werden würde:

Java, 770 Zeichen

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
quelle
24
+1 füraaarrrgs
Danko Durbić
3
Ich bin sicher, das hat mir bei der Regel "Kürzester Code gewinnt" nicht weitergeholfen, aber da ich sowieso Java verwende ...
Jeen Broekstra
Ich bewundere den Ansatz, obwohl Sie den Arrays.asListBefehl verwenden, entschuldigen Sie mich hier für meine Java-Unkenntnis, aber ist das nicht die Verwendung eines Speicherarrays? Oder ist dies eine hinterhältige Art, das Array in Form einer Liste einzuführen? ;)
WallyWest
@Jeen, kannst du mir zeigen, was du bekommen könntest, wenn du wirklich hupst und den Code dort reduzierst?
WallyWest
2
@ Eliseod'Annunzio für das Array, ich dachte, Sie meinten nur, ich könnte es nicht verwenden, um eine Zuordnung zwischen Namen und Überschriftenintervallen zu speichern. In diesem Array (Liste) werden nur die tatsächlichen Namen gespeichert. Wenn dies jedoch über die Regeln hinausgeht, kann es meiner Meinung nach geändert werden, indem switchstattdessen eine Anweisung verwendet wird (leider mit ein paar zusätzlichen Zeichen). Oh und komprimierte Version des gleichen Codes hinzugefügt. Ich werde darüber nachdenken, es weiter herunterzufahren, indem ich tatsächlich ändere, wie es funktioniert.
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)

Dies verwendet die Großschreibung gemäß der Wikipedia-Seite und sollte für jede Zahl funktionieren.

grc
quelle
1
Arrr, das ist eine kluge Verwendung einer Funktion dort ...
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))]

Vielen Dank @Jeen

AsksAnyway
quelle
Ich bin hier ein wenig verwirrt. ... Arrr ...
WallyWest
Es "berechnet" die Namen der Kompasspunkte. Dies ist eine Möglichkeit, die Codegröße zu reduzieren.
AsksAnyway
2

Perl 5.10, 262 257 254

Etwas ähnlich zu einer der Python-Lösungen:

$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

Zur besseren Lesbarkeit wurden vier neue Zeilen hinzugefügt.

Edit: Drei Bytes weniger dank @Dom Hastings

nwellnhof
quelle
Hey @nwellnhof, Sieht ziemlich umfangreich aus! Sie können noch ein paar Zeichen speichern, das Entfernen ;am Ende sub pund Schalter shiftauf pop.
Dom Hastings
@nwellhoff Ich wusste nicht, dass Perl Zeichenfolgen akzeptieren kann, ohne dass sie in Anführungszeichen stehen? (Re: Linie 1)
WallyWest
1
@ Eliseod'Annunzio Perl akzeptiert Zeichenfolgen ohne Anführungszeichen im nicht strengen Modus, wenn sie nicht mit Funktionsnamen oder reservierten Wörtern in Konflikt stehen.
Nwellnhof