オーストラリアへの発掘-対pod


24

バックグラウンド

数え切れない世代の子供たちは、穴を真下に掘った場合、どこに行き着くのか疑問に思っています。これは、当然のことながら、かなり危険ですが、とにかく...

対podは、地球の表面上で互いに正反対の点です。これは、2点の間に線が引かれた場合、地球の中心を通ることを意味します。

チャレンジ

ポイントを指定すると、その対anti点を見つけるプログラムまたは関数を作成します。

この課題では、ポイントは経度-緯度システムと度、アーク分、アーク秒を使用して表されます。対極を見つけるには、各縦座標(N <-> SおよびW <-> E)の方向を入れ替え、180度から経度縦座標を引きます。

例:
ポイントを取りN 50 26 23 W 4 18 29ます。指示を入れ替えてを表示しますS 50 26 23 E 4 18 29。経度縦座標を減算180 0 0与えるため175 41 31などの対掌体の座標を残しS 50 26 23 E 175 41 31

ルール

入力

妥当な形式の緯度経度座標のセット。各縦座標には、方向、度数、アーク分数、アーク秒数が含まれます。

出力

妥当な形式の対極の緯度経度座標。各縦座標には、方向、度数、アーク分数、アーク秒数が含まれます。

合理的に考えて、座標の各部分を明確に区別できることを意味します。

スペック

  • 緯度縦座標の方向はNまたはSであり、経度縦座標の方向はWまたはEです。
  • すべての座標値は整数です。度の値は、の間であろう090緯度のために、間0及び180経度のため。両方の縦のためのアーク分アーク秒の値は間であろう059
  • 縦座標のすべての値がの場合0、どちらの方向も受け入れられます。
  • 値をゼロで埋める必要はありません。
  • 緯度の縦座標は90度より大きくならず、経度の縦座標も度より大きくなりません180
  • 標準の抜け穴が適用されます。

テストケース

N 50 26 23 W 4 18 29 -> S 50 26 23 E 175 41 31

S 43 9 9 E 0 0 5     -> N 43 9 9 W 179 59 55

N 0 0 0 E 0 0 0      -> S/N 0 0 0 W/E 180 0 0 (either direction fine in each case)

S 1 2 3 W 4 5 6      -> N 1 2 3 E 175 54 54

S 9 21 43 W 150 7 59 -> N 9 21 43 E 29 52 1

S 27 40 2 W 23 0 0   -> N 27 40 2 E 157 0 0

N 0 58 37 W 37 0 0   -> S 0 58 37 E 143 0 0

便利なリンク

これはなので、バイト単位の最短回答が勝ちです!


これは合理的な形式ですか?4つの入力:3つの数字の配列、char、3つの数字の配列。改行で区切られています
ルイスメンドー

@LuisMendo誤解しない限り、3つの入力しか表示されません。余分な文字が必要だと思いますか?それは合理的な形式だと思います。合理的には、本質的には、座標の各部分を明確に区別できることを意味します。
TheBikingViking

はい、最初の文字を忘れました。ありがとう!
ルイスメンドー

3
「やや危険」?メイトは、本当の危険があるあなたがここに得れば
アンドリューグリム

1
@busukxuanより早く応答しなかったことをおApび申し上げます。スペックが必要とするので、私は、これらの形式の両方が合理的でないと言うであろうNSE、またはW冗長ながら、方向と0値が縦軸のどの成分を表すとしてた紹介曖昧。
TheBikingViking

回答:


1

05AB1E、37 34バイト

`60©3L<Rm*O3°648*s-®‰`s®‰s‚˜)'€Ã‡

説明した

`                                      # split input to 4 lines with longitude on top
 60©3L<Rm*O                            # convert longitude to seconds
            3°648*                     # longitude 180 0 0 in seconds
                  s-                   # subtract our longitude from this
                    ®‰`                # get seconds part
                       s®‰             # get minute and degrees part
                          s‚˜)         # join to list
                              '€Ã‡    # translate directions

オンラインで試す

編集:Adnanのおかげで3バイト保存されました。


あなたは圧縮することができます"NEWS"‘€Ã‘、あるいは'€Ã小文字が許可されている場合。
アドナン

@アドナン:いいね!文字列は既に非常に小さいため、圧縮については考えませんでした。
エミグナ16

6

JavaScript(ES6)、88バイト

(a,b,c,d,e,f,g,h)=>[a<'S'?'S':'N',b,c,d,e<'W'?'W':'E',!(g|h)+179-f,g|h&&!h+59-g,h&&60-h]

