Du hành trên một trái đất bằng phẳng


8

Các tọa độ trong thế giới Trái đất phẳng bao gồm vĩ độ (x) và kinh độ (y), là các số nguyên trong phạm vi 0 ... 9999. Giống như các số nguyên Gaussian , nhưng chúng luôn được viết bằng ký hiệu này:

411S 370E

Đó là, có Shoặc được Nthêm vào vĩ độ và Ehoặc được Wthêm vào kinh độ, với (các) không gian giữa hai thành phần.

Mục tiêu

Viết chương trình (không phải là hàm) đọc hai tọa độ, cách nhau bởi khoảng trắng và xuất tổng của chúng. Tọa độ đầu tiên là điểm bắt đầu, tọa độ thứ hai là chuyển vị và đầu ra là vị trí kết quả.

Đầu ra đầu vào

Vì thách thức này là một phần về định dạng, tôi sẽ cố gắng xác định rõ ràng các định dạng đầu vào và đầu ra.

Định dạng đầu vào ưa thích có 1 khoảng trắng giữa các thành phần tọa độ, không có số 0 đứng đầu và ký tự dòng mới giữa hai tọa độ. Chương trình phải có khả năng đọc định dạng ưa thích.

Đầu ra có thể chứa bất kỳ số lượng khoảng trắng và số 0 đứng đầu. Nếu nó khác với định dạng đầu vào ưa thích, chương trình cũng phải có thể đọc định dạng này.

Chỉ cần làm cho nó rõ ràng, đầu vào không thể (sẽ không) chứa bất kỳ ký tự định dạng bổ sung. Chỉ cần không gian và dòng mới khi cần thiết.

Chấm điểm

Đây là một thử nghiệm về một điều kiện chiến thắng mới. Tôi sẽ chọn người chiến thắng bằng cách chấp nhận câu trả lời trong một vài tuần. Nếu câu trả lời tốt hơn xuất hiện sau đó, tôi sẽ thay đổi câu trả lời được chấp nhận.

Điểm cho chương trình là số byte của nó. Chương trình chiến thắng là một chương trình ngắn hơn 400 byte, có số byte ít nhất, nhưng được viết bằng ngôn ngữ lập trình dài dòng nhất . Để xác định người chiến thắng:

  • Xóa các chương trình có số byte từ 400 trở lên (chúng có thể tham gia nhưng không thể thắng)
  • Chỉ xem xét chương trình ngắn nhất cho mỗi ngôn ngữ lập trình
  • Các dài nhất chiến thắng chương trình

Polyglots cạnh tranh với các chương trình ở tất cả các ngôn ngữ mà chúng hợp lệ (ví dụ: nếu một chương trình hợp lệ ở cả hai bashsh, nó cạnh tranh với các chương trình ở cả hai ngôn ngữ).

Các trường hợp thử nghiệm

Trong các trường hợp thử nghiệm, hai dòng đầu tiên là đầu vào và dòng thứ ba là đầu ra.

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

(hướng của số 0 không quan trọng, cả ở đầu vào và đầu ra)


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

(giá trị tối đa)


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

(hướng về số 0 không quan trọng trong đầu ra)


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

(không có giá trị âm; thay đổi hướng nếu bạn cần thay đổi dấu)


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

(nếu chương trình xuất ra các số 0 đứng đầu và một số khoảng trắng, thì nó phải có khả năng đọc chúng; nó cũng phải có thể đọc đầu vào không chứa chúng)


8888N 8888W
9999N 9999W

(đầu vào không hợp lệ - mọi hành vi đều được chấp nhận, bao gồm cả sự cố và vòng lặp vô hạn)


5
Tôi thực sự tò mò liệu cơ chế tính điểm này sẽ hoạt động, nhưng tôi cảm thấy như nó có thể chơi được. Đặc biệt, tôi có thể viết một giải pháp (tối ưu) ở chính xác 399 byte trong một số esolang cứng (hoặc một trong những thứ của riêng tôi) và mặc dù nó có thể dễ dàng chơi được, nhưng sẽ khó có ai có thể học được ngôn ngữ chỉ để đánh bại điểm số của tôi trong thử thách này.
Martin Ender

Tôi hy vọng nó rõ ràng bây giờ. Vui lòng tìm "định dạng đầu vào ưa thích" trong văn bản và yêu cầu làm rõ thêm nếu nó vẫn còn mơ hồ.
anatolyg

2
@anatolyg Mình thấy đoạn đó rất sai. Bạn nói về "tính linh hoạt" và định dạng đầu vào ưa thích , nhưng sau đó yêu cầu tất cả các giải pháp sử dụng chính xác định dạng đó. Đâu là sự linh hoạt và "ưu tiên" về định dạng này là gì? Tôi nghĩ đối với thử thách này, yêu cầu một định dạng rất cụ thể là tốt, nhưng sau đó đặc tả kỹ thuật nên nói rõ ràng như vậy.
Martin Ender

