Bepergian di Bumi yang datar


8

Koordinat di dunia flat-Earth terdiri dari garis lintang (x) dan garis bujur (y), yang merupakan bilangan bulat dalam kisaran 0 ... 9999. Sama seperti bilangan bulat Gaussian , tetapi selalu ditulis menggunakan notasi ini:

411S 370E

Yaitu, dengan Satau Nditambahkan ke garis lintang, dan Eatau Wditambahkan ke garis bujur, dengan spasi di antara dua komponen.

Tujuan

Tulis program (bukan fungsi) yang membaca dua koordinat, dipisahkan oleh spasi, dan hasilkan jumlahnya. Koordinat pertama adalah titik awal, yang kedua adalah perpindahan, dan output adalah posisi yang dihasilkan.

Input output

Karena tantangan ini sebagian tentang pemformatan, saya akan mencoba menentukan format input dan output secara jelas.

Format input yang disukai memiliki 1 ruang antara komponen koordinat, tanpa nol di depan, dan karakter baris baru di antara dua koordinat. Program harus dapat membaca format yang diinginkan.

Outputnya dapat berisi jumlah spasi putih dan angka nol di depan. Jika berbeda dari format input yang disukai, program harus dapat membaca format ini juga.

Hanya untuk memperjelas, input tidak dapat (tidak akan) berisi karakter pemformatan tambahan. Cukup spasi dan baris baru jika diperlukan.

Mencetak gol

Ini adalah percobaan pada kondisi kemenangan baru. Saya akan memilih pemenang dengan menerima jawaban dalam beberapa minggu. Jika jawaban yang lebih baik muncul setelah itu, saya akan mengubah jawaban yang diterima.

Nilai untuk program ini adalah jumlah byte-nya. Program yang menang adalah yang lebih pendek dari 400 byte, memiliki jumlah byte paling sedikit, tetapi ditulis dalam bahasa pemrograman paling verbose . Untuk menentukan pemenang:

  • Hapus program dengan jumlah byte 400 atau lebih (mereka dapat berpartisipasi tetapi tidak dapat menang)
  • Pertimbangkan hanya program terpendek untuk setiap bahasa pemrograman
  • Program terlama menang

Polyglots bersaing dengan program dalam semua bahasa yang valid (mis. Jika suatu program valid dalam keduanya bashdan sh, ia bersaing dengan program dalam kedua bahasa).

Uji kasus

Dalam kasus uji, dua baris pertama adalah input, dan baris ketiga adalah output.

0S 0E
0S 0W
0N 0E

(arah nol tidak masalah, baik dalam input maupun output)


0S 9999E
9999N 9999W
9999N 0E

(nilai maksimal)


42S 314W
42N 2718W
0N 3032W

(arah nol tidak masalah dalam output)


5555N 8888W
7777S 0E
2222S 8888W

(tidak ada nilai negatif; ubah arah jika Anda perlu mengubah tanda)


0001N        4545W
0999N        5454W
1000N        9999W

(jika program menghasilkan angka nol di depan dan beberapa spasi, ia harus bisa membacanya; ia juga harus bisa membaca input yang tidak mengandungnya)


8888N 8888W
9999N 9999W

(input tidak valid - perilaku apa pun dapat diterima, termasuk crash dan infinite loop)


5
Saya benar-benar ingin tahu apakah mekanisme pemberian skor ini akan berhasil, tetapi saya merasa itu bisa dilakukan game. Secara khusus, saya bisa menulis solusi (suboptimal) tepat pada 399 byte di beberapa esolang keras gila (atau salah satu dari saya sendiri) dan meskipun mungkin mudah golf, itu agak tidak mungkin ada orang lain yang mau belajar Bahasa hanya untuk mengalahkan skor saya dalam tantangan ini.
Martin Ender

Saya harap sudah jelas sekarang. Silakan cari "format input yang disukai" dalam teks dan minta klarifikasi lebih lanjut jika masih ambigu.
anatolyg