8つのパラメーターを受け取り、結果として配列を返します。期待aの一つであるN、またはS、同様eの一つですWか、E。計算:

  • fどちらかgまたはhゼロ以外の場合は179から減算する必要がありますが、両方ghゼロの場合は180 (借用がないため)であるため!(g|h)、179に追加されます。
  • gニーズは、両方の場合にゼロとgし、hゼロは、このようにしているg|h&&、それ以外の場合は場合は59から減算する必要があるh場合、非ゼロであるが60 h、したがって、(非ボローがないので)ゼロである!h59に添加されます。
  • h 既にゼロだった場合はゼロにする必要があります。それ以外の場合は、単に60から減算されます

これを見て別の方法は、バイナリで減算すること補数プラス我々が取るこの問題に翻訳追加の1を加えることにより達成されることを通知にあり179-f59-gそして59-hそして1追加59-h+ 1がある60-hが、これはその後、60であればそれが運びます、したがってh元々ゼロだった場合、望ましい結果はゼロです。59-gキャリーfrom hがある場合、つまりh元々ゼロだった場合に1を追加します。再び、我々は両方の場合には、この時間は起こるキャリー、可能にするために持っているgh、ゼロであり、我々はに1を追加し179-f、この場合には。


6

MATL、51バイト

'NS'tPXEii'WE'tPXE648e3i60:qXJZA-JYAtn3-?2:&)wJZAwh

入力形式:

'N'
[50 26 23]
'W'
[4 18 29]

出力フォーマット:

S
50 26 23
E
175  41  31

オンラインでお試しください!

説明

'NS'tPXE     % Take input (string) implicitly. Exchange 'N' and 'S'
i            % Take input (array)
i'WE'tPXE    % Take input (string). Exchange 'W' and 'E'
648e3        % Push 648000
i            % Take input (array)
60:qXJ       % Push [0 1 ... 59]. Copy into clipboard J
ZA           % Convert second input array from base 60 to decimal
-            % Subtract
JYA          % Convert to base 60
tn3-?        % If length exceeds 3
  2:&)       %   Split into first two elements and then the rest
  w          %   Swap
  JZA        %   Convert from base 60 to decimal
  wh         %   Swap, concatenate

2行目から最終行の説明にタイプミスがありますbnase
TheBikingViking

1
@TheBikingVikingありがとうございます!修正済み
ルイスメンドー

4

ラケット、199バイト

(λ(l)(cons(cons(if(eq?(caar l)'n)'s'n)(cdar l))(cons(if(eq?(cadr l)'e)'w'e)(list (- 180(+(caddr l)(sgn(foldl + 0(cdddr l)))))(modulo(- 60(+(fourth l)(sgn(fifth l))))60)(modulo(- 60(fifth l))60)))))

それは恐ろしく長いです。それをさらに短くするためにできることはおそらくいくつかありますが、震えは完全に終わりました。

cons2つのペアを取りますlists。1つは緯度用、もう1つは経度用です。各リストには、最初の項目として方向(小文字のラケット記号として)があり、それに続いて度、アーク分、アーク秒があります。同じ形式の出力

ラケットは、この2つのリストのペアを、最初の要素として別のリストを持つ単一のリストとして解釈します。これは、ペアが2つのリストであるかのように緯度と経度の両方にアクセスできるため、これはまったく問題ありません。

使用法:

>    (
     (λ(l)(cons(cons(if(eq?(caar l)'n)'s'n)(cdar l))(cons(if(eq?(cadr l)'e)'w'e)(list (- 180(+(caddr l)(sgn(foldl + 0(cdddr l)))))(modulo(- 60(+(fourth l)(sgn(fifth l))))60)(modulo(- 60(fifth l))60)))))
     (cons (list 's 43 9 9) (list 'e 0 0 5)))
'((n 43 9 9) w 179 59 55)

将来のコードでは'((n 43 9 9) (w 179 59 55))、2つのリストとして解釈できます。


4

Pyth、41 45 43 35バイト

K60-"NS"ww-"EW"wA.D-*3^K3iEKK+.DGKH

ベース60変換を使用して、度と分を秒に変換します。

I / O形式:

N
[1,2,3]
E
[4,5,6]

行を入力するたびに行が出力されるため、見栄えの良い形式にするために、CLIを使用して入力をパイプするか、より便利な方法としてオンラインPyth実装を使用できます

擬似コードで:

K60                                              K = 60
   -"NS"w                                        "NS".remove(input())
         w                                       print(input())
          -"EW"w                                 "EW".remove(input())
                A.D                              G,H = divmod(
                   -*3^K3                          3*K**3 -
                         iEK                         baseToDec(input(),K)),
                            K                      K)
                             +.DGKH              divmod(G,K)+H

