Konwertuj stopnie na jeden z 32 punktów kompasu

13

32-punktowy kompas jest ... co najmniej interesujący.

wizerunek

Autor: Denelson83 (praca własna) [ GFDL lub CC-BY-SA-3.0 ], za pośrednictwem Wikimedia Commons

Twoim zadaniem jest zmierzyć stopień i przekonwertować go na 32-punktowy kompas.

Każdy kierunek jest o 11,25 (360/32) stopni dalej niż poprzedni. Na przykład N (północ) wynosi 0 stopni, NbE (północ na wschód) wynosi 11,25 stopni, NNE (północno-północny wschód) wynosi 22,5 stopnia itp.

Jeśli chodzi o sposób, w jaki należy uzyskać wskazówki,

  • 0 stopni to N, 90 stopni to E, 180 stopni to S, a 270 stopni to W.

    • Są to tak zwane kierunki kardynalne.
  • Punkty w połowie drogi między głównymi kierunkami są po prostu głównymi kierunkami, które znajdują się między połączonymi. N lub S zawsze są pierwsze, a W lub E zawsze są drugie.

    • Są to tak zwane kierunki porządkowe.
  • Punkty w połowie drogi między kierunkiem kardynalnym i porządkowym to kierunki, które są pomiędzy połączonymi, ponownie, z „-” pomiędzy nimi. Kierunki kardynalne idą pierwsze, porządkowe drugie.

    • Są to tak zwane kierunki wtórno-międzysercowe.
  • Punkty w połowie drogi między kierunkami wtórnie międzysercowymi a innymi kierunkami są innymi kierunkami „o” kierunkiem kardynalnym, do którego są najbliżej (oczywiście innym niż kierunek bezpośrednio obok nich).

    • Nie mam pojęcia, jak to się nazywa: P

Jeśli całe to wyjaśnienie boli mózg tak samo jak mój, możesz odnieść się do tej tabeli:

1   North               N
2   North by east       NbE
3   North-northeast     NNE
4   Northeast by north  NEbN
5   Northeast           NE
6   Northeast by east   NEbE
7   East-northeast      ENE
8   East by north       EbN
9   East                E
10  East by south       EbS
11  East-southeast      ESE
12  Southeast by east   SEbE
13  Southeast           SE
14  Southeast by south  SEbS
15  South-southeast     SSE
16  South by east       SbE
17  South               S
18  South by west       SbW
19  South-southwest     SSW
20  Southwest by south  SWbS
21  Southwest           SW
22  Southwest by west   SWbW
23  West-southwest      WSW
24  West by south       WbS
25  West                W
26  West by north       WbN
27  West-northwest      WNW
28  Northwest by west   NWbW
29  Northwest           NW
30  Northwest by north  NWbN
31  North-northwest     NNW
32  North by west       NbW

Oto bardziej szczegółowa tabela i być może lepsze wyjaśnienie punktów kompasu.

Twoim zadaniem jest przyjmowanie danych wejściowych w stopniach i podanie pełnej nazwy kierunku kompasu, któremu odpowiada, wraz ze skrótem.

Przypadki testowe:

Input  Output
0      North N
23.97  North-northeast NNE
33.7   Northeast by north NEbN
73.12  East-northeast ENE
73.13  East by north EbN
219    Southwest by south SWbS
275    West W
276    West by north WbN
287    West-northwest WNW

Wszystkie wielkie litery muszą być zachowane, tak jak w przypadkach testowych. Maksymalna liczba miejsc po przecinku wynosi 2. Wszystkie liczby wejściowe będą większe lub równe 0 i mniejsze niż 360. Jeśli występuje przecinek dziesiętny, po obu stronach będą cyfry (nie musisz obsługiwać .1ani 1.).

To jest , więc wygrywa najkrótszy kod w bajtach.