2
@anatolyg Saya menemukan paragraf itu sangat menyesatkan. Anda berbicara tentang "fleksibilitas" dan format input yang disukai , tetapi kemudian meminta semua solusi untuk menggunakan format itu dengan tepat. Di mana fleksibilitas dan apa yang "disukai" tentang format ini? Saya pikir untuk tantangan ini tidak apa-apa untuk memerlukan satu format yang sangat spesifik, tetapi spesifikasi harus jelas mengatakannya.
Martin Ender

Tidak ada input unary untuk saya?
Leaky Nun

1
@ MartinBüttner Fleksibilitas ada di output. Tapi tidak banyak.
anatolyg

Jawaban:


3

ABAP, 377 365 byte

REPORT r.PARAMETERS: x TYPE string,y TYPE string.DEFINE m.SHIFT &1 RIGHT CIRCULAR.TRANSLATE &1 USING 'W-E+S-N+'. END-OF-DEFINITION. DEFINE o.&1 = |{ &1 * 1 SIGN = RIGHTPLUS DECIMALS = 0 }|.TRANSLATE &1 using &2. END-OF-DEFINITION.
SPLIT: x AT space INTO DATA(a) DATA(b),y AT ' ' INTO DATA(c) DATA(d). m: a,b,c,d.a = a + c.b = b + d.o: a '-S+N',b '-W+E'.WRITE: a, b.

Tidak Disatukan:

REPORT r.
PARAMETERS: x TYPE string,
            y TYPE string.
DEFINE m.
  SHIFT &1 RIGHT CIRCULAR.
  TRANSLATE &1 USING 'W-E+S-N+'. 
END-OF-DEFINITION. 

DEFINE o.
  &1 = |{ &1 * 1 SIGN = RIGHTPLUS DECIMALS = 0 }|.
  TRANSLATE &1 using &2.
END-OF-DEFINITION.

SPLIT: x AT space INTO DATA(a) DATA(b),y AT ' ' INTO DATA(c) DATA(d). 
m: a,b,c,d.
a = a + c.
b = b + d.
o: a '-S+N',b '-W+E'.
WRITE: a, b.

Sebenarnya menantang berada dalam 400 karakter.

Beberapa catatan:

  • Versi aslinya memiliki ADD c TO a.yang merupakan salah satu pernyataan verbose favorit saya.
  • Editor bawaan tidak akan menerima ini sebagai 1 liner
  • Menggunakan subrutin dengan FORMdan PERFORMmeledak jumlah arang, jadi saya terus makro
  • Pernyataan perangkaian dengan titik dua tidak disarankan di luar deklarasi data, tetapi diperlukan untuk menghemat byte
  • + tanpa ruang sebelumnya adalah operator ofset, yang membutuhkan banyak ruang dalam kode
  • ABAP menulis spasi setelah angka, maka trik untuk hanya mengganti tanda
  • Untuk menggunakan RIGHTPLUSekspresi yang diperlukan menjadi angka, jadi perlu mulitply dengan 1, tetapi kemudian format tersebut memiliki desimal.DECIMALS

Bagus! Bahasa modern yang belum pernah saya dengar!
anatolyg

4

JavaScript (ES6), 118 byte

s=>(g=([i,j,k,l,m,n],[o,p])=>(i=(j>p?-i:+i)+(n>p?-j:+j))<0?-i+o:i+p)(a=s.match(/\d+|\w/g),"SN")+' '+g(a.slice(2),"WE")

4

MATLAB, 327 304 296 290 282 276 267 259 255 253 byte

Saya pikir saya mendekati batas sekarang. Saya telah berhasil menghapus 51, 60 68 72 74 byte dari jawaban yang saya pikir sudah golf. =)

