나침반을 32 점 중 하나로 변환


13

32 점 나침반은 ... 흥미 롭습니다.

영상

작성자 : Denelson83 (자체 작품) [ GFDL 또는 CC-BY-SA-3.0 ], 위키 미디어 공용

당신의 도전은 정도를 측정하여 32 포인트 나침반의 방향으로 변환하는 것입니다.

각 방향은 이전보다 11.25 (360/32) 더 먼 거리입니다. 예를 들어, N (북쪽)은 0도, NbE (북쪽 동쪽)는 11.25도, NNE (북동쪽)는 22.5도 등입니다.

지시를받는 방법은

  • 0 도는 N, 90 도는 E, 180 도는 S, 270 도는 W입니다.

    • 이것을 기본 방향이라고합니다.
  • 기본 방향 사이의 중간 지점은 단순히 연결된 기본 방향입니다. N 또는 S가 항상 먼저 가고 W 또는 E가 항상 두 번째입니다.

    • 이것을 서수 방향이라고합니다.
  • 기본 방향과 서수 방향 사이의 중간 지점은 다시 연결되는 방향이며 그 사이에 "-"가 있습니다. 기본 방향이 먼저, 서수로 두 번째로 이동합니다.

    • 이를 2 차 심혈관 방향이라고합니다.
  • 이차-심근 간 방향과 다른 방향 사이의 중간 지점은 가장 가까운 기본 방향 (물론 바로 옆에있는 것 이외의 다른 방향)에 의한 다른 방향입니다.

    • 나는 이것이 무엇인지 모른다.

이 모든 설명이 나의 뇌만큼 상처를 입히면이 차트를 참조하십시오.

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

다음은 나침반의 요점에 대한 자세한 차트와 가능한 더 나은 설명입니다.

도전 과제는 각도로 입력하고 약어와 함께 해당 나침반 방향의 전체 이름을 출력하는 것입니다.

테스트 사례 :

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

테스트 사례에서와 같이 모든 대문자를 유지해야합니다. 소수점의 최대 수는 2. 모든 입력 숫자가 0으로 동일하고, 소수점이 존재하는 적은 경우, 360보다 (당신이 처리 할 수없는 양쪽에 자리가있을 것보다 더 큰 것입니다 .1또는 1.).

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.


@WallyWest 흠, 이것은 배열을 허용하고 대문자가 다르며 "사이에"가 없지만 그 사실을 알지 못했습니다 (아마도 흥미로운 제목으로 인해 : P). 내가 충분히 다른 것을 만들기 위해 내가 무엇을 할 수 있는지 볼 것이다 ...
Doorknob

3
@WallyWest 이제 약어도 출력해야합니다. 다른 모든 차이점과 함께, 그것이 비 중복이되기에 충분해야합니다. (오, 이것도 대시도 있습니다)
Doorknob

@WallyWest 이전 질문에 대한 "R"의 답은 없습니다 ( "C"에는 아무 것도 없었습니다!). 이번에는 우리가 볼 수 있기를 바랍니다.
Level River St

-360에서 360도 (음수는 시계 반대 방향)와 보너스가 있다면 더 재미 있었을 것입니다!.
Mukul Kumar

도전을 찾고 있지 않은 사람들을 위해 쉬운 해결책은 룩업 테이블 각도 <-> 이름을 사용하여 입력 각도에서 거리가 최소 인 가능한 출력을 찾는 것입니다.
Rivenfall

답변:


4

250 236 231 188 187

편집 : @bazzargh 솔루션에서 본 것처럼 대칭을 악용하는 일부 바이트

+ 편집 : 그리고 몇 가지 악한 속임수 ...

+ 편집 : 내가 시작한 곳으로 돌아가고 (문자열이 아닌 목록으로 작업) 더 많은 대칭 = 1 바이트를 사용하고 훨씬 추악합니다.

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

예쁜 인쇄 :

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

r수정 자 때문에 5.014가 필요합니다 .


당신은 당신의 코드에 오타가 있습니다 sourth가 있어야한다 남쪽 (2 차 진술 그와 함께 시작 S / B /로 ...
RononDex

처음 3 개의 정규 표현식은 y / NS / SN /으로 대체 될 수 있습니다. 10
자를

@bazzargh, 예,뿐만 아니라 ;-)
user2846289

6

자바 스크립트 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)

이 코드를 콘솔에 복사하여 실행할 수 있습니다. 각도 입력을 요구하고 결과를 다음과 같이 출력합니다.alert();

