แปลงองศาเป็นหนึ่งใน 32 คะแนนของเข็มทิศ


13

เข็มทิศ 32 จุดนั้น ... น่าสนใจที่จะพูดน้อยที่สุด

ภาพ

โดย Denelson83 (ทำงานของตัวเอง) [ GFDLหรือCC-BY-SA-3.0 ] ผ่านWikimedia Commons

ความท้าทายของคุณคือการวัดองศาและแปลงเป็นทิศทางบนเข็มทิศ 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 เป็นอันดับสองเสมอ

    • สิ่งเหล่านี้เรียกว่าทิศทางลำดับ
  • จุดกึ่งกลางระหว่างทิศทางที่สำคัญและลำดับเป็นทิศทางที่พวกเขาอยู่ระหว่างการตัดแบ่งอีกครั้งด้วย "-" ในระหว่าง ทิศทางที่สำคัญไปก่อนลำดับที่สอง

    • เหล่านี้เรียกว่าทิศทางรอง intercardinal
  • จุดกึ่งกลางระหว่างทิศทางรอง intercardinal และทิศทางอื่นคือทิศทางอื่น ๆ "โดย" ทิศทางสำคัญที่ใกล้ที่สุด (นอกเหนือจากที่อยู่ถัดจากพวกเขาแน่นอน)

    • ฉันไม่รู้ว่าสิ่งเหล่านี้เรียกว่าอะไร:

หากคำอธิบายทั้งหมดนี้ทำร้ายสมองของคุณได้มากเท่ากับของคุณคุณสามารถอ้างถึงแผนภูมินี้:

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"!) ฉันหวังว่าเราจะได้เห็นเพื่อน ๆ ในคราวนี้!
เลเวลริเวอร์เซนต์

คงจะสนุกกว่านี้ถ้ามีอินพุตจาก -360 ถึง 360 องศา (ลบหมายถึงทวนเข็มนาฬิกา) และโบนัส!
Mukul Kumar

สำหรับผู้ที่ไม่ได้มองหาความท้าทายทางออกที่ง่ายคือการหาเอาต์พุตที่เป็นไปได้ซึ่งระยะทางน้อยที่สุดจากมุมเข้าโดยใช้ชื่อมุมมองตารางการค้นหา <->
Rivenfall

คำตอบ:


4

Perl, 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

ต้องการ 5.014 เนื่องจากมีการrดัดแปลง


คุณมีการพิมพ์ผิดในรหัสของคุณ: sourthควรอยู่ทางทิศใต้ (คำสั่งที่ 2 ที่เริ่มต้นด้วยs / b / โดย ...
RononDex

3 regexps แรกเหล่านั้นสามารถถูกแทนที่ด้วย y / NS / SN /; for 10 chars
bazzargh

@bazzargh ใช่และไม่เพียง ;-)
2846289

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

Javascript Ungolfed สามารถพบได้ที่ซอนี้: http://jsfiddle.net/AezL3/11


+1 ดี แต่ระวัง: "การใช้ตัวพิมพ์ใหญ่ทั้งหมดต้องเก็บรักษาไว้เช่นเดียวกับในกรณีทดสอบ"

@BHH กรณีทดสอบใดที่ตรวจสอบตัวพิมพ์ใหญ่ไม่ได้ ขอบคุณสำหรับสิ่งนี้ btw สิ่งนี้มีประโยชน์สำหรับเว็บอินเตอร์เฟสที่ฉันเขียน
Steven Lu

โดยวิธีการนี้จะตาย 355 องศาถึง 360 องศา การแก้ไขเป็นเรื่องง่าย เพียงแค่calcPoint(32)ทำสิ่งที่ 0 ทำเพื่อให้คุณสามารถทำสิ่งนี้%32หรือสิ่งอื่นที่คล้ายคลึงกัน
Steven Lu