Dihapus 8 byte dengan mengambil bagian inputdalam strsplit, terima kasih kepada Luis Mendo. Dihapus 6 byte lagi dengan mengambil semua input ke dalam satu array sel, bukan dua. Dihapus 8 byte lagi dengan mengambil kedua pernyataan terakhir di dalam disp(). Dihapus 6 byte dengan menghapus chardan beberapa tanda kurung. Ini tidak mungkin dalam revisi jawaban sebelumnya. Memisahkan elemen sel menjadi empat variabel berharga 15 byte, tetapi disimpan 24, sehingga 9 byte disimpan! 8 byte tambahan karena dispskema yang ditingkatkan . 5*~~smenghemat dua byte dibandingkan dengan (s>0)*5. Jadi 4 byte baru disimpan (untuk s dan t). Mengambil kebalikan dari ungkapan terakhir ini menyimpan 2 byte lagi, 83-5*~slebih pendek dari78+5*~~s

Kode golf:

x=strsplit([input('','s'),' ',input('','s')]);[a,b,c,d]=x{:};f=@str2num;n=@num2str;i=@sign;s=f(a(1:end-1))*i(a(end)-79)+f(c(1:end-1))*i(c(end)-79);t=f(b(1:end-1))*i(b(end)-79)+f(d(1:end-1))*i(d(end)-79);disp([n(abs(s)),83-5*~s,32,n(abs(t)),87-18*~t,''])

Kode yang sama, tetapi dengan jeda baris:

x=strsplit([input('','s'),' ',input('','s')]);
[a,b,c,d]=x{:};
f=@str2num;
n=@num2str;
i=@sign;
s=f(a(1:end-1))*i(a(end)-79)+f(c(1:end-1))*i(c(end)-79);
t=f(b(1:end-1))*i(b(end)-79)+f(d(1:end-1))*i(d(end)-79);
disp([n(abs(s)),78+5*~~s,32,n(abs(t)),69+18*~~t,''])

Kasus uji:

Simpan di atas sebagai flat_earth.m

flat_earth
0S 0E
0S 0W
0N 0E

flat_earth
0S 9999E
9999N 9999W
9999N 0E

flat_earth
42S 314W
42N 2718W
0N 3032W

flat_earth
5555N 8888W
7777S 0E
2222S 8888W

flat_earth
0001N        4545W
0999N        5454W
1000N 9999W

3

R, 196 byte

R sangat cantik, dengan standar golf. Ayo lihat...

i=scan(,'');l=nchar(i);S=W=`-`;N=E=c;n=as.double(substr(i,1,l-1));d=substr(i,l,l);for(j in 1:4)n[j]=get(d[j])(n[j]);o=c(n[1]+n[3],n[2]+n[4]);cat(paste0(abs(o), ifelse(o<0,c("S", "W"),c("N","E"))))

Tidak Disatukan:

input = scan(,'')       # Take input from stdin, separating at newlines and spaces
length = nchar(input)   # Get the number of characters in each input
S=W=`-`                 # These two lines create aliases of `-` (the minus function)
N=E=c                   # and c (the concatenate function).
                        # We will later treat the NSEW part of the coordinate
                        # as a call to a function, to ensure that the numbers
                        # are treated with the correct polarity.
numbers = as.double(substr(input, 1, length-1))
                        # Strip the last character off of every coordinate, convert
                        # to integer
directions = substr(input, length, length)
                        # Strip off the numbers and grab the cardinal directions
for(j in 1:4)
    numbers[j] = get(directions[j])(numbers[j])
                        # For our four numbers, treat the cardinal direction as
                        # a function, which is mapped to `-` for south and west, and
                        # `c` for north and east (which is essentially identity)
output = c(numbers[1]+numbers[3], numbers[2]+numbers[4])
                        # Add together the numbers
cat(paste0(abs(output), ifelse(output<0, c("S", "W"), c("N","E"))))
                        # Output the absolute values of the new coordinates, followed
                        # by "S" or "W" if the number is negative and "N" or "E" if 
                        # the number is positive

Sunting untuk ditambahkan: Saya baru saja melihat jawaban yang lain, dan saya terkejut bahwa entri saya adalah yang terpendek! Mungkin R tidak bertele-tele seperti yang saya kira ...


2

Java, 372 byte