Ungolfed Javascript는이 바이올린에서 찾을 수 있습니다 : http://jsfiddle.net/AezL3/11


+1 훌륭하지만주의하십시오 : "테스트 사례에서와 같이 모든 대문자를 유지해야합니다."

@BenH 어떤 테스트 사례가 대문자 검사에 실패합니까? 이것에 감사합니다, btw. 이것은 내가 쓰고있는 웹 인터페이스에 유용했습니다.
Steven Lu

그건 그렇고, 이것은 355도에서 360도까지 죽습니다. 수정이 쉽습니다. 그냥 만들 calcPoint(32)당신이 작업을 수행 할 수 있도록, 0이 무엇을 할 %32또는 유사한.
Steven Lu

@StevenLu은 당신이 무엇을 의미하는지 알아낼 걸 렸어요하지만,이 라인은 var name = calcPoint(input % 32);트릭을 수행
Orwellophile을

4

하스켈 415 372 347 330 317 304 301C

@VadimR과 같은 솔루션에 집중했습니다 (그리고 대칭이 돌아 왔습니다!). 사용법 : h 219출력"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)

@shiona에게 감사드립니다.


drop 1꼬리와 같습니다. 또한 내가 실수하지 않으면 e l@(x:_)=x:tail$d l여전히 하나 이상의 숯을 면도 할 수 있습니다 .
shiona

내가 그것을 놓쳤다는 것을 믿을 수 없다. 감사!
bazzargh

0

파이썬 3.8 , 482 438 424 바이트

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

온라인으로 사용해보십시오!

이것은 tony goodwin의 답변을 골프로 얻은 후에 얻은 것입니다 . 댓글에 대한 TIO 링크가 너무 길어서 자체 답변에 게시되었습니다. 그가 위의 답변을 업데이트하기로 선택하면이 답변을 삭제합니다.

전체 프로그램이 아닌 솔루션으로 함수를 제출하는 것이 허용된다고 가정합니다. 그렇지 않은 경우 다음 은 426 바이트의 전체 프로그램입니다.

나는 많은 캔이 여전히 단축 할 것으로 기대합니다 b.

편집 : 웅장한 해마의 호의로 44 바이트에서 골프를 쳤습니다. 아직도 b골프를 치고있는 것 같은 느낌이 들지 않습니다 .

Edit2 :keys() and 대신 dicts를 압축 해제하여 다른 14 개를 제거했습니다 items().


-1

파이썬, 2103 1647 1103 1034 924 889 848 바이트

매우 늦습니다. 도전 과제 덕분에 Pi로 풍향에 대한 자력계를 설정하고 기상 예측 알고리즘에 공급하기 위해 이와 같은 16 포인트 나침반 솔루션을 원했습니다. 내 모든 코드는 Python에 있으므로 여기에 이미 Python으로 게시 된 Javascript 솔루션 버전이 있지만 변수 j에서 나침반의 32, 16 또는 8 점을 지정할 수있는 추가 왜곡이 있으며 오프셋을 변경했습니다. 점의 수에 따라 이전 명령문의 degHead 질문의 사례 요구 사항을 충족시키기 위해 수정 된 이름 바꾸기 알고리즘 (및 단어를 손상시키지 않고 이름을 바꿀 수있는 변수를 사용했습니다!)을 사용했습니다.

파이썬이 더 장황하기 때문에 이것이 이길 수 없다는 것을 알고 있습니다.

짧은 버전 :

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

클리어 버전

            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
이 답변은 골프에 대한 시도를 보여주지 않기 때문에 도전에 대한 심각한 경쟁자가 아닌 것으로 삭제 될 수 있습니다
pppery

페어 포인트-나는 골프에 대한 시도를 게시했습니다.
tony goodwin

제출물에 왜 들여 쓰기가 많은가요? 그것은 당신의 대답의 일부가 아닌 것 같습니다. 그래서 나는 그 요점을 보지 못합니다. 여분의 공백을 모두 제거하고 변수 이름과 선언을 줄이며 중복 변수를 모두 제거하는 것만으로도 훨씬 더 많은 골프를
Jo King

감사합니다 조, 버전을 다시 업데이트했습니다. 다 가져 왔어?
tony goodwin

추기경 사전을 훨씬 더 잘 재사용했습니다. 아이디어가 부족합니다. 희망적으로 자격을 갖추 었습니까?
tony goodwin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.