ขุดไปออสเตรเลีย - ตรงข้าม


24

พื้นหลัง

เด็กนับไม่ถ้วนหลายคนสงสัยว่าพวกเขาจะลงเอยอย่างไรหากพวกเขาขุดหลุมลงมาโดยตรง ปรากฎว่าสิ่งนี้น่าแปลกใจที่ค่อนข้างอันตรายแต่อย่างไรก็ตาม ...

Antipodes เป็นจุดที่อยู่ตรงข้ามกันบนพื้นผิวโลก ซึ่งหมายความว่าหากมีการลากเส้นระหว่างจุดสองจุดมันจะผ่านจุดศูนย์กลางของโลก

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ให้จุดพบว่าตรงข้ามกับมัน

ในการท้าทายนี้คะแนนจะถูกแสดงโดยใช้ระบบลองจิจูดและองศาลองจิจูดส่วนโค้งนาทีและส่วนโค้งวินาที ในการค้นหา antipode ให้สลับทิศทางของแต่ละการจัดเรียง ( 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 31S 50 26 23 E 175 41 31

กฎระเบียบ

อินพุต

ชุดของพิกัดละติจูด - ลองจิจูดในรูปแบบที่เหมาะสมซึ่งแต่ละส่วนจะมีทิศทางจำนวนองศาจำนวนนาทีอาร์คและจำนวนอาร์ควินาที

เอาท์พุต

พิกัดละติจูด - ลองจิจูดของ antipode ในรูปแบบที่เหมาะสมโดยที่แต่ละการบรรพชามีทิศทางจำนวนองศาจำนวนนาทีอาร์คและจำนวนอาร์ควินาที

ใช้เหตุผลพอสมควรซึ่งหมายความว่าแต่ละส่วนของพิกัดสามารถแยกแยะได้อย่างชัดเจน

รายละเอียด

  • ทิศทางสำหรับบรรพชารุ้งเป็นNหรือSและว่าสำหรับบรรพชาแวงเป็นหรือWE
  • ค่าพิกัดทั้งหมดเป็นจำนวนเต็ม ค่าการศึกษาระดับปริญญาจะอยู่ระหว่าง0และ90สำหรับละติจูดและระหว่าง0และ180สำหรับลองจิจูด นาทีที่โค้งและค่านิยมส่วนโค้งที่สองสำหรับทั้งพิกัดจะอยู่ระหว่างและ059
  • หากค่าทั้งหมดสำหรับการบวชเป็น0ทิศทางที่ยอมรับได้
  • ไม่จำเป็นต้อง zero-pad ค่าใด ๆ
  • ไม่มีการจัดอันดับละติจูดที่จะมีขนาดใหญ่กว่า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

ลิงค์ที่มีประโยชน์

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!


นี่เป็นรูปแบบที่สมเหตุสมผลหรือไม่ สี่อินพุต: อาร์เรย์ของ 3 ตัวเลข, ถ่าน, อาเรย์ของสามตัวเลข; คั่นด้วยการขึ้นบรรทัดใหม่
Luis Mendo

@ LuisMendo เว้นเสียแต่ว่าฉันเข้าใจคุณผิดฉันสามารถเห็นได้เพียงสามอินพุตเท่านั้น ฉันคิดว่าคุณต้องการถ่านพิเศษหรือไม่ ฉันจะบอกว่านั่นเป็นรูปแบบที่สมเหตุสมผล ตามเหตุผลแล้วฉันหมายถึงว่าแต่ละส่วนของพิกัดสามารถแยกแยะได้อย่างชัดเจน
TheBikingViking

ใช่ฉันลืมถ่านตัวแรก ขอบคุณ!
Luis Mendo

3
"ค่อนข้างอันตราย"? Mate, อันตรายที่แท้จริงคือเมื่อคุณได้รับที่นี่
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

ลองออนไลน์

แก้ไข:บันทึกไว้ 3 ไบต์ขอบคุณที่Adnan


คุณสามารถบีบอัด"NEWS"ไปยัง‘€Ã‘หรือแม้ว่า'€Ãตัวพิมพ์เล็กได้รับอนุญาต
Adnan

@Adnan: ดี! ไม่คิดว่าการบีบอัดเนื่องจากสตริงมีขนาดเล็กมากอยู่แล้ว
Emigna

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จะต้องถูกลบออกจาก 179 หากเป็นอย่างใดอย่างหนึ่งgหรือhไม่ใช่ศูนย์ แต่ 180 ถ้าทั้งคู่gและhเป็นศูนย์ (เพราะไม่มีการยืม) จึง!(g|h)เพิ่มใน 179
  • gจำเป็นต้องเป็นศูนย์ถ้าทั้งคู่gและhเป็นศูนย์ดังนั้นg|h&&มิฉะนั้นจะต้องถูกลบออกจาก 59 ถ้าhไม่ใช่ศูนย์ แต่ 60 ถ้าhเป็นศูนย์ (เพราะไม่มีการยืม) จึง!hเพิ่มใน 59
  • h ต้องเป็นศูนย์ถ้ามันเป็นศูนย์อยู่แล้วมิฉะนั้นจะถูกลบออกจาก 60

วิธีการดูที่นี้ก็คือการแจ้งให้ทราบว่าในการลบไบนารีจะทำได้โดยการเพิ่มส่วนประกอบ 1s บวกเพิ่มอีก 1 แปลปัญหานี้เราใช้179-f, 59-gและ59-hและเพิ่ม 1 59-h+ 1 60-hแต่ถ้าเป็น 60 แล้วจะดำเนินการ ดังนั้นผลลัพธ์ที่ต้องการคือศูนย์หากhแต่เดิมเป็นศูนย์ เราบวก 1 เข้ากับ59-gหากมีการพกพาhกล่าวคือถ้าhเคยเป็นศูนย์ อีกครั้งเราต้องอนุญาตให้มีการพกพาซึ่งคราวนี้เกิดขึ้นถ้าทั้งคู่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
@TheBikingViking ขอบคุณ! แก้ไขแล้ว
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

ใช้การแปลงฐาน -60 เพื่อเปลี่ยนองศาและนาทีเป็นวินาที

รูปแบบ I / O:

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

มันพิมพ์บรรทัดทุกครั้งที่คุณป้อนบรรทัดเพื่อให้มีรูปแบบที่ดูดีคุณสามารถใช้ CLI และท่อป้อนข้อมูลหรือสะดวกยิ่งขึ้น, ใช้ในการดำเนินงาน Pyth ออนไลน์

ใน pseudocode:

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 bytes

Updated:

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 นาทีและวินาทีมันจะลบ 179, 59, และ 60 จาก d, m, s ตามลำดับ

เดิม:

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

JavaScript, 138 137 129 124 112 110

การปรับปรุง 2 ไบต์ได้รับแรงบันดาลใจจากรหัส @ Neil

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)]);
  • input = output = array ที่มี 2x (1 ตัวพิมพ์ใหญ่และ 3 int)
  • ทดสอบใน Firefox