import static java.lang.System.*;class A{public static void main(String[]v){String l=" ",s=console().readLine()+l+console().readLine();Integer i=0,n[]=new Integer[4],y;for(;i<4;i++)n[i]=i.parseInt(s.replaceAll("[A-Z] *",l).split(l)[i])*(s.replaceAll("\\d| ","").charAt(i)==(i%2<1?83:87)?1:-1);i=n[0]+n[2];y=n[1]+n[3];out.println((i<0?-i+"N":i+"S")+l+(y<0?-y+"E":y+"W"));}}

Tidak disatukan

import static java.lang.System.console;
import static java.lang.System.out;

class A {
    public static void main(String[] v) {
        String l = " ", s = console().readLine() + l + console().readLine();
        Integer i = 0, n[] = new Integer[4], y;
        for (; i < 4; i++)
            n[i] = i.parseInt(s.replaceAll("[A-Z] *", l).split(l)[i]) * (s.replaceAll("\\d| ", "").charAt(i) == (i % 2 < 1 ? 83 : 87) ? 1 : -1);
        i = n[0] + n[2];
        y = n[1] + n[3];
        out.println((i < 0 ? -i + "N" : i + "S") + l + (y < 0 ? -y + "E" : y + "W"));
    }
}

Catatan

  • Simpan sebagai A.java, kompilasi dengan javac A.java, jalankan dengan java A. Kemudian masukkan baris input terpisah atau sebagai dua input terpisah pada stdin.

Output:

0S 0E
0S 0W
0S 0W

0S 9999E
9999N 9999W
9999N 0W

42S 314W
42N 2718W
0S 3032W

5555N 8888W
7777S 0E
2222S 8888W

0001N        4545W
0999N        5454W
1000N 9999W

8888N 8888W
9999N 9999W
18887N 18887W

2

SQL (PostGreSQL 9.4), 305 byte

PREPARE p(char,char)AS
SELECT string_agg(abs(n)||substr('SNNEEW',i+sign(n)::int,1),' ')FROM(SELECT i,sum(to_number(v,'9999')*CASE right(v,1)WHEN'N'THEN 1 WHEN'E'THEN 1 ELSE -1 END)n
FROM(SELECT CASE WHEN v~'[NS]' THEN 2 ELSE 5 END i,v
FROM regexp_split_to_table($1||' '||$2,' ')v)i
GROUP BY i ORDER BY i)g

Diimplementasikan sebagai pernyataan siap yang mengambil 2 parameter karakter. Satu parameter untuk setiap jalur input.

Ini disebut sebagai berikut

execute p('0S 9999E','9999N 9999W');

dan menghasilkan baris yang berisi kolom karakter tunggal untuk hasilnya. 9999N 0E


2

Java, 308 byte

import java.util.*;class x{public static void main(String[]a){Scanner r=new Scanner(System.in);int[]v=new int[2];int l,x,g,i;for(i=5;i-->1;System.out.println(i<3?""+x*g+"ENWS".charAt(i-g):"")){String s=r.next();x=Integer.parseInt(s.substring(0,l=s.length()-1));x=v[i%2]+=x*=s.charAt(l)>80?-1:1;g=x<0?-1:1;}}}

Versi yang lebih mudah dibaca:

import java.util.*;
class x
{
    public static void main(String[]args)
    {
        Scanner r = new Scanner(System.in);
        int[] v = new int[2];
        for (int i = 5; i-->1; )
        {
            String s = r.next();
            int l = s.length() - 1;
            int x = Integer.parseInt(s.substring(0, l));
            x = v[i%2] += x *= s.charAt(l) > 'N' ? -1 : 1;
            int g = x < 0 ? -1 : 1;
            System.out.println(i < 3?"" + x * g + "ENWS".charAt(i-g):"");
        }
    }
}

Golf di Jawa adalah jenis kesenangan khusus. Dua baris kode berikut melakukan hal yang sama, tetapi yang pertama lebih pendek:

(x<0?-x:x)
Math.abs(x)

