彼女は吹く!


21

Arrr ...アホイあそこ、私仲間!メインセールを展開!右boardいっぱい!ああ、あなたの髪に風を感じてください!

そう、私は心のこもった...ちょっとしたスキルが必要なんだ!私の乗組員は自分よりも現代的です... 私の乗組員は常に先頭に立っていますが、コンパスのポイントを優先しています(詳細はこちらを参照してください、Arrr ...)。 。私は、彼らが私が理解できるものにヘッディンを呼んでいる、このたたきを変換する簡単な方法です。

私が必要としているのは、コードを入力することです(0 <= the headin' < 36010進数でも大丈夫です)tha ' を入力し、最も近いコンパスポイントとしての答えを吐き出します!あら!

以下に例を示します。

> heading 0.1

North

> heading 11.25

North by East

> heading 22.7

North Northeast

> heading 44.99

Northeast

> heading 91

East

さて、もしあなたが 'ヘッディン'であるなら、それがまさに2つのコンパスポイントの真ん中に収まるようなものであるなら、 'あなたがたはフレットである'、私は心から...私はコードを吐き出すことを期待していますBetween <point 1> and <point 2>例えばはheading 5.625言うだろうBetween North and North by East 。これは、唯一のtha「にsatisfyin'方程式headinはhappeninもH = 5.625 + 11.25(N)Hが目」headin'とし、Nは、0と31までの間の整数であることが...

tho '...

1)ポイントやヘディンのデータを保存するために配列を使いたくありません...私はチートであり、サーであり、あなたは私の大嫌いな味です...これは持っています計算されて、昔のようにジュース!あら!

2)最短のコードが勝つか、または私はあなたが板を歩いていくよ... Arrr!


10
'単一の質問で50 (アポストロフィ)。脱帽!:D
ワシ14年

数値キーを不正に使用したjavascriptのオブジェクトを使用していますか?ヤァル!それはチートである、屋ランドラバー?
ティムセギーン14年

1
これは「Nは0から31までの整数です」ではないでしょうか?
nwellnhof

@nwellnhofそうですね!更新... :)
WallyWest

1
あなたの質問を正書法的に正しい英語に翻訳することが目標である場合、コードゴルフを始めるべきだと思います!
-sergiol

回答:


6

置換を使用して5.10、231 228 226 224

@c=(north,east,south,west);
@q=qw(P PbR P-Q QbP Q QbR R-Q RbP);
sub p{$j=$_[0]>>3&3;$_=$q[7&pop];s/P/$c[$j]/;s/Q/$c[$j+1&2]$c[$j|1]/;s/R/$c[$j+1&3]/;s/b/ by /;ucfirst}
$a=<>/11.25+.5;
say$a==int$a&&'Between '.p($a-1).' and ',p$a

読みやすくするために4つの改行が追加されました。

編集:を使用してさらに2バイトをゴルフしましたpop。ありがとう@Dom Hastings

編集:使用して2バイト少ないqw()


22

私はこの宝探しにあまりにも多くの時間を費やしていますが、Javaのソリューションは次のとおりです。

public class Aaaaarrrr {

    public static void main(String[] aaarrrgs) {

        float heading = Float.parseFloat(aaarrrgs[0]);

        final List<String> points = Arrays.asList("North",
                "North by east", "North-northeast", "Northeast by north",
                "Northeast", "Northeast by east", "East-northeast",
                "East by north", "East", "East by south", "East-southeast",
                "Southeast by east", "Southeast", "Southeast by south",
                "South-southeast", "South by east", "South", "South by west",
                "South-southwest", "Southwest by south", "Southwest",
                "Southwest by west", "West-southwest", "West by south", "West",
                "West by north", "West-northwest", "Northwest by west",
                "Northwest", "Northwest by north", "North-northwest",
                "North by west");


        float cp = heading / 360.0f * 32.0f;
        if (cp % 1 == 0.5f)
             System.out.print("Between " + points.get((int)Math.floor(cp)) + " and ");

         System.out.println(points.get(Math.round(cp)));

    }
}

編集上記のコードを最小化し、実際にくすると、次のようになります。

Java、770文字