@LuisMendoはあなたのものと同じですが、コンマ区切りのリストで、引用符はありません
-busukxuan

4

Python 2、140 122バイト

更新しました:

def f(c):x=([180,0,0],[179,59,60])[1<sum(c[6:8])];print['NS'['N'in c]]+c[1:4]+['EW'['E'in c]]+map(lambda x,y:x-y,x,c[5:8])

これは、わずかに異なるアプローチを使用します。分と秒に基づいて経度から減算する値を設定します。0分と秒がある場合は、度から180を引き、0分と秒がある場合は、それぞれd、m、sから179、59、および60を引きます。

元の:

def f(c):v=divmod;m,s=v((180-(c[5]+c[6]/60.+c[7]/3600.))*3600,60);d,m=v(m,60);print['NS'['N'in c]]+c[1:4]+['EW'['E'in c]]+map(round,[d,m,s])

入力をリストとして受け取ります:f(['N', 0, 0, 0, 'E', 0, 0, 0])、経度を10進度に変換し、180から減算し、度、分、秒に変換してリストを再構成し、プロセスの方向を反転します。

ゴルフをしていない:

def f(c):
    minutes,seconds=divmod((180-(c[5]+c[6]/60.+c[7]/3600.))*3600,60)
    degrees,minutes=divmod(minutes,60)
    print ['NS'['N'in c]]+c[1:4]+['EW'['E'in c]]+map(round,[degrees,minutes,seconds])

それを試してみてください


3

JavaScriptを、138 137 129 124 112 110

@ Neil´sコードに触発された2バイトの改善

f=a=>a.map((v,i,a)=>i%4?i>6?v&&60-v:i>5?(59-v+!a[7])%60:i>4?179-v+!(a[7]|a[6]):v:'NEWS'[3-'NEWS'.indexOf(v)]);
  • 入力=出力= 2x(1個の大文字と3個のint)を含む配列
  • Firefoxでテスト済み

食べない

f=a=>a.map((v,i,a)=>
i%4?
    i>6?v&&60-v              // 7: invert seconds - old: (60-v)%60
    :i>5?(59-v+!a[7])%60     // 6: invert minutes, increase if seconds are 0
    :i>4?179-v+!(a[7]|a[6])  // 5: invert degrees, increase if seconds and minutes are 0
    :v                       // 1,2,3: unchanged
:'NEWS'[3-'NEWS'.indexOf(v)] // 0,4: swap directions
);

テスト

<table id=out border=1><tr><th>in</th><th>out<th>expected</th><th>ok?</th></tr></table>
<script>
addR=(r,s)=>{var d=document.createElement('td');d.appendChild(document.createTextNode(s));r.appendChild(d)}
test=(x,e,f)=>{var y,r=document.createElement('tr');addR(r,x);addR(r,y=('function'==typeof f)?f(x):f);addR(r,e);addR(r,e.toString()==y.toString()?'Y':'N');document.getElementById('out').appendChild(r)}

samples=[
'N',50,26,23,'W',4,18,29,   'S',50,26,23,'E',175,41,31,
'S',43,9,9,'E',0,0,5,       'N',43,9,9,'W',179,59,55,
'N',0,0,0,'E',0,0,0,        'S',0,0,0,'W',180,0,0,
'S',1,2,3,'W',4,5,6,        'N',1,2,3,'E',175,54,54,
'S',9,21,43,'W',150,7,59,   'N',9,21,43,'E',29,52,1,
'S',27,40,2,'W',23,0,0,     'N',27,40,2,'E',157,0,0,
'N',0,58,37,'W',37,0,0,     'S',0,58,37,'E',143,0,0,
];
while (samples.length)
{
    x=samples.splice(0,8);
    e=samples.splice(0,8);
    test(x,e,h);
    test(e,x,h);
}
</script>

ああ、@ Neilも同じ考えを持っていたが、いくつかの短いパラメーター化
タイタス

2

Python 3、131 130バイト

def f(w,x,y,z):S=60;d=divmod;a,b,c=y;l,m=d(648e3-c-S*b-S*S*a,S);return w,"N" if x=="S" else "S",d(l,S)+(m,),"E" if z=="W" else "W"

形式:角度はの形式のタプルで(deg,min,sec)、方向はの形式Nです。2つの角度の4倍を出力し、それぞれに方向が続きます。

ゴルフされていないバージョン:

