Câu hỏi đã thay đổi, do đó câu trả lời này chứa các phiên bản khác nhau, có và không có đường dẫn khép kín.
Perl, đường dẫn mở, 69 byte
print"@$_$/"for sort{$$a[0]<=>$$b[0]||$$a[1]<=>$$b[1]}map{[/\S+/g]}<>
Mỗi điểm được dự kiến trong STDIN là đường thẳng, với tọa độ được phân tách bằng khoảng trắng.
Bất kỳ định dạng số nào đều được hỗ trợ mà Perl diễn giải thành số (bao gồm cả số dấu phẩy động).
Thí dụ:
0 0
4 4
0 4
4 0
-2 1
2 -2
2 4
3.21 .56
.035e2 -7.8
0 2
Đầu ra:
-2 1
0 0
0 2
0 4
2 -2
2 4
3.21 .56
.035e2 -7.8
4 0
4 4

Ung dung:
print "@$_$/" for # print output line
sort { # sort function for two points $a and $b
$$a[0] <=> $$b[0] # compare x part
|| $$a[1] <=> $$b[1] # compare y part, if x parts are identical
}
map { [/\S+/g] } # convert input line to point as array reference
<> # read input lines
Các biến thể mạch
Trong phiên bản câu hỏi đầu tiên, có một kết nối giữa điểm cuối cùng và điểm đầu tiên để tạo ra một mạch.
Trung tâm không phải là điểm hiện có, 253 byte
Biến thể này có thể thất bại, nếu trung tâm là một trong những điểm, xem ví dụ 3.
Chỉnh sửa:
Trong câu trả lời của mình, Swish nhận thấy rằng các điểm nên tập trung xung quanh gốc tọa độ để đảm bảo mạch không có chéo:
- Sắp xếp nhu cầu biến đổi tọa độ.
- Biểu diễn chuỗi gốc của các số cần được giữ cho đầu ra.
Sửa lỗi: trường hợp đặc biệt cho trục x âm đã bao gồm trục x dương.
print"$$_[2] $$_[3]$/"for sort{($X,$Y)=@$a;($x,$y)=@$b;(!$X&&!$Y?-1:0)||!$x&&!$y||!$Y&&!$y&&$X<0&&$x<0&&$X<=>$x||atan2($Y,$X)<=>atan2($y,$x)||$X**2+$Y**2<=>$x**2+$y**2}map{[$$_[0]-$M/$n,$$_[1]-$N/$n,@$_]}map{$n++;$M+=$$_[0];$N+=$$_[1];$_}map{[/\S+/g]}<>
Ví dụ 1:
4 4
-2 0
2 0
1 1
4 0
-2 -2
-3 -1
1 -2
3 0
2 -4
0 0
-1 -2
3 3
-3 0
2 3
-5 1
-6 -1
Đầu ra 1:
0 0
-6 -1
-3 -1
-2 -2
-1 -2
1 -2
2 -4
2 0
3 0
4 0
1 1
3 3
4 4
2 3
-5 1
-3 0
-2 0

Ví dụ 2:
Kiểm tra đại diện số và chuyển đổi tọa độ.
.9e1 9
7 7.0
8.5 06
7.77 9.45
Đầu ra 2:
7 7.0
8.5 06
.9e1 9
7.77 9.45