import java.util.*;class A{public static void main(String[] r){List<String> l=Arrays.asList("North","North by east","North-northeast","Northeast by north","Northeast","Northeast by east","East-northeast","East by north","East","East by south","East-southeast","Southeast by east","Southeast","Southeast by south","South-southeast","South by east","South","South by west","South-southwest","Southwest by south","Southwest","Southwest by west","West-southwest","West by south", "West","West by north","West-northwest","Northwest by west","Northwest","Northwest by north","North-northwest","North by west");float c=Float.parseFloat(r[0])/360.0f*32.0f;if (c%1==0.5f) System.out.print("Between "+l.get((int)Math.floor(c))+" and ");System.out.println(l.get(Math.round(c)));}}


3
私は、「最短コード勝ち」ルールに私を助けていなかったこと確信しているが、私は...とにかくJavaを使用していますので、
Jeen Broekstra

Arrays.asListコマンドを使用しているにも関わらず、このアプローチを賞賛します。Javaの無知についてはここでご容赦ください。しかし、ストレージアレイを使用しているのではないでしょうか。または、これはリストの形式で配列を導入する卑劣な方法ですか?;)
WallyWest 14年

@Jeen、もしあなたが本当にホーンを鳴らし、そこでコードを減らすことができたら、何を得ることができるかを見せてくれますか?
WallyWest

2
@ Eliseod'Annunzioは配列について、名前と見出しの間隔の間のマッピングを保存するためにそれを使用できないことを意味すると思った。この配列(リスト)は実際の名前のみを格納します。しかし、それが規則を超えている場合は、switch代わりに文を使用するように変更できると思います(残念ながらいくつかの余分な文字を使用)。ああ、同じコードの要約バージョンが追加されました。実際に動作を変更することで、さらに削ることを考えます。
ジェーンBroekstra 14年

6

Python、264

n='north'
e='east'
s='south'
w='west'
b=' by '
def f(H):x,y,z=(n,e,s,w,e,s,w,n,n+e,s+e,s+w,n+w)[int(H%360/90)::4];return(x,x+b+y,x+'-'+z,z+b+x,z,z+b+y,y+'-'+z,y+b+x)[int(H%90*4/45)].capitalize()
h=input()+5.625
print h%11.25and f(h)or'Between '+f(h-1)+' and '+f(h)

これは、ウィキペディアのページごとに大文字を使用し、任意の数で機能します。


1
Arrr、それは...そこに関数の賢い利用可能
WallyWest

4

Arrr Python、336

A,R,r=int,input()/360.*32,' by #South#north#West#East#south#North#west#east#-#/#Between#and'.split('#')
a=''.join(r[A(c,16)]for c in'6A608A6928A6802A68A6808A4928A402A4A405A4958A1808A18A1805A1958A108A1A107A1957A1705A17A1707A3957A305A3A302A3927A6707A67A6702A6927A607').split('/')
if R%1==.5:print r[11],a[A(R)],r[12],
print a[A(round(R))]

ありがとう@Jeen


私はここで少し混乱しています@AsksAnyway、文字列のレヴィアタンがありますか?... Arrr ...
WallyWest

コンパスポイントの名前を「計算」します。これは、コードサイズを削減する方法です。
AsksAnyway 14年

2

5.10、262 257 254

Pythonソリューションの1つに多少似ています:

$n=north;$e=east;$s=south;$w=west;
@d=($n,$n.$e,$e,$s.$e,$s,$s.$w,$w,$n.$w,$n);
sub p{$j=pop;$i=$j>>2;ucfirst(($d[$i],"$d[$i] by $d[$i+2&~1]","$d[$i+1&~1]-$d[$i|1]","$d[$i+1] by $d[$i&~1]")[$j&3])}
$a=<>/11.25+.5;
say$a==int$a&&'Between '.p($a-1).' and ',p$a

読みやすくするために4つの改行が追加されました。

編集: @Dom Hastingsのおかげで3バイト少なくなりました


@nwellnhofさん、とても包括的に見えます!さらに文字を保存;し、末尾のを削除してにsub p切り替えるshiftことができpopます。
ドムヘイスティングス14年

@nwellhoff Perlが文字列を引用符で囲まずに受け入れることができるとは知りませんでしたか?(re:line 1)
WallyWest 14年

1
@ Eliseod'Annunzio Perlは、関数名または予約語と衝突しない場合、非厳密モードで引用符なしの文字列を受け入れます。
nwellnhof
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.