Chuyển đổi độ sang một trong 32 điểm của la bàn


13

La bàn 32 điểm là ... thú vị, để nói rằng ít nhất.

hình ảnh

Bởi Denelson83 (Công việc riêng) [ GFDL hoặc CC-BY-SA-3.0 ], qua Wikimedia Commons

Thử thách của bạn là lấy thước đo độ và chuyển nó thành hướng trên la bàn 32 điểm.

Mỗi hướng là 11,25 (360/32) xa hơn so với trước đó. Ví dụ: N (phía bắc) là 0 độ, NbE (phía bắc theo hướng đông) là 11,25 độ, NNE (phía bắc-đông bắc) là 22,5 độ, v.v.

Đối với cách bạn cần có được chỉ đường,

  • 0 độ là N, 90 độ là E, 180 độ là S và 270 độ là W.

    • Chúng được gọi là hướng hồng y.
  • Các điểm giữa các hướng hồng y chỉ đơn giản là các hướng hồng y nằm giữa chúng. N hoặc S luôn đi đầu và W hoặc E luôn đứng thứ hai.

    • Chúng được gọi là hướng thứ tự.
  • Các điểm ở giữa các hướng chính và thông thường là các hướng giữa chúng được nối lại, một lần nữa, với dấu "-" ở giữa. Hướng hồng y đi trước, thứ hai thứ tự.

    • Chúng được gọi là hướng thứ cấp-giữa.
  • Các điểm giữa đường giữa các hướng phụ và các hướng khác là các hướng khác "bằng" hướng hồng y mà chúng gần nhất (dĩ nhiên không phải là hướng trực tiếp bên cạnh chúng).

    • Tôi không biết cái này được gọi là gì: P

Nếu tất cả lời giải thích này làm tổn thương não của bạn nhiều như của tôi, bạn có thể tham khảo biểu đồ này:

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

Dưới đây là một biểu đồ chi tiết hơn và có thể giải thích tốt hơn về các điểm của la bàn.

Thách thức của bạn là lấy đầu vào theo độ và xuất tên đầy đủ của hướng la bàn tương ứng với chữ viết tắt của nó.

Các trường hợp thử nghiệm:

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

Tất cả viết hoa phải được bảo tồn, như trong các trường hợp thử nghiệm. Số vị trí thập phân tối đa là 2. Tất cả các số đầu vào sẽ lớn hơn hoặc bằng 0 và nhỏ hơn 360. Nếu có dấu thập phân, sẽ có các chữ số ở cả hai bên (bạn không phải xử lý .1hoặc 1.).

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


@WallyWest Hmm, cái này cho phép các mảng, có cách viết hoa khác nhau và không có "giữa", nhưng tôi không nhận thấy điều đó (có thể vì ... tiêu đề thú vị: P). Tôi sẽ xem những gì tôi có thể làm để khiến nó đủ khác biệt ...
Doorknob

3
@WallyWest Ở đó, bây giờ bạn cũng phải xuất ra chữ viết tắt. Cùng với tất cả những khác biệt khác, điều đó là đủ để biến nó thành một bản sao. (ồ, cái này cũng có dấu gạch ngang)
Doorknob

@WallyWest Không có câu trả lời nào trong "R" cho câu hỏi trước đó của bạn (thậm chí không có câu nào trong "C"!) Tôi hy vọng chúng ta sẽ thấy một số lần này, các bạn cùng tàu!
Cấp sông St

Sẽ vui hơn nếu có đầu vào từ -360 đến 360 độ (tiêu cực có nghĩa là ngược chiều kim đồng hồ) và tiền thưởng!.
Mukul Kumar

Câu trả lời:


4

Perl, 250 236 231 188 187

Chỉnh sửa: Một số byte tắt khai thác tính đối xứng (như tôi đã thấy trong giải pháp @bazzargh)

+ Chỉnh sửa: Và một số thủ đoạn xấu xa ...

+ Chỉnh sửa : Quay lại nơi tôi đã bắt đầu (làm việc với danh sách, không phải chuỗi) và khai thác thêm tính đối xứng = tắt 1 byte và hoàn toàn xấu hơn.