@StevenLu ฉันใช้เวลาสักครู่เพื่อค้นหาว่าคุณหมายถึงอะไร แต่บรรทัดvar name = calcPoint(input % 32);นี้ใช้กลอุบาย
Orwellophile

4

Haskell 415 372 347 330 317 304 301C

ลงเอยด้วยการมาหาทางออกเช่น @ VadimR's (และส่วนหลังของสมมาตร!) การใช้งาน: 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)

หายไป 3 ตัวอักษรอีกแล้วขอบคุณ @shiona


drop 1เหมือนกับหาง นอกจากนี้ถ้าฉันไม่เข้าใจผิดคุณสามารถทำได้e l@(x:_)=x:tail$d lเพื่อโกนหนวดอีกหนึ่งตัว
shiona

ไม่อยากจะเชื่อเลยว่าฉันพลาด ขอบคุณ!
bazzargh

0

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

ลองออนไลน์!

นี่คือสิ่งที่ฉันได้หลังจากเล่นกอล์ฟกับคำตอบของโทนี่กูดวิน ; โพสต์ด้วยคำตอบของตนเองเนื่องจากลิงก์ TIO ยาวเกินไปสำหรับความคิดเห็น หากเขาเลือกที่จะอัปเดตคำตอบของเขาไปด้านบนฉันจะลบคำตอบนี้

ฉันสมมติว่ามันเป็นที่ยอมรับในการส่งฟังก์ชั่นเป็นวิธีแก้ปัญหามากกว่าโปรแกรมเต็มรูปแบบ หากไม่มีนี่คือโปรแกรมเต็มรูปแบบที่ 426 ไบต์

ฉันคาดว่าจะสามารถย่นระยะเวลาbได้มาก

แก้ไข: Golfed off 44 ไบต์ความเอื้อเฟื้อของวอลรัสอันงดงาม ยังไม่รู้สึกเหมือนbถูกตีกอล์ฟ

Edit2:โกนออกอีก 14 โดยการเอาออก dicts แทนการใช้และkeys()items()


-1

Python, 2103 1647 1103 1034 924 889 848 ไบต์

ดึกมากฉันรู้ ขอบคุณสำหรับความท้าทายฉันกำลังตั้งค่า magnetometer สำหรับทิศทางลมด้วย Pi ของฉันและต้องการวิธีแก้ปัญหาเข็มทิศ 16 จุดเช่นนี้เพื่อป้อนเข้าสู่อัลกอริทึมการพยากรณ์อากาศ รหัสทั้งหมดของฉันอยู่ใน Python ดังนั้นนี่คือเวอร์ชันของโซลูชัน javascript ที่โพสต์แล้วใน Python แต่ด้วยการบิดพิเศษที่คุณสามารถระบุได้ทั้ง 32, 16 หรือ 8 จุดของเข็มทิศที่ตัวแปร j และฉันได้เปลี่ยนออฟเซ็ต ของ degHead ในคำสั่งก่อนหน้าขึ้นอยู่กับจำนวนคะแนน ฉันใช้ alogorithm เปลี่ยนชื่อแก้ไข (และใช้ตัวแปรฉันสามารถเปลี่ยนชื่อโดยไม่ทำลายคำ!) เพื่อให้แน่ใจว่าฉันตรงตามข้อกำหนดของกรณีของคำถาม

ฉันรู้ว่าสิ่งนี้จะไม่ชนะเนื่องจาก Python เป็นคนที่พูดมากและฉันก็เช่นกัน

เวอร์ชั่นสั้น:

  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

ขอบคุณ Jo ฉันได้อัปเดตเวอร์ชันอีกครั้งแล้ว ฉันได้รับมันทั้งหมดหรือไม่
tony goodwin

พจนานุกรมสำหรับพระคาร์ดินัลกลับมาใช้ใหม่ได้ดีขึ้นมาก หมดความคิดตอนนี้ หวังว่าจะมีคุณสมบัติเพียงพอหรือไม่
โท
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.