コンパスの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番目になります。

    • これらは順序方向と呼ばれます。
  • 基数方向と順序方向の中間点は、それらが連結された方向であり、やはり「-」が間にあります。枢機directions方向が最初になり、順序が2番目になります。

    • これらは、二次心内膜方向と呼ばれます。
  • 二次心内方向と他の方向との中間点は、それらが最も近い(もちろんそれらのすぐ隣の方向以外の)枢軸方向による「別の」方向です。

    • 私はこれらが何と呼ばれるのか分かりません: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未満です。小数点が存在する場合、両側に数字があります(.1またはを処理する必要はありません1.)。

これはであるため、バイト単位の最短コードが優先されます。


@WallyWestうーん、これは配列を許可し、大文字と小文字が異なり、「間に」はありませんが、そのことに気づきませんでした(おそらく興味深いタイトル:Pのため)。私はそれを十分に異なるものにするために何ができるかを見ていきます...
ドアノブ

3
@WallyWestここで、略語も出力する必要があります。他のすべての違いとともに、それを非重複にするのに十分なはずです。(ああ、これにもダッシュがあります)
ドアノブ

@WallyWest前の質問に対する "R"の答えはありません( "C"にはありませんでした!)今回は、船員の皆さん、お会いしましょう!
レベルリバーストリート

-360〜360度(負は反時計回りを意味する)からの入力とボーナスがあればもっと楽しかったでしょう。
ムクルクマール14

回答:


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があるべき(第二の文で始まること...によってS / B /
RononDex

これらの最初の3つの正規表現は、y / NS / SN /に置き換えることができます。10文字のために
bazzargh

@bazzargh、はい、それだけではありません
;

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)

このコードをコンソールにコピーして実行できます。度の入力を求められ、結果を出力しますalert();

ゴルフフィッシングされていない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)

@shionaに感謝します。


drop 1尾と同じです。また、私が間違えていなければ、もうe l@(x:_)=x:tail$d l1匹のチャーを剃ることができます。
潮ona 14

私がそれを見逃したとは信じられない。ありがとう!
バザーグ14

0

パイソン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:keys()とを使用する代わりに辞書をアンパックすることで、さらに14を削りましたitems()


-1

Python、2103 1647 1103 1034 924 889 848バイト

非常に遅く、私は知っています。チャレンジのおかげで、私はPiで風向の磁力計を設定し、天気予報アルゴリズムに入力するこのような16ポイントのコンパスソリューションが必要でした。私のコードはすべてPythonですので、ここではPythonにすでに投稿されているjavascriptソリューションのバージョンがありますが、変数jで32、16、または8ポイントのコンパスを指定できる余分なひねりを加えて、オフセットを変更しましたポイントの数に応じて、その前のステートメントのdegHeadの。変更された名前変更アルゴリズムを使用し(そして、単語を破損せずに名前を変更できる変数を使用しました!)、質問のケース要件を満たしていることを確認しました。

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

公正なポイント-私は今ゴルフの試みを投稿しました。
トニーグッドウィン

提出物になぜそれほど多くのインデントがあるのですか?それはあなたの答えの一部ではないようですので、私はそれの要点を見ません。あなたはすることもでき、ゴルフより多くの本、ちょうど、すべての余分な空白を削除する変数名と宣言を短縮し、完全に冗長な変数を除去することにより、
ジョー・キング

おかげで、私は再びバージョンを更新しました。私はそれをすべて手に入れましたか?
トニーグッドウィン

枢機inal用の辞書を再利用しました。アイデアはもうありません。うまくいけば資格を得るには?
トニーグッドウィン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.