Thar wieje!

21

Arrr ... Ahoj, ja mam nadzieję! Rozwinąć grot! Pełna na prawą burtę! Ach, poczuj wiatr we włosach!

Racja, moje serca ... Potrzebuję trochę twoich umiejętności kodowania! Moja załoga jest bardziej zmodernizowana niż ja ... Nadal wolę punkty kompasu (patrz tutaj, aby uzyskać więcej informacji, Arrr ...), podczas gdy moja załoga zawsze używa głowy Chcę być łatwym sposobem na przekształcenie tego twaddle'a, którego nazywają główką w to, co potrafię zrozumieć, Arrr!

Potrzebuję kodu, który „pobiera” dane liczbowe (dziesiętne są w porządku), takie jak „ 0 <= the headin' < 360i wypowiada odpowiedź jako najbliższy punkt kompasu! Arrr!

Oto kilka przykładów:

> heading 0.1

North

> heading 11.25

North by East

> heading 22.7

North Northeast

> heading 44.99

Northeast

> heading 91

East

Otóż, jeśli będziesz tak dawać, że spadnie dokładnie na środek dwóch punktów kompasu, nie martw się, moje serca ... Oczekuję, że kod wypluje Between <point 1> and <point 2>, np. heading 5.625powie: Between North and North by East To się dzieje tylko wtedy, gdy zmierzasz do spełnienia równania, w H = 5.625 + 11.25(N)którym H będzie zmierzać, a N będzie liczbą całkowitą od 0 do 31 włącznie ...

Dwa ograniczenia, że ​​...

1) Nie chcę, żebyście używali tablic do przechowywania swoich danych dla punktów lub głów ... To będzie oszustwo, proszę pana, i dostaniesz smak mojej blunderbuss ... To ma Trzeba się liczyć, tak jak w dawnych czasach! Arrr!

2) Wygrywa najkrótszy kod, albo będę sprawiał, że idziesz po desce ... Arrr!

WallyWest
źródło
10
50 '(Apostrof) w jednym pytaniu. Czapki z głów! : D
Wasi
Czy używanie obiektu w javascript z oszukiwaniem klawiszy numerycznych? Mam na myśli yaarrr! czy to oszukiwa, landlubber?
Tim Seguine,
1
Czy nie powinno to być „N być liczbą całkowitą od 0 do 31 włącznie”?
nwellnhof
@nwellnhof Masz rację! Zaktualizowano ... :)
WallyWest,
1
Myślę, że powinieneś uruchomić golfa, którego celem jest przetłumaczenie twojego pytania na poprawny ortograficznie język angielski!
sergiol

Odpowiedzi:

6

Perl 5.10 przy użyciu podstawienia, 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

Dodano cztery nowe znaki dla czytelności.

Edycja: Gra w golfa jeszcze 2 bajty za pomocą pop. Dzięki @Dom Hastings

Edycja: 2 bajty mniej przy użyciuqw()

nwellnhof
źródło
22

Za dużo czasu spędzam na szukaniu skarbów tutaj, ale oto rozwiązanie w Javie :

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)));

    }
}

edytuj Jeśli zminimalizuję powyższy kod i uczynię go naprawdę brzydkim, stałoby się tak:

Java, 770 znaków

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
źródło
24
+1 zaaaarrrgs
Danko Durbić
3
Jestem pewien, że nie pomogło mi to w przypadku zasady „najkrótszy kod wygrywa”, ale ponieważ i tak korzystam z Javy ...
Jeen Broekstra
Podziwiam to podejście, chociaż używasz Arrays.asListpolecenia, wybacz mi tutaj za moją ignorancję w Javie, ale czy to nie jest użycie macierzy pamięci? Czy jest to podstępny sposób wprowadzania tablicy w postaci listy? ;)
WallyWest
@Jeen, czy możesz mi pokazać, co możesz dostać, jeśli naprawdę trącisz i zmniejszysz tam swój kod?
WallyWest,
2
@ Eliseod'Annunzio napisał tablicę, myślałem, że chodziło ci tylko o to, że nie mogę użyć jej do przechowywania mapowania między nazwami a odstępami czasu. Ta tablica (lista) przechowuje tylko rzeczywiste nazwy. Ale jeśli wykracza to poza reguły, wyobrażam sobie, że można to zmienić, używając switchzamiast tego instrukcji (z kilkoma dodatkowymi znakami, niestety). Och i dodana skrócona wersja tego samego kodu. Zastanowię się nad dalszym zmniejszeniem go, poprzez zmianę sposobu jego działania.
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)

Używa to wielkich liter jak na stronie wikipedii i powinno działać dla dowolnej liczby.

grc
źródło
1
Arrr, to sprytne użycie funkcji ...
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))]

Dzięki @Jeen

Asks Anyway
źródło
Jestem trochę zdezorientowany tutaj @ Ask Anyway, co to za „użycie” tam lewiatana sznurka? ... Arrr ...
WallyWest,
„Oblicza” nazwy punktów kompasu. Jest to sposób na zmniejszenie rozmiaru kodu.
AsksAnyway
2

Perl 5.10, 262 257 254

Nieco podobny do jednego z rozwiązań 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

Dodano cztery nowe znaki dla czytelności.

Edycja: Trzy bajty mniej dzięki @Dom Hastings

nwellnhof
źródło
Hej @ nwellnhof, wygląda całkiem kompleksowo! Możesz zapisać jeszcze kilka znaków, usuwając ;koniec sub pi przełączając się shiftna pop.
Dom Hastings,
@nwellhoff Nie wiedziałem, że Perl może zaakceptować ciągi bez cytowania? (ponownie: wiersz 1)
WallyWest,
1
@ Eliseod'Annunzio Perl akceptuje ciągi bez cudzysłowów w trybie innym niż ścisły, jeśli nie kolidują one z nazwami funkcji lub zastrzeżonymi słowami.
nwellnhof