CJam, 32 30 29 28 byte
ri_"/\ /"2/f*)@,\f>+_z..e>N*
Kiểm tra nó ở đây.
Tôi đã cố gắng giúp Reto đánh golf câu trả lời CJam của anh ấy nhưng cuối cùng lại có một giải pháp không liên quan gì đến anh ấy, vì vậy tôi nghĩ rằng tôi cũng có thể tự mình đăng nó.
Giải trình
Điều này làm cho việc sử dụng tính đối xứng của đầu ra. Đặc biệt, thực tế là đầu ra giống như chuyển vị của nó.
Đầu tiên, chúng ta tạo các N+1
dòng đầu tiên , nhưng không có cạnh trái:
ri e# Read input and convert to integer N.
_ e# Duplicate.
"/\ /"2/ e# Push an array with two strings: ["/\" " /"]
f* e# Repeat each of the two strings N times. That gives the first two rows.
) e# Detach the second row.
@, e# Pull up the other copy of N and turn into range [0 1 ... N-1].
\f> e# For each element i in that range, discard the first i characters of
e# the second row.
+ e# Add all those lines back to the first row.
Bây giờ chúng ta đã có một chuỗi các chuỗi biểu thị lưới sau:
/\/\/\/\
/ / / /
/ / / /
/ / /
/ / /
Sự hoán vị của nó trông như thế này:
/ / /
\/ /
/ / /
\/ /
/ / /
\/ /
/ /
\/
Cùng nhau, chúng có tất cả các nhân vật không phải không gian mà chúng ta cần. Bây giờ chúng ta có thể sử dụng mẹo rad của Dennis để kết hợp hai lưới ASCII thành một, bằng cách lấy tối đa của mỗi cặp ký tự tương ứng. Ở tất cả các vị trí mà hai lưới khác nhau, một lưới sẽ có một khoảng trắng (hoặc không có gì cả) và cái còn lại sẽ có ký tự mà chúng ta đang tìm kiếm. Khi một danh sách trong hoạt động véc tơ dài hơn danh sách khác, các yếu tố bổ sung của danh sách dài hơn sẽ chỉ được giữ lại, đó chính là thứ chúng tôi đang tìm kiếm. Trong các trường hợp khác, ký tự không phải khoảng trắng sẽ luôn là mức tối đa của hai ký tự:
_z e# Duplicate the grid and transpose it.
..e> e# For each pair of characters in corresponding positions, pick the maximum.
N* e# Join the lines by linefeed characters.
;
s cuối cùng .