ungolfed

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 มุมแต่ละอันตามด้วยทิศทาง

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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สามารถตีความได้ว่า1และ0และด้วยเหตุนี้คือการเทียบเท่า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ป้อนข้อมูลเป็น แต่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 เพิ่มเติม! ผมมอบหมายทั้งหมดตรรกะในการสุทธิstruct TimeSpanและฉันABใช้สตริงการจัดรูปแบบตรรกะ char, int, int, int, char, int, int, intการป้อนข้อมูลเป็น ฉันแบ่งปันสิ่งนี้เพื่อให้แนวคิดบางอย่าง บางทีอาจมีบางคนพัฒนาวิธีที่ดีกว่าฉัน


น่าเสียดายที่ verbose
สตีเวนเอช.

@Fawful ฉันโพสต์เวอร์ชันอื่นด้วยอาร์กิวเมนต์ที่ต่างกัน verbose น้อยไม่ได้? ฉันยังไม่สามารถกำจัดstring.Join()...
aloisdg พูดว่า Reinstate Monica

โปรดทราบว่านี่คือ C # 6.0
Yytsi

@TuukkaX เนื่องจากเป็นรุ่นล่าสุดของ C # ฉันไม่ได้ระบุ ฉันจะถ้าฉันใช้คุณสมบัติการเปิดตัวบางอย่างเช่นคุณสมบัติ C # 7
aloisdg พูดว่า Reinstate Monica

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- คุณจะพิจารณานี้ผ่าน?
oneday เมื่อ

0

Java, 199 177 หรือ 151 หรือ 134 ไบต์

177 Bytes solution ที่พิมพ์ผลลัพธ์

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 Bytes solution ที่คืนค่าผลลัพธ์เป็น array

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 นั้นค่อนข้างจะน่าผิดหวังส่วนหนึ่งเป็นเพราะ wordiness ของ 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 สำหรับ parantheses (ตัวดำเนินการที่ต่างกันมาก่อน)
  • +4 foreachเนื่องจาก PHP array_mapมีค่าใช้จ่ายสูง
  • +1 สำหรับ(60-$v)%60เพราะ$v&&60-$vปลดเปลื้องกับบูลีนใน PHP
  • -8 โดยทำงานกับต้นฉบับ
  • -4 โดยใช้chr, ordและเลขคณิตบางอย่างเกี่ยวกับการแลกเปลี่ยนทิศทาง

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 Bytes (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.