$_=((@_=(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

In đẹp:

$_=(
    (@_=
        (
            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

5.014 yêu cầu vì rsửa đổi.


Bạn có một lỗi đánh máy trong mã của mình: sourth nên ở phía nam (câu lệnh thứ 2 bắt đầu bằng s / b / by ...
RononDex

3 regexps đầu tiên có thể được thay thế bằng y / NS / SN /; trong 10 ký tự
bazzargh

@bazzargh, vâng, và không chỉ vậy ;-)
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)

Bạn có thể sao chép mã này vào bàn điều khiển của bạn và thực thi nó. Nó nhắc bạn nhập độ và đưa ra kết quả vớialert();

Javascript có thể được tìm thấy tại fiddle này: http://jsfiddle.net/AezL3/11


+1 Đẹp nhưng hãy cẩn thận: "Tất cả viết hoa phải được bảo toàn, như trong các trường hợp thử nghiệm."

@BenH Trường hợp kiểm tra nào không kiểm tra viết hoa? Cảm ơn vì điều này, btw. Điều này có ích cho giao diện web của tôi, tôi đang viết.
Steven Lu

Nhân tiện, cái này không chết trong 355 độ đến 360 độ. Việc khắc phục rất dễ dàng. Chỉ cần thực calcPoint(32)hiện những gì 0 làm, vì vậy bạn có thể làm điều này với %32hoặc bất kỳ tương tự.
Steven Lu

@StevenLu tôi phải mất một thời gian để tìm hiểu ý của bạn, nhưng dòng var name = calcPoint(input % 32);này thực hiện thủ thuật
Orwellophile

4

Haskell 415 372 347 330 317 304 301C

Đã kết thúc hội tụ vào một giải pháp như @ VadimR's (và sự trở lại của đối xứng!). Cách sử dụng: h 219đầu ra"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)

Thêm 3 ký tự nữa, cảm ơn @shiona.


drop 1giống như đuôi. Ngoài ra nếu tôi không nhầm bạn có thể làm gì e l@(x:_)=x:tail$d lđể cạo vẫn còn một char nữa.
shiona

không thể tin rằng tôi đã bỏ lỡ điều đó. Cảm ơn!
bazzargh

0

Python 3,8 , 482 438 424 byte

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

Hãy thử trực tuyến!

Đây là những gì tôi nhận được sau khi chơi golf câu trả lời của tony goodwin ; được đăng ở câu trả lời của riêng mình do liên kết TIO quá dài cho một bình luận. Nếu anh ấy chọn cập nhật câu trả lời của mình lên trên, tôi sẽ xóa câu trả lời này.

Tôi giả định rằng có thể chấp nhận gửi một chức năng như một giải pháp thay vì một chương trình đầy đủ. Nếu không, đây là một chương trình đầy đủ với 426 byte.

Tôi hy vọng rằng nhiều điều vẫn có thể được thực hiện để rút ngắn b.

Chỉnh sửa: Đánh gôn 44 byte, lịch sự của con hải mã hùng vĩ. Vẫn không cảm thấy như bđược thực hiện được chơi golf.

Chỉnh sửa2: Tắt 14 cái khác bằng cách giải nén các ký tự thay vì sử dụng keys()items().


-1

Trăn, 2103 1647 1103 1034 924 889 848 byte

Rất muộn, tôi biết. Cảm ơn về thử thách, tôi đang thiết lập một từ kế cho hướng gió với Pi của mình và muốn có một giải pháp la bàn 16 điểm như thế này để đưa vào các thuật toán dự báo thời tiết. Tất cả mã của tôi là bằng Python, vì vậy đây là phiên bản của giải pháp javascript đã được đăng bằng Python, nhưng với một nút xoắn thêm mà bạn có thể chỉ định 32, 16 hoặc 8 điểm của la bàn ở biến j và tôi đã thay đổi bù của degHead trong câu lệnh trước nó, tùy thuộc vào số điểm. Tôi đã sử dụng một tên đổi tên được sửa đổi (và sử dụng các biến tôi có thể đổi tên mà không làm hỏng các từ!) Để đảm bảo tôi đáp ứng các yêu cầu trường hợp của câu hỏi.

Tôi biết điều này sẽ không thắng, vì Python thì dài dòng hơn, và tôi cũng vậy.

Phiên bản ngắn:

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

Xóa phiên bản

            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)

4
Câu trả lời này cho thấy không có nỗ lực chơi gôn và do đó có thể bị xóa vì không phải là đối thủ nặng ký cho thử thách
pppery

Điểm công bằng - Tôi đã đăng các nỗ lực chơi golf bây giờ.
tony goodwin

Tại sao bạn có quá nhiều vết lõm trong trình của bạn? Nó dường như không phải là một phần của câu trả lời của bạn, vì vậy tôi không thấy điểm của nó. Bạn cũng có thể chơi golf này nhiều hơn nữa, chỉ bằng cách xóa tất cả các khoảng trắng thừa, rút ​​ngắn tên biến và khai báo và loại bỏ hoàn toàn các biến dư thừa
Jo King

Cảm ơn Jo, tôi đã cập nhật lại phiên bản. Tôi đã nhận được tất cả?
tony goodwin

tái sử dụng một từ điển cho hồng y tốt hơn nhiều. Hết ý tưởng bây giờ. Hy vọng đủ điều kiện?
tony goodwin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.