将度数转换为指南针的32个点之一


13

至少可以说,32点罗盘很有趣。

图片

由Denelson83(自己的作品)[ GFDLCC-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始终排在第二位。

    • 这些称为顺序指示。
  • 基本方向和顺序方向之间的中间点是它们之间的连接方向,再次之间是“-”。基本方向为第一,第二顺序。

    • 这些被称为次要心内方向。
  • 次要心轴方向与其他方向之间的中点是它们最接近的基本方向“旁”的其他方向(当然,不是紧邻其的那个方向)。

    • 我不知道这些叫做什么:P

如果所有这些解释都像我一样伤害您的大脑,您可以参考此图表:

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。如果存在小数点,则两边都将有数字(您不必处理.11.)。

这是,因此以字节为单位的最短代码获胜。


@WallyWest Hmm,这个允许数组,具有不同的大小写,并且没有“之间”,但是我没有注意到这一点(可能是因为...有趣的标题:P)。我会看到我能做些什么来使其与众不同……
Doorknob

3
@WallyWest在那里,现在您也必须输出缩写。加上所有其他差异,这足以使其成为非重复的。(哦,这个也有破折号)
门把手

@WallyWest您先前的问题在“ R”中没有答案(在“ C”中什至没有任何答案!)我希望我们这次能再见一些,船东!
水平河圣

如果输入的范围是-360至360度(负数表示逆时针),那么这会更加有趣!
Mukul Kumar 2014年

对于不希望挑战的人们,简单的解决方案是使用查找表角度<->名称找到距输入角度最小距离的可能输出。
Rivenfall

Answers:


4

Perl,250 236 231 188 187

编辑:利用对称性减少了一些字节(如我在@bazzargh解决方案中所见)

+编辑:还有一些恶作剧...

+ Edit:回到我开始的地方(使用列表,而不是字符串),并利用更多的对称性=关闭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 。


您的代码中有错别字:酸味应该在南方(第二条以s / b /
RononDex

前三个正则表达式可以用y / NS / SN /代替;10个字符
bazzargh 2014年

@bazzargh,是的,不仅如此;-)
user2846289

6

Java脚本 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();

可以在以下小提琴中找到未使用Java语言的Javascript:http//jsfiddle.net/AezL3/11


+1不错,但要小心:“必须保留所有大写字母,如在测试用例中一样。”

@BenH哪个测试用例未通过大写检查?谢谢你,顺便说一句。这对于我正在编写的Web界面非常有用。
史蒂文·卢

顺便说一下,它确实死了355度到360度。修复很容易。只需calcPoint(32)执行0的操作即可,因此您可以使用%32或任何类似的方法执行此操作。
史蒂文·卢

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

还有3个字符,谢谢@shiona。


drop 1和尾巴一样 另外,如果我没记错的话,您可以e l@(x:_)=x:tail$d l再刮一刮。
shiona 2014年

不敢相信我错过了。谢谢!
bazzargh 2014年

0

Python的3.8482个 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

编辑:雄伟的海象礼貌地击出了44个字节。仍然不觉得b高尔夫球已经完成。

Edit2:通过解压缩dict而不是使用keys()and来省掉另外14个items()


-1

Python,2103 1647 1103 1034 924 889 848字节

我知道很晚了。感谢挑战,我正在用Pi设置风向仪,并希望将这样的16点罗盘解决方案用于天气预报算法。我所有的代码都在Python中,所以这是Python中已经发布的javascript解决方案的版本,但有一点额外的变化,您可以在变量j处指定罗盘的32、16或8点,并且我已经更改了偏移量degHead在其前面的语句中的大小取决于点数。我使用了修改后的重命名alogorithm(并使用了可以在不破坏单词的情况下重命名的变量!)以确保满足问题的大小写要求。

我知道这不会赢,因为Python比较罗word,我也是。

简洁版本:

  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
该回答表明没有打高尔夫球的尝试,因此被认为不是挑战的
有力

公平点-我已经发布了打高尔夫球的尝试。
托尼·古德温

为什么您的提交中有那么多缩进?这似乎不是您的答案的一部分,所以我看不出要点。您还可以打高尔夫球这多很多,只是通过完全去除所有多余的空白,缩短变量名和声明,并去除多余的变量
乔金

感谢Jo,我再次更新了版本。我明白了吗?
托尼·古德温,

更好地为红衣主教重用了字典。现在没了主意。希望足够有资格吗?
托尼·古德温,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.