def f(latitude,NS,longitude,EW):
    degree,minute,second=longitude
    minute,second=divmod(648000-second-60*minute-60*60*degree,60)
    return latitude, "N" if NS=="S" else "S", divmod(minute,60)+(second,), "E" if EW=="W" else "W"

1
あなたは行って、120バイトに、このダウンを得ることができるdef f(w,x,y,z):S=60;d=divmod;a,b,c=y;l,m=d(648e3-c-S*b-S*S*a,S);return w,["S","N"][x=="S"],d(l,S)+(m,),["W","E"][z=="W"]という事実使って、この作品をTrueし、Falseと解釈できるの10、それゆえa if b else cに相当します[c, a][b]。ちなみに、元のコードにはタイプミスがあると思います。すべき x=="W"ことz=="W"
TheBikingViking

2

C#、310 269バイト

float[]t(string[]a,int n)=>a.Skip(n).Take(3).Select(float.Parse).ToArray();string A(string i){var s=i.Split(' ');var w=t(s,5);float a=180-(w[0]+w[1]/60+w[2]/3600),b=a%1*60;return(s[0][0]>82?"N":"S")+$" {string.Join(" ",t(s,1))} {(s[4][0]<70?'W':'E')} {a} {b} "+b%1*60;}

入力は1つの文字列です。.NetFiddleで試すことができます。

コード

float[]t(string[]a,int n)=>a.Skip(n).Take(3).Select(float.Parse).ToArray();
string A(string i) {
    var s=i.Split(' ');var w=t(s,5);float a=180-(w[0]+w[1]/60+w[2]/3600),b=a%1*60;
    return (s[0][0]>82?"N":"S")
        +$" {string.Join(" ",t(s,1))} {(s[4][0]<70?'W':'E')} {a} {b} "+b%1*60;
}

string入力としてaを受け取らず、a を受け取った場合char, float[], char, float[]、次のことができます。

C位、167 166 165 163 152 148 147 139のバイト

(s,n,e,w)=>{float a=180-(w[0]+w[1]/60+w[2]/3600),b=a%1*60;return(s>82?"N":"S")+$" {string.Join(" ",n)} {(e<70?'W':'E')} {a} {b} "+b%1*60;};

コード

(s,n,e,w) => {
    float a=180-(w[0]+w[1]/60+w[2]/3600),b=a%1*60;
    return(s>82?"N":"S")+$" {string.Join(" ",n)} {(e<70?'W':'E')} {a} {b} "+b%1*60;
};

また、を削除して3600代わりに164文字と166バイトに移動することもできます。使用すべきですか?


C#、150バイト

(s,n,m,p,e,w,x,y)=>{var t=new TimeSpan(180,0,0)-new TimeSpan(w,x,y);return(s>82?"N":"S")+$" {n} {m} {p} {(e<70?'W':'E')} {t.TotalHours} {t:%m\\ s}";};

コード

(s,n,m,p,e,w,x,y) => {
    var z=new TimeSpan(180,0,0)-new TimeSpan(w,x,y);
     return(s>82?"N":"S")+$" {n} {m} {p} {(e<70?'W':'E')} {z.TotalHours} {z:%m\\ s}";
};

より多くの.NETの方法!私は.NETにすべてのロジックを委譲struct TimeSpanし、I abがロジックの書式文字列を使用します。入力はchar, int, int, int, char, int, int, intです。これを共有して、いくつかのアイデアを出します。誰かが私よりも良い方法で改善するかもしれません。


残念ながら冗長です。
スティーブンH.

@Fawful異なる引数を持つ別のバージョンを投稿します。それほど冗長ではありませんか?私はまだ取り除くことはできませんstring.Join()...
aloisdgは回復モニカ言う

これはC#6.0
Yytsi

@TuukkaXはC#の最新バージョンであるため、指定しませんでした。C#7機能のようないくつかのun release機能を使用する場合に使用します。
aloisdgは、モニカの復活を

1
私はしていないまあ、returnて、私はあなたのテストを使用して...それを自分で追加する必要がありましたa('N', new float[] { 50, 26, 23 }, 'W', new float[] { 4, 18, 29 })私が得るS 50 26 23 E 175.6919 41.51642 30.98511-あなたはこのパス考えるでしょうか?
いつか

0

Java、199 177または151または134バイト

結果を印刷する177バイトソリューション

void t(int...a){int i=648000-(a[5]*3600+a[6]*60+a[7]);System.out.println(a[0]=='N'?"S":"N"+" "+a[1]+" "+a[2]+" "+a[3]+" "+(a[4]=='E'?"W":"E")+" "+i/3600+" "+i/60%60+" "+i%60);}