Ung dung:
print "$$_[2] $$_[3]$/" for sort { # print sorted points
($X, $Y) = @$a; # ($X, $Y) is first point $a
($x, $y) = @$b; # ($x, $y) is second point $b
(!$X && !$Y ? -1 : 0) || # origin comes first, test for $a
!$x && !$y || # origin comes first, test for $b
!$Y && !$y && $X < 0 && $x < 0 && $X <=> $x ||
# points on the negative x-axis are sorted in reverse order
atan2($Y, $X) <=> atan2($y, $x) ||
# sort by angles; the slope y/x would be an alternative,
# then the x-axis needs special treatment
$X**2 + $Y**2 <=> $x**2 + $y**2
# the (quadratic) length is the final sort criteria
}
map { [ # make tuple with transformed and original coordinates
# the center ($M/$n, $N/$n) is the new origin
$$_[0] - $M/$n, # transformed x value
$$_[1] - $N/$n, # transformed y value
@$_ # original coordinates
] }
map {
$n++; # $n is number of points
$M += $$_[0]; # $M is sum of x values
$N += $$_[1]; # $N is sum of y values
$_ # pass orignal coordinates through
}
map { # make tuple with point coordinates
[ /\S+/g ] # from non-whitespace in input line
}
<> # read input lines
Không giới hạn, 325 byte
print"$$_[2] $$_[3]$/"for sort{($X,$Y)=@$a;($x,$y)=@$b;atan2($Y,$X)<=>atan2($y,$x)||$X**2+$Y**2<=>$x**2+$y**2}map{[$$_[0]-$O/9,$$_[1]-$P/9,$$_[2],$$_[3]]}map{$O=$$_[0]if$$_[0]>0&&($O>$$_[0]||!$O);$P=$$_[1]if$$_[1]>0&&($P>$$_[1]||!$P);[@$_]}map{[$$_[0]-$M/$n,$$_[1]-$N/$n,@$_]}map{$n++;$M+=$$_[0];$N+=$$_[1];$_}map{[/\S+/g]}<>
Trong phiên bản trước, trung tâm được đặt ở điểm bắt đầu và các điểm cuối cùng trên trục âm được sắp xếp theo thứ tự ngược lại để có được chéo miễn phí đến trung tâm một lần nữa. Tuy nhiên, điều này là không đủ, bởi vì những điểm cuối cùng có thể nằm trên một dòng khác. Do đó, ví dụ 3 sau đây sẽ thất bại.
Điều này được khắc phục bằng cách di chuyển gốc tọa độ một chút lên trên cùng và bên phải. Do định tâm, phải có ít nhất một điểm có giá trị x dương và một điểm có giá trị y dương. Do đó, mức tối thiểu của các giá trị x và y dương được lấy và giảm xuống còn một phần chín (một nửa hoặc một phần ba có thể là đủ). Điểm này không thể là một trong những điểm hiện có và được tạo ra nguồn gốc mới.
Các phương pháp điều trị đặc biệt về nguồn gốc và trục x âm có thể được loại bỏ, bởi vì có bất kỳ điểm nào nằm trên nguồn gốc mới.
Ví dụ 3:
-2 -2
-1 -1
-2 2
-1 1
2 -2
1 -1
2 2
1 1
0 0
Đầu ra 3:
0 0
-1 -1
-2 -2
1 -1
2 -2
1 1
2 2
-2 2
-1 1

Ví dụ 1 bây giờ được sắp xếp khác nhau:

Ung dung:
print "$$_[2] $$_[3]$/" for sort { # print sorted points
($X, $Y) = @$a; # ($X, $Y) is first point $a
($x, $y) = @$b; # ($x, $y) is second point $b
atan2($Y, $X) <=> atan2($y, $x) ||
# sort by angles; the slope y/x would be an alternative,
# then the x-axis needs special treatment
$X**2 + $Y**2 <=> $x**2 + $y**2
# the (quadratic) length is the final sort criteria
}
map { [ # make tuple with transformed coordinates
$$_[0] - $O/9, $$_[1] - $P/9, # new transformed coordinate
$$_[2], $$_[3] # keep original coordinate
] }
map {
# get the minimum positive x and y values
$O = $$_[0] if $$_[0] > 0 && ($O > $$_[0] || !$O);
$P = $$_[1] if $$_[1] > 0 && ($P > $$_[1] || !$P);
[ @$_ ] # pass tuple through
}
map { [ # make tuple with transformed and original coordinates
# the center ($M/$n, $N/$n) is the new origin
$$_[0] - $M/$n, # transformed x value
$$_[1] - $N/$n, # transformed y value
@$_ # original coordinates
] }
map {
$n++; # $n is number of points
$M += $$_[0]; # $M is sum of x values
$N += $$_[1]; # $N is sum of y values
$_ # pass orignal coordinates through
}
map { # make tuple with point coordinates
[ /\S+/g ] # from non-whitespace in input line
}
<> # read input lines