Kode membaca 4 token dari input standar. Untuk setiap token, bagian hingga karakter terakhir dikonversi menjadi int, dan karakter terakhir secara opsional membalik tandanya.

Kemudian itu menambah nilai yang dibaca 2 iterasi yang lalu. Java menginisialisasi array ke 0, jadi pada dua iterasi pertama ini akan melakukan hal yang benar.

Kemudian akan memformat nilai dan mencetaknya. Namun, dalam dua iterasi pertama, ia mencetak string kosong sebagai gantinya (jadi dua linebreak tambahan muncul di output).

Ini menggunakan beberapa aritmatika funky sehingga variabel iterasi (4,3,2 atau 1) dan tanda (-1 atau 1) dapat digabungkan ke indeks berbasis nol ke dalam string "ENWS".


2

Perl 6, 130 byte

my (\h,\v)=[Z+] lines».split(' ')».map: {m/(.*)(.)/;$1 eq'S'|'W'??-$0!!$0}
say "{abs h}{h <0??'S'!!'N'} {abs v}{v <0??'W'!!'E'}"

2

Ruby, 186 byte

Terlalu pendek, maaf. Saya melakukan yang terbaik.

x=-1
puts gets.scan(/\d+\D/).map{|i|i.to_i*(i[-1]=~/[WS]/?-1:1)}.zip(gets.scan(/\d+\D/).map{|i|i.to_i*(i[-1]=~/[WS]/?-1:1)}).map{|a,b|a+b}.map{|s|s.abs.to_s+%w"NNS EEW"[x+=1][s<=>0]}*' '

2

C - 267 byte

Saya pikir C akan lama ... mungkin saja memasangnya. ; _;

#include <stdio.h>
#include <stdlib.h>
int main(){int x,y,z,w;char m,n,o,p;scanf("%d%c %d%c",&x,&m,&y,&n);scanf("%d%c %d%c",&z,&o,&w,&p);int a=x*(m<'O'?1:-1)+z*(o<'O'?1:-1),b=y*(n<'F'?1:-1)+w*(p<'F'?1:-1);printf("%d%c %d%c\n",abs(a),a<0?'S':'N',abs(b),b<0?'W':'E');}

2

Befunge-93 , 240 byte

v
  v$      <
>&>~:" "-!|
vp01p02   <
  v$      <
>&>~:" "-!|
vp03p04   <
  v$      <
>&>~:" "-!|
vp05p06   <
  v$      <
>&>~:" "-!|
 vp07p08  <
v>30g70g40g80g-!
_-:0` v1+
\v\g04_01-*80g
v>10g50g20g60g-!
_-:0` v1+
\v\g02_01-*60g
@>.," ",.,

Perhatikan bahwa penerjemah memiliki kotak input satu baris. Menempelkan format yang disukai menggantikan baris baru dengan spasi. Mendapatkan nilai integer dengan &sudah mengkonsumsi spasi dan nol terkemuka, sehingga format yang disukai dapat dibaca ke stack dengan &~&~&~&~sendirian. Menambahkan langkah-langkah untuk meletakkan nilai-nilai dalam baris kosong sehingga orang dapat mengambil dan membandingkan vektor satu koordinat pada suatu waktu, program 136 byte berikut (tidak termasuk catatan right of line) dapat digunakan:

v                      | blank line to store data
> &10p~20p&30p~40pv    | read and store first vector
 vp08~p07&p06~p05&<    | (backwards) read and store second vector
v>30g70g40g80g-!       | load E/W coordinates
_-:0` v1+              | subtract or add (based on direction)
\v\g04_01-*80g         | change directions if negative
v>10g50g20g60g-!       | load N/S coordinates
_-:0` v1+              | subtract or add (based on direction)
\v\g02_01-*60g         | change directions if negative
@>.," ",.,             | output

Catch: Output memaksa spasi tambahan setelah integer, jadi tidak mungkin untuk output dalam format yang disukai . Misalnya, output akan muncul sebagai 1000 N 9999 Wgantinya 1000N 9999W. Untuk memeriksa dan mengabaikan spasi sebelum arah koordinat pada input, diperlukan empat loop tambahan (satu untuk setiap koordinat). Satu loop ditunjukkan di bawah ini:

  v$      <            | throw out " " and repeat