Klamka
źródło
@WallyWest Hmm, ten zezwala na tablice, ma inną wielkość liter i nie ma „między”, ale nie zauważyłem tego (prawdopodobnie z powodu ... interesującego tytułu: P). Zobaczę, co mogę zrobić, aby było wystarczająco inaczej ...
Klamka
3
@WallyWest Tam, teraz musisz również podać skrót. Wraz ze wszystkimi pozostałymi różnicami powinno to wystarczyć, aby był to tryb bez duplikatu. (och, także ten ma również myślniki)
Klamka
@WallyWest Nie ma odpowiedzi w „R” na poprzednie pytanie (nie było nawet w „C”!) Mam nadzieję, że tym razem zobaczymy, koledzy!
Level River St
Byłoby fajniej, gdyby były dane wejściowe od -360 do 360 stopni (ujemne oznacza przeciwnie do ruchu wskazówek zegara) i premia!
Mukul Kumar
Dla osób, które nie szukają wyzwania, łatwym rozwiązaniem jest znalezienie możliwej wydajności, dla której odległość jest minimalna od kąta wejściowego, za pomocą nazwy kąta tabeli wyszukiwania <->.
Rivenfall

Odpowiedzi:

4

Perl, 250 236 231 188 187

Edycja: Niektóre bajty nie wykorzystują symetrii (jak widziałem w rozwiązaniu @bazzargh)

+ Edycja: I niektóre złe sztuczki ...

+ Edycja : Powrót do miejsca, w którym zacząłem (praca z listą, a nie ciągiem) i wykorzystanie większej symetrii = 1 bajt off i dużo brzydsze.

$_=((@_=(1,@_=qw(1b3 1-13 13b1 13 13b3 3-13 3b1),3,map{y/1/2/r}reverse@_)),map{y/312/421/r}@_)[int<>/11.25+.5];print ucfirst s/\w/(' by ',north,south,east,west)[$&]/ger,' ',y/1-4-/NSEW/dr

Dość wydrukowane:

$_=(
    (@_=
        (
            1,
            @_=qw(1b3 1-13 13b1 13 13b3 3-13 3b1),
            3,
            map{y/1/2/r}reverse@_
        )
    ),map{y/312/421/r}@_
)[int<>/11.25+.5];

print ucfirst s/\w/(' by ',north,south,east,west)[$&]/ger,' ',y/1-4-/NSEW/dr

Wymagane 5.014 z powodu rmodyfikatora.

użytkownik 2846289
źródło
W kodzie jest literówka: sourth powinien być na południe (drugie zdanie zaczynające się od s / b / przez ...
RononDex
Te pierwsze 3 wyrażenia regularne można zastąpić y / NS / SN /; na 10 znaków
bazzargh
@bazzargh, tak, i nie tylko ;-)
user2846289
6

JavaScript 470 453 438 434 432 421 404

s=String;s.prototype.a=s.prototype.replace;var a=prompt()/11.25,a=a+0.5|0,b,k,c=a,d=c%8,c=c/8|0,e=["north","east","south","west"],f,g,h;f=e[c];g=e[(c+1)%4];h=f==e[0]|f==e[2]?f+g:g+f;b="1;1 by 2;1-C;C by 1;C;C by 2;2-C;2 by 1".split(";")[d].a(1,f).a(2,g).a("C",h);k=b.a(/north/g,"N").a(/east/g,"E").a(/south/g,"S").a(/west/g,"W").a(/by/g,"b").a(/[\s-]/g,"");b=b[0].toUpperCase()+b.slice(1);alert(b+" "+k)

Możesz skopiować ten kod do konsoli i go wykonać. Wyświetla monit o podanie stopni i podaje wynik za pomocąalert();

Niegolfowane Javascript można znaleźć pod tym skrzypkiem: http://jsfiddle.net/AezL3/11

RononDex
źródło
+1 Ładnie, ale bądź ostrożny: „Wszystkie wielkie litery muszą być zachowane, tak jak w przypadkach testowych”.
@BenH Który przypadek testowy nie przejdzie sprawdzania wielkości liter? Dzięki za to, btw. Przydało się to dla mojego interfejsu sieciowego, który piszę.
Steven Lu,
Nawiasem mówiąc, umiera to od 355 stopni do 360 stopni. Poprawka jest łatwa. Po prostu zrób calcPoint(32)to, co robi 0, abyś mógł to zrobić za pomocą %32lub podobnego.
Steven Lu
@StevenLu zajęło mi trochę czasu, aby dowiedzieć się, co znaczy, ale ta linia var name = calcPoint(input % 32);załatwia sprawę
Orwellophile
4

