호주 발굴-대지


24

배경

수많은 세대의 어린이들이 구멍을 직접 아래쪽으로 파면 어디에서 끝날지 궁금해하고 있습니다. 이것은 의심 할 여지없이 다소 위험 하지만 어쨌든 ...

대각 대는 지구 표면에서 서로 반대편에있는 점입니다. 즉, 두 점 사이에 선이 그려지면 지구 중심을 통과하게됩니다.

도전

포인트가 주어진다면 그 안티 포드를 찾는 프로그램이나 함수를 작성하십시오.

이 도전에서, 포인트는 경도-위도 시스템과도, 아크 분 및 아크 초를 사용하여 표현됩니다. antipode를 찾으려면 각 세로 좌표 ( N <-> SW <-> E)의 방향을 바꾸고 경도 세로 좌표를 빼십시오 180.

예 :
요점을 참고하십시오 N 50 26 23 W 4 18 29. 제공 할 방향을 바꿉니다 S 50 26 23 E 4 18 29. 에서 경도 좌표를 빼기 180 0 0175 41 31과 대척 좌표를 떠나 S 50 26 23 E 175 41 31.

규칙

입력

각 세로 좌표에 방향, 각도, 호 수 및 호 수를 포함하는 합리적인 형식 의 위도-경도 좌표 세트 .

산출

각 포좌는 방향, 각도, 아크 분 및 아크 초 수를 포함하는 합리적 형식 의 적극의 위도-경도 좌표 .

좌표의 각 부분을 명확하게 구별 할 수 있음을 의미하는 것이 합리적입니다.

명세서

  • 위도 좌표의 방향은 N또는 S이고 경도 좌표의 방향은 W또는 E입니다.
  • 모든 좌표 값은 정수입니다. 도 값 사이에있을 것이다 090위도, 사이 0180경도. 두 좌표의 아크 분 및 아크 초 값은 사이 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 개의 숫자 배열, 문자, 3 개의 숫자 배열; 개행 문자로 구분
Luis Mendo

@LuisMendo 내가 당신을 오해하지 않는 한, 나는 단지 세 개의 입력을 볼 수 있습니다; 나는 당신이 여분의 문자를 원한다고 가정합니까? 나는 그것이 합리적인 형식이라고 말합니다. 합리적으로, 본질적으로 좌표의 각 부분을 명확하게 구별 할 수 있음을 의미합니다.
TheBikingViking

예, 첫 번째 문자를 잊었습니다. 감사!
Luis Mendo

3
"더 위험한"? 메이트는 진짜 위험은 당신이 여기 일단 .
Andrew Grimm

1
@busukxuan 더 빨리 응답하지 않아서 죄송합니다. 나는 사양이 필요로하기 때문에 그 형식 모두 합리적인하지 말 것 N, S, E, 또는 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"할 수 있습니다 . ‘€Ã‘'€Ã
Adnan

@Adnan : 니스! 끈이 너무 작아서 압축을 생각하지 않았습니다.
Emigna

6

자바 스크립트 (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요구가있는 경우 (179)로부터 감산되는 하나 g또는 h제로이지만 모두의 경우 180 gh(어떠한 빌림이 없기 때문에) 제로가 포함된다 !(g|h)179에 추가된다.
  • g필요하다면 모두 제로로 g하고 h제로가 포함된다 g|h&&, 그렇지 않은 경우는 (59)로부터 감산 될 필요가 h있으면 제로이지만, 60 h, 따라서, (더 차용이 없기 때문에) 제로 !h59에 부가된다.
  • h 이미 0이면 0이어야합니다. 그렇지 않으면 단순히 60에서 뺍니다.

이 바라 보는 또 다른 방법은 이진 뺀 것은 1 초 보완 플러스 우리가 가지고이 문제에 번역 추가 1을 추가하여 달성되는 것을 통지하는 것입니다 179-f, 59-g59-h과 1 추가 59-h+ 1은 60-h, 그러나 이것은 다음 60 인 경우는 전달 따라서 h원래 0 인 경우 원하는 결과는 0입니다. 59-g에서 캐리가있는 h경우, 즉 h원래 0 인 경우 1을 추가 합니다. 다시 우리는 둘 경우이 시간이 발생하는 캐리를 허용해야 g하고 h제로이며, 우리는에 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

두 번째 줄부터 마지막 ​​줄까지 오타가 있습니다 bnase.
TheBikingViking

1
트윗 담아 가기 수정
Luis Mendo

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

엄청나게 길다. 이 내가 그것을 더 단축 할 수있는 몇 가지 아마, 그러나 부르르 내가 완전히 끝났어요.

위도와 경도를위한 cons두 쌍을 취합니다 lists. 각 목록에는 첫 번째 항목으로 방향 (소문자 라켓 기호로 표시됨)이 있고 그 다음에도, 아크 분 및 아크 초가 있습니다. 같은 형식으로 출력

라켓은이 두 목록 쌍을 하나의 목록으로 해석하고 다른 목록을 첫 번째 요소로 해석합니다. 위도 및 경도가 한 쌍의 두 목록 인 것처럼 여전히 위도와 경도에 모두 액세스 할 수 있기 때문에 이것은 완벽하게 좋습니다.

용법:

>    (
     (λ(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))에서는 두 목록 으로 해석 될 수 있습니다 .


4

Pyth, 41 45 43 35 바이트

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

base-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

파이썬 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])으로 가져옵니다. 경도를 십진수로 변환하고 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

자바 스크립트, 138 137 129 124 112 110

@Neil의 코드에서 영감을 얻은 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 개의 정수)를 포함하는 배열
  • 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도 같은 생각을했지만 좀 더 짧은 매개 변수를
Titus

2

파이썬 3, 131130 바이트

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;}

입력은 하나의 문자열입니다. .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 를 사용 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;
};

또한를 제거하고 대신 164 문자 및 166 바이트로 이동하는 데 3600사용할 수 있습니다 . 사용해야합니까?


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내가 AB는 논리를 포맷 문자열을 사용합니다. 입력은 char, int, int, int, char, int, int, int입니다. 이 아이디어를 공유하기 위해이 정보를 공유합니다. 어쩌면 누군가 나보다 더 나은 방법으로 개선 될 것입니다.


불행히도 장황하다.
Steven H.

@Fawful 다른 인수로 다른 버전을 게시합니다. 덜 장황하지 않습니까? 난 여전히 제거 할 수 없습니다 string.Join()...
aloisdg는 모니카 Reinstate Monica

이것은 C # 6.0입니다.
Yytsi

@TuukkaX는 C #의 최신 버전이므로 지정하지 않았습니다. C # 7 기능과 같은 일부 릴리스 해제 기능을 사용하는 경우
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, 199177 또는 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. 방향 표시 등 N, S, E, W, 대문자 여야합니다.


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 array_map는 엄청난 오버 헤드가 있기 때문에 +4
  • PHP에서 캐스트가 부울로 (60-$v)%60인해 +1$v&&60-$v
  • 원본에서 작업하여 -8
  • -4 사용하여 chr, ord일부를 arithmetics 방향 스왑에

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

비 펀지, 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.