配列として結果を返す151バイトソリューション

Object[]y(int...a){int i=648000-(a[5]*3600+a[6]*60+a[7]);return new Object[]{a[0]=='N'?"S":"N",a[1],a[2],a[3],a[4]=='E'?"W":"E",i/3600,i/60%60,i%60};}

ラムダ表記を使用した場合は134バイト

a->{int i=648000-a[5]*3600-a[6]*60-a[7];return new Object[]{a[0]=='N'?"S":"N",a[1],a[2],a[3],a[4]=='E'?"W":"E",i/3600,i/60%60,i%60};}

0

C、188

main(int c,char**v){int n=*v[1]==78?83:78,e=*v[5]==69?87:69,b=648000-(atoi(v[6])*3600+atoi(v[7])*60+atoi(v[8]));printf("%c %s %s %s %c %d %d %d\n",n,v[2],v[3],v[4],e,b/3600,b/60%60,b%60);}

8つのプログラム引数が必要です。それ以外の場合は失敗します。のような引数を渡しますN 50 26 23 W 4 18 29。方向指示器はNSEW、大文字でなければなりません。


0

PostGIS、123バイト

Tool-For-The-Jobは、SQLの冗長性と、ジオメトリにキャストしたり戻したりする必要があるため、残念ながら冗長です。

CREATE FUNCTION f(p geography)
RETURNS geography
AS 'SELECT ST_Affine(p::geometry,1,0,0,-1,180,0)::geography' LANGUAGE sql;

一方、この単一の関数は、ポイント、ポイントのコレクション、またはより複雑な形状(オーストラリアとニュージーランドの海岸線全体など)を変換します。


0

PHP、148バイト

私のJavaScriptの答えと同じアプローチ、内訳を見てください

  • +16関数のオーバーヘッド
  • +17 $兆候の場合
  • 括弧の場合は+12(演算子の優先順位が異なります)
  • foreachPHP´sのため+4array_mapオーバーヘッドが大きいためです
  • +1の(60-$v)%60理由$v&&60-$vはPHPでブール値にキャストさ
  • -8オリジナルに取り組んで
  • -4 chrordおよび方向スワップのいくつかの算術を使用して

function f(&$a){foreach($a as$i=>$v)$a[$i]=$i%4?($i>6?(60-$v)%60:($i>5?(59-$v+!$a[7])%60:($i>4?179-$v+!($a[7]|$a[6]):$v))):chr(($i?156:161)-ord($v));}
  • 関数はオリジナルで動作します
  • 形式:2xの配列(1つの大文字、3つのint)

テスト

function out($a){if(!is_array($a))return$a;$r=[];foreach($a as$v)$r[]=out($v);return'['.join(',',$r).']';}
function cmp($a,$b){if(is_numeric($a)&&is_numeric($b))return 1e-2<abs($a-$b);if(is_array($a)&&is_array($b)&&count($a)==count($b)){foreach($a as $v){$w = array_shift($b);if(cmp($v,$w))return true;}return false;}return strcmp($a,$b);}
$samples=[
N,50,26,23,W,4,18,29,   S,50,26,23,E,175,41,31,
S,43,9,9,E,0,0,5,       N,43,9,9,W,179,59,55,
N,0,0,0,E,0,0,0,        S,0,0,0,W,180,0,0,
S,1,2,3,W,4,5,6,        N,1,2,3,E,175,54,54,
S,9,21,43,W,150,7,59,   N,9,21,43,E,29,52,1,
S,27,40,2,W,23,0,0,     N,27,40,2,E,157,0,0,
N,0,58,37,W,37,0,0,     S,0,58,37,E,143,0,0,
];
while ($samples)
{
    $xx=$x=array_splice($samples,0,8);
    $ee=$e=array_splice($samples,0,8);
    func($x); test($xx,$ee,$x);
    func($e); test($ee,$xx,$e);
}

放棄されたアイデア

  • キャリーフラグを使用したループアプローチなし:+5
  • キャリーフラグを使用して逆方向にループ:+7
  • これをPHP <5.4のプログラムに変えることはできましたが、気にする必要はありません:-3

0

Befunge、122 114 111バイト(110文字)

~"N"-v
 v"N"_"S"
v>,&.&.&.~"W"-
_"E"v"W"
+:v >,&"´"\-&"Z"*&
v\_\.00..@.-\"<".-1\ <
>1-.:"Z"/"<"\-\"Z"%:#^_\..@

入力形式:

N 50 26 23W 4 18 29

経度の方向とアークの秒が一緒に集まっている必要があることに注意してください

ここでコードをテストできます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.