>&>~:" "-!|            | (start read number) get and check character
vp01p02   <            | store

Program yang dihasilkan dapat memiliki beberapa ruang di mana saja di input (kecuali antara digit).

Input Contoh: 0001 N 4545 W 0999 N 5454 W


1

Lua, 333 328 byte

Fitur sistem input tingkat tinggi yang tidak valid dan loop infinite yang benar-benar inovatif untuk penggunaan berulang.

m=math.abs p=print::e::c={}for i=1,2 do for s in io.read():gmatch'%S+'do c[#c+1]=s end end for i=1,4 do n=c[i]:sub(1,-2)d=c[i]:sub(-1,-1)c[i]=d==("N"or"E")and n or-n end x=c[2]+c[4]y=c[1]+c[3]a=m(x)b=m(y)if(a or b)>9999 then p'Invalid input\n'goto e end x=x<0 and a.."W"or a.."E"y=y<0 and b.."S"or b.."N"p(y.." "..x.."\n")goto e

Nikmati ;)

Edit: menyimpan 5 byte dari pengubahan nama math.absmenjadi mdan printsebagaip


1

PHP 291 Bytes.

<?php $E=0;$N=0;$l=explode(PHP_EOL,STDIN);foreach($l as $i){ $x=explode(' ',$i); $s=(substr($x[0],-1,1)=='N')?1:-1; $N=$N+((substr($x[0],0,-1)*$s));$s=(substr($x[1],-1,1)=='E')?1:-1;$E=$E+((substr($x[1],0,-1))*$s);}$l=($E<=0)?'W':'E';$u=($N<=0)?'S':'N';echo'<br/>'.abs($N).$u.' '.abs($E).$l;

Tidak melakukan apa pun yang pintar, hanya plods melalui masalah.

<?php 
$lines = explode(PHP_EOL, STDIN);
foreach ($lines as $line) {
    $bits = explode(' ', $line);
    $sign = (substr($bits[0],-1, 1) == 'N')? 1 : -1;    
    $N = $N + ( (substr($bits[0],0,-1) * $sign) );
    $sign = (substr($bits[1],-1, 1) == 'E')? 1 : -1;    
    $E = $E + ( (substr($bits[1],0,-1)) * $sign );
}
$side = ($E<=0)?'W':'E';
$up = ($N<=0)?'S':'N';
echo '<br />'.abs($N).$up.' '.abs($E).$side;

Aturan harus memiliki klausul tambahan yang mengatakan hanya bahasa dengan setidaknya 2 entri dapat menang.


1
Saya hitung 291. Tapi kerusakan Anda bisa diturunkan hingga 205. Pendekatan yang bagus.
Titus