Không có đầu vào unary cho tôi?
Nữ tu bị rò rỉ

1
@ MartinBüttner Tính linh hoạt nằm ở đầu ra. Mặc dù không nhiều.
anatolyg

Câu trả lời:


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.

Ung dung:

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.

Nó thực sự là thử thách trong vòng 400 ký tự.

Một số lưu ý:

  • Phiên bản gốc có ADD c TO a.một trong những tuyên bố dài dòng yêu thích của tôi.
  • Trình chỉnh sửa tích hợp sẽ không chấp nhận điều này dưới dạng 1 lớp lót
  • Sử dụng chương trình con với FORMPERFORMphát nổ số char, vì vậy tôi giữ cho macro
  • Các câu lệnh xâu chuỗi bằng dấu hai chấm không được khuyến khích bên ngoài các khai báo dữ liệu, nhưng cần thiết để lưu byte
  • + không có khoảng trắng trước là toán tử bù, yêu cầu nhiều khoảng trắng trong mã
  • ABAP viết một khoảng trắng sau các số, do đó, chỉ cần thay thế dấu hiệu
  • Để sử dụng RIGHTPLUSbiểu thức cần là một số, do đó, cần phải kết hợp với 1, nhưng sau đó định dạng có số thập phân .. do đóDECIMALS

Tuyệt quá! Một ngôn ngữ hiện đại tôi chưa bao giờ nghe nói!
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 255 byte

Tôi nghĩ bây giờ tôi đang tiến gần đến một giới hạn. Tôi đã quản lý để loại bỏ 51, 60 68 72 74 byte khỏi câu trả lời mà tôi nghĩ là đã chơi tốt. =)

Đã xóa 8 byte bằng cách lấy phần inputbên trong strsplit, nhờ Luis Mendo. Đã xóa 6 byte khác bằng cách lấy tất cả đầu vào vào một mảng ô thay vì hai. Đã xóa 8 byte khác bằng cách lấy cả hai câu lệnh cuối cùng bên trong disp(). Đã xóa 6 byte bằng cách xóa charvà một số dấu ngoặc. Điều này là không thể trong lần sửa đổi trước của câu trả lời. Việc tách các thành phần ô thành bốn biến có giá 15 byte, nhưng đã lưu được 24, do đó đã lưu được 9 byte! 8 byte bổ sung do dispsơ đồ được cải thiện . 5*~~stiết kiệm hai byte so với (s>0)*5. Do đó, 4 byte mới được lưu (cho s và t). Ngược lại với biểu thức cuối cùng này tiết kiệm thêm 2 byte, 83-5*~sngắn hơn78+5*~~s

Mã đánh gôn:

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,''])

Cùng một mã, nhưng có ngắt dòng:

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,''])

Các trường hợp thử nghiệm:

Lưu ở trên như 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 khá dài dòng, theo tiêu chuẩn chơi gôn. Hãy xem nào...

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

Ung dung:

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

Chỉnh sửa để thêm: Tôi chỉ nhìn vào các câu trả lời khác, và tôi ngạc nhiên rằng bài viết của tôi là một trong những câu ngắn nhất! Có lẽ R không dài dòng như tôi nghĩ ...


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

Ung dung

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

Ghi chú

  • Lưu dưới dạng A.java, biên dịch với javac A.java, chạy với java A. Sau đó nhập dòng đầu vào tách hoặc hai đầu vào riêng biệt trên stdin.

Đầu ra:

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 (PostGreQuery 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

Được thực hiện như một câu lệnh được chuẩn bị có 2 tham số ký tự. Một tham số cho mỗi dòng đầu vào.

Nó được gọi như sau

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

và đưa ra một hàng chứa một cột ký tự cho kết quả. 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;}}}

Một phiên bản dễ đọc hơn:

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):"");
        }
    }
}

Chơi gôn ở Java là một loại niềm vui đặc biệt. Hai dòng mã sau đây làm tương tự, nhưng dòng đầu tiên ngắn hơn:

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

Mã này đọc 4 mã thông báo từ đầu vào tiêu chuẩn. Đối với mỗi mã thông báo, phần cho đến ký tự cuối cùng được chuyển đổi thành intvà ký tự cuối cùng tùy ý lật dấu hiệu của nó.

Sau đó, nó thêm giá trị đã được đọc 2 lần lặp lại trước đây. Java khởi tạo các mảng thành 0, vì vậy ở hai lần lặp đầu tiên, điều này sẽ làm đúng.