Haskell 415 372 347 330 317 304 301C

Skończyło się zbieżność na rozwiązaniu takim jak @ VadimR (i powrót symetrii!). Zastosowanie: h 219wyjścia"Southwest by south SWbS"

d"N"="north"
d"S"="south"
d"E"="east"
d"W"="west"
d"b"=" by "
d"-"="-"
d(x:y)=d[x]++d y
e(x:y)=x:tail(d$x:y)
k 'N'='S'
k 'S'='N'
k 'E'='W'
k x=x
r="N NbE N-NE NEbN NE NEbE E-NE EbN E EbS E-SE SEbE SE SEbS S-SE SbE "
p=words$r++(map k r)
g x=p!!mod(round$x/11.25)32
h x=e(g x)++(filter(/='-')$' ':g x)

Jeszcze 3 znaki, dzięki @shiona.

bazzargh
źródło
drop 1jest taki sam jak ogon. Również, jeśli się nie mylę, możesz zrobić, e l@(x:_)=x:tail$d laby ogolić jeszcze jeden węgiel.
shiona
nie mogę uwierzyć, że to przegapiłem. Dzięki!
bazzargh
0

Python 3.8 , 482 438 424 bajtów

lambda h:' '.join([b(h),a(a(a(b(h)),1),d={' by ':'b','-':''})])
L=str.lower
c={'North':'N','East':'E','South':'S','West':'W'}
a=lambda t,l=0,d=c:[*(t:=t.replace([i,L(i)][l],d[i])for i in[*d])][-1]
b=lambda h,k=[*c]:a('W|W by x|W-z|Z by w|Z|Z by x|X-z|X by w'.split('|')[int((q:=h*4/45+.5)%8)],d={'W':(W:=[*k][(v:=int(q//8)%4)]),'X':(X:=[*k][(v+1)%4]),'w':(w:=L(W)),'x':(x:=L(X)),'Z':(Z:=[W+x,X+w][W in'EastWest']),'z':L(Z)})

Wypróbuj online!

To właśnie otrzymałem po golfie odpowiedzi Tony'ego Goodwina ; opublikowany na własną odpowiedź z powodu zbyt długiego łącza TIO do komentarza. Jeśli zdecyduje się zaktualizować swoją odpowiedź na powyższe, usunę tę odpowiedź.

Zakładam, że dopuszczalne jest przesłanie funkcji jako rozwiązania, a nie pełnego programu. Jeśli nie, oto pełny program o 426 bajtach.

Oczekuję, że wiele można jeszcze zrobić, aby skrócić b.

Edycja: Golfed off 44 bajtów, dzięki uprzejmości majestatycznego morsa. Nadal nie czuję, bże gra się w golfa.

Edycja2: Ogoliłem kolejne 14, rozpakowując dykta zamiast używać keys()i items().

kałamarnica
źródło
-1

Python, 2103 1647 1103 1034 924 889 848 bajtów

Wiem bardzo późno. Dzięki za wyzwanie, ustawiam magnetometr dla kierunku wiatru za pomocą mojego Pi i chciałem 16-punktowego rozwiązania kompasu, aby włączyć się do algorytmów prognozowania pogody. Cały mój kod jest w Pythonie, więc tutaj jest wersja rozwiązania javascript już opublikowana w Pythonie, ale z dodatkowym zwrotem, że możesz określić 32, 16 lub 8 punktów kompasu w zmiennej j, a ja zmieniłem przesunięcie degHead w wyciągu przed nim, w zależności od liczby punktów. Użyłem zmodyfikowanego alogorytmu zmiany nazwy (i użyłem zmiennych, które mogłem zmienić bez zmieniania słów!), Aby upewnić się, że spełniłem wymagania dotyczące pytania.

Wiem, że to nie wygra, ponieważ Python jest bardziej niespokojny i ja też.

Krótka wersja:

  def a(t,d,l):
    for i,j in d.items():
      if l:
        i=i.lower()
      t=t.replace(i,j)
    return t
  def b(h,q):
    p=32
    r=360
    h=(h+(r/q/2))/(r/p)
    j=int(int(int(h %8)%8/(p/q))*p/q)
    h=int(h/8)%4
    k=c.keys()
    u=['W','W by x','W-z','Z by w','Z','Z by x','X-z','X by w']
    d={}
    d['W']=list(k)[h]
    d['w']=d['W'].lower()
    d['X']=list(k)[(h+1)%4]
    d['x']=d['X'].lower()
    if(d['W']=='North' or d['W']=='South'):
      d['Z']=d['W']+d['x']
    else:
      d['Z']=d['X']+d['w']
    d['z']=d['Z'].lower()
    return a(u[j],d,0)
  def g(n):
    n=a(n,c,0)
    n=a(n,c,1)
    d={'by':'b',' ':'','-':''}
    return a(n,d,0)
  def v(m):
    while True:
      try:
        return float(input(m))
      except ValueError:
        print("?")
  c={'North':'N','East':'E','South':'S','West':'W'}
  while True:
    h=v("?")
    n=b(h,32)
    print(h,n,g(n))

Wyczyść wersję

            import math
            import sys

            def calcPoint(degHead, points):
                maxPoints=32
                if points not in(8,16,32):
                    sys.exit("not a good question")
                degHead=(degHead+(360/points/2))/(360/maxPoints)
                j =int(int( int(degHead  % 8)%8/(maxPoints/points))*maxPoints/points)
                degHead = int(degHead / 8) % 4
                cardinal = ['North', 'East', 'South', 'West']
                pointDesc = ['W', 'W by x', 'W-z', 'Z by w', 'Z', 'Z by x', 'X-z', 'X by w']#vars not compass points
                W = cardinal[degHead]
                X = cardinal[(degHead + 1) % 4]
                w=W.lower()
                x=X.lower()
                if (W == cardinal[0] or W == cardinal[2]) :
                    Z =W + x
                else:
                    Z =X + w
                z=Z.lower()
                return pointDesc[j].replace('W', W).replace('X', X).replace('w', w).replace('x', x).replace('Z', Z).replace('z', z);

            def getShortName(name): 
                return name.replace('North', 'N').replace('East', 'E').replace('South', 'S').replace('West', 'W').replace('north', 'N').replace('east', 'E').replace('south', 'S').replace('west', 'W').replace('by', 'b').replace(' ', '').replace('-', '')

            def input_number(msg, err_msg=None):
                while True:
                    try:
                        return float(input(msg))
                    except ValueError:
                        sys.exit("not a number")

            while True:
                headingCalib=input_number("input a number: ")
                print (headingCalib, end=' ')
                name = calcPoint(headingCalib,32) #degrees heading, points of compass 8,16 or 32)
                print (name, end=' ')
                shortName = getShortName(name)
                print (shortName)
Tony Goodwin
źródło
4
Ta odpowiedź nie pokazuje próby gry w golfa i dlatego może zostać
usunięta,
Trzeba przyznać, że próbowałem grać w golfa.
Tony Goodwin,
Dlaczego masz tyle wcięć w swoim oświadczeniu? Nie wydaje się to częścią twojej odpowiedzi, więc nie widzę sensu. Możesz także zagrać w golfa o wiele więcej, usuwając wszystkie dodatkowe białe znaki, skracając nazwy i deklaracje zmiennych oraz usuwając całkowicie zbędne zmienne
Jo King,
Dzięki Jo, zaktualizowałem wersję ponownie. Czy dostałem to wszystko?
Tony Goodwin,
wielokrotnie korzystał ze słownika kardynałów. Teraz brak pomysłów. Mam nadzieję, że wystarczy, aby się zakwalifikować?
Tony Goodwin,