:-( Kamu benar. Pasti larut malam.
Paul Drewett

tapi terima kasih untuk ilhamnya.
Titus

1

PHP, 169 byte

Terinspirasi oleh @Paul Drewett:

<?for($i=2;$i--;$e+=$p[1]*(substr($p[1],-1,1)<W?:-1))$n+=($p=explode(' ',trim(fgets(STDIN))))[0]*(substr($p[0],-1)<S?:-1);echo abs($n),'NS'[$n<0],' ',abs($e),'EW'[$e<0];

kerusakan

for($i=2;$i--;                                  // loop twice
    $e+=$p[1]*(substr($p[1],-1,1)<W?:-1)        // add longitude to result
)
    $n+=
        ($p=explode(' ',trim(fgets(STDIN))))    // read line, split at blank
    [0]*(substr($p[0],-1)<S?:-1)                // add latitude to result
    ;
echo abs($n),'NS'[$n<0],' ',abs($e),'EW'[$e<0]; // print result

PHP, 206 197 195 byte

secara harfiah, "moste verbose" mungkin akan Mathematica atau Mathlab?

<?function i(){preg_match('#\d+(.) (\d+)(.)#',fgets(STDIN),$m);return[$m[0]*($m[1]<S?:-1),$m[2]*($m[3]<W?:-1)];}echo abs($v=($a=i())[0]+($b=i())[0]),'NS'[$v<0],' ',abs($v=$a[1]+$b[1]),'EW'[$v<0];
  • Outputnya cukup tidak diformat, bahkan bukan baris pelatihan baru
  • mencetak angka besar untuk hasil terlalu besar

Sekarang, bagaimana saya bisa menggandakan ukuran ini ...

kerusakan

function i()
// read a pair of coordinates from STDIN, return signed values
{
    // read line from STDIN and take (number,character,number,character) from it
    // will produce something like ["111N 222E","N","222","E"]
    preg_match('#\d+(.) (\d+)(.)#',fgets(STDIN),$m);
    return[
        // using a numerical operation on $m[0] casts the string to number (int in this case)
        $m[0]*($m[1]<S?:-1) // convert latitude to signed int: multiply with -1 for $m[1]=='S'
        ,
        $m[2]*($m[3]<W?:-1) // convert longitude to signed int
    ];
}
$a=i();$b=i();  // read coordinates from STDIN
echo            // output:
    abs($v=$a[0]+$b[0])     // 1. unsigned sum of latitudes
    ,'NS'[$v<0]             // 2. direction depending on sign
    ,' ',                   // 3. delimiter
    abs($v=$a[1]+$b[1]),    // 4. unsigned sum of longitudes
    'EW'[$v<0]              // 5. direction depending on sign
;

1

GolfScript - 111 byte

{~)}:"S":"E";{}:"N":"W";"
"/~[{' '/[{.-1<~\-1>`~}/]\}2*]zip[{{+}*}/](.0<{abs'S'}{'N'}if' '+@~.0<{abs'E'}{'W'}if

Penjelasan

{~)}:"S":"E";    # Aliases these as *-1
{}:"N":"W";      # Alieses to nop
"\n"/~           # Splits lines
[{' '/[{.-1<~\-1>`~}/]\}2*]zip    # Parses the input as vectors and applies the aliases
[{{+}*}/]                         # Vector sum
(.0<{abs'S'}{'N'}if' '+@          # Formats output
~.0<{abs'E'}{'W'}if

0

Python 2.7 - 232 175 byte

Berfungsi untuk semua kasus uji. Selalu menyisipkan N atau W untuk 0. Saya yakin pegolf Python yang lebih baik daripada saya bisa mencukur beberapa byte lebih baik.

f=(raw_input().split(" ")+raw_input().split(" "))
for x in range(4):
 i=f[x]
 if "S" in i or "E" in i:i="-"+i
 f[x]=int(i[:-1])
n=f[0]+f[2]
q=f[1]+f[3]
print str(abs(n))+("S" if n<0 else "N"),str(abs(q))+("E" if q<0 else "W")

EDIT

Golf off 57 byte perkasa karena beberapa tips dari @ mbomb007 dan @Titus plus dengan melihat fakta bahwa saya bisa menggabungkan dua raw_inputs dengan spasi kemudian gunakan saja .split () yang terbagi pada ruang tanpa menentukannya. Algoritmanya sama tetapi hanya golf yang jauh lebih baik.

f=(raw_input()+" "+raw_input()).split()
for x in 0,1,2,3:
 i=f[x]
 if i[-1]in"SE":i="-"+i
 f[x]=int(i[:-1])
n=f[0]+f[2]
q=f[1]+f[3]
print`abs(n)`+"NS"[n<0],`abs(q)`+"WE"[q<0]

1
ganti ...str(x)...dengan ...`x`...; ganti ("E" if q<0 else "W")dengan"WE"[q<0]
mbomb007


Terima kasih @ mbomb007. Sangat dihargai. Akan memeriksa halaman tips dan melihat apa lagi yang bisa saya lakukan.
ElPedro


1
"S" in i or "E" in ipasti bisa ditulis i in "ES"atau serupa.
Titus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.