Sau đó, nó sẽ định dạng các giá trị và in chúng. Tuy nhiên, trong hai lần lặp đầu tiên, nó sẽ in chuỗi trống thay vào đó (vì vậy hai dấu ngắt dòng bổ sung xuất hiện trong đầu ra).

Nó sử dụng một số số học thú vị để biến lặp (4,3,2 hoặc 1) và dấu (-1 hoặc 1) có thể được kết hợp thành một chỉ số dựa trên số không vào chuỗi "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

Xin lỗi, quá ngắn. Tôi đã làm hết sức mình.

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

Tôi mặc dù C sẽ dài ... cũng có thể đưa nó lên. ; _;

#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
@>.," ",.,

Lưu ý rằng trình thông dịch có một hộp đầu vào dòng duy nhất. Dán định dạng ưa thích thay thế dòng mới bằng một khoảng trắng. Lấy các giá trị số nguyên &đã tiêu thụ các khoảng trắng và số 0 đứng đầu, do đó, định dạng ưa thích có thể được đọc vào ngăn xếp với&~&~&~&~ một mình. Thêm các bước để đặt các giá trị vào một dòng trống để người ta có thể truy xuất và so sánh các vectơ một tọa độ tại một thời điểm, có thể sử dụng chương trình 136 byte sau (không bao gồm ghi chú bên phải của dòng):

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

Bắt: Đầu ra buộc một không gian bổ sung sau các số nguyên, do đó không thể xuất ở định dạng ưa thích . Ví dụ: đầu ra sẽ xuất hiện dưới dạng1000 N 9999 W thay vì 1000N 9999W. Để kiểm tra và bỏ qua khoảng trắng trước mỗi hướng của tọa độ trên đầu vào, cần có bốn vòng lặp (một vòng cho mỗi tọa độ). Một vòng lặp được hiển thị dưới đây:

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

Chương trình kết quả có thể có nhiều khoảng trắng ở bất cứ đâu trong đầu vào (ngoại trừ giữa các chữ số).

Ví dụ đầu vào: 0001 N 4545 W 0999 N 5454 W


1

Lua, 333 328 byte

Có hệ thống đầu vào không hợp lệ cấp cao và vòng lặp vô hạn hoàn toàn sáng tạo để sử dụng nhiều lần.

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

Thưởng thức ;)

Chỉnh sửa: đã lưu 5 byte từ đổi tên math.absthành mprintnhưp


1

PHP byte byte.

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

Không làm bất cứ điều gì thông minh, chỉ cần khắc phục vấn đề.

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

Các quy tắc nên có một điều khoản bổ sung chỉ nói ngôn ngữ có ít nhất 2 mục có thể giành chiến thắng.


1
Tôi đếm được 29. Nhưng sự cố của bạn có thể được đánh xuống mức 205. Cách tiếp cận tốt đẹp.
Tít

:-( Bạn hoàn toàn đúng. Phải là một đêm khuya.
Paul Drewett

nhưng cảm ơn cho cảm hứng.
Tít

1

PHP, 169 byte

Lấy cảm hứng từ @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];

phá vỡ

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

nói theo nghĩa đen, "moste verbose" có lẽ sẽ là Mathicala hoặc 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];
  • đầu ra khá không được định dạng, thậm chí không phải là một dòng mới
  • in số lượng lớn cho kết quả quá lớn

Bây giờ, làm thế nào tôi có thể tăng gấp đôi kích thước của ...

phá vỡ

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

Giải trình

{~)}:"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

Hoạt động cho tất cả các trường hợp thử nghiệm. Luôn chèn N hoặc W cho 0. Tôi chắc chắn một người chơi Python tốt hơn tôi có thể loại bỏ một vài byte tốt hơn.

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

BIÊN TẬP

Đánh bại 57 byte mạnh mẽ nhờ một số mẹo hay từ @ mbomb007 và @Titus cộng với việc phát hiện ra thực tế là tôi có thể kết hợp hai raw_input với một khoảng trắng sau đó chỉ cần sử dụng một .split () phân tách trên không gian mà không chỉ định. Các thuật toán là như nhau nhưng chỉ chơi golf tốt hơn nhiều.

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
thay thế ...str(x)...bằng ...`x`...; thay thế ("E" if q<0 else "W")bằng"WE"[q<0]
mbomb007

1
Điều này sẽ giúp bạn bắt đầu. Xem trang mẹo về Python
mbomb007

Cảm ơn @ mbomb007. Nhiều đánh giá cao. Sẽ kiểm tra trang mẹo và xem những gì tôi có thể làm.
ElPedro


1
"S" in i or "E" in ichắc chắn có thể được viết i in "ES"hoặc tương tự.
Tít
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.