Chiến tranh thánh đã được chiến đấu trên không gian so với các tab. (Và tất nhiên là không gian, vượt trội về mặt khách quan, đã thắng.) - Alex A.
S ome peo p le vẫn từ chối để một ccept rằng whi c h là cl e arly s upreme. Bạn vừa nhận được một tập tin bằng cách sử dụng incor lại ct, b quảng cáo và inf e dạng rior của whi t espace, và bây giờ t ông tiếp e nts của tập tin một r e nhiễm và hủy hoại.
Bạn quyết định bạn cũng có thể chỉ cho người đã gửi tệp cho bạn biết họ đã phạm lỗi dữ dội như thế nào.
Sự miêu tả
Như tiêu đề cho thấy, thách thức của bạn là lấy một tệp chứa một hoặc nhiều tab:
this is an evil tab onoes
và tàn nhẫn phá vỡ chúng thành từng mảnh:
this is an evil tab
o
n
o
e
s
Lưu ý rằng phần mềm Stack Exchange biến các tab theo nghĩa đen thành bốn khoảng trắng (vì nó đúng), vì vậy các tab trong bài đăng này sẽ được hiển thị dưới dạng bốn khoảng trắng. Tuy nhiên, đầu vào cho chương trình của bạn sẽ chứa các tab thực tế.
Thử thách
Giải pháp nên lấy một chuỗi đơn làm đầu vào, có thể chứa ASCII, dòng mới và tab có thể in được. Sẽ luôn có ít nhất một tab duy nhất trong đầu vào.
Đầu ra phải là cùng một chuỗi, với các quy tắc sau được áp dụng:
Bắt đầu con trỏ ở tọa độ (0,0) và theo hướng phải. Các tọa độ là (cột, hàng), không có chỉ mục và hướng là cách bạn nên di chuyển con trỏ sau khi in một ký tự.
Đối với mỗi ký tự trong chuỗi:
Nếu đó là một dòng mới, di chuyển đến tọa độ (0, n), trong đó n là số dòng mới trong chuỗi cho đến nay (bao gồm cả dòng này) và đặt lại hướng sang phải.
Nếu đó là một tab, hãy xuất hai khoảng trắng, xoay hướng con trỏ 90 độ theo chiều kim đồng hồ và xuất thêm hai khoảng trắng, "phá vỡ" tab một cách hiệu quả. Đây là một ví dụ trực quan, trong đó một tab được biểu diễn dưới dạng
--->
và khoảng trắng là·
:foo--->bar--->baz
trở thành
foo··· · b a r · · zab··
Mặt khác, chỉ cần xuất ký tự tại con trỏ và di chuyển con trỏ một bước theo hướng hiện tại.
Vì bạn đang đọc chuỗi từ đầu đến cuối, có thể bạn sẽ phải viết "trên đầu" các ký tự hiện có. Điều này không sao cả. Ví dụ: đầu vào
foo--->bar
spaces are superior
sẽ dẫn đến một đầu ra của
foo
b
spaces are superior
r
Bạn có thể chọn liệu "các tab bị hỏng" có nên ghi đè lên các ký tự khác không, ý định ban đầu là chúng không có, nhưng thông số này không rõ ràng, vì vậy đây là quyết định của bạn.
Hơn nữa, sau khi áp dụng các quy tắc này, bạn cũng có thể
thêm hoặc xóa nhiều dấu cách như bạn muốn.
thêm tối đa một dòng mới duy nhất.
Đầu vào sẽ không bao giờ chứa dấu cách; nó cũng sẽ không bao giờ chứa các dòng mới hàng đầu hoặc dấu. Bạn cũng có thể luôn cho rằng bạn sẽ không bao giờ cần phải ghi vào một cột hoặc một hàng nhỏ hơn 0 (tức là tắt màn hình).
Trường hợp thử nghiệm
Các tab trong trường hợp thử nghiệm này được thể hiện là --->
vì nếu không SE sẽ ngấu nghiến chúng.
Đầu vào:
Test case. Here's a tab--->there's a tab--->everywhere a tab--->tab--->this is some more text
blah
blah
blah blah blah blah blah blah--->blaah--->blaah--->blah--->blaaaaah--->blah--->blah--->blah--->blah--->blah
Đầu ra:
Test case. Here's a tab
blah
blah t
blah blah blah blah blah blah
blaablah
r b
e l b
h 'h a l
a sa a a
l l h h
this is some mobe tbxt
haalhalb
b a
a b
t
bat a erehwyreve
Hoạt hình lạ mắt:
Quy tắc
- Đây là mã golf , vì vậy mã ngắn nhất tính bằng byte sẽ giành chiến thắng!
(0,0)
bạn có nghĩa là chúng ta cần xóa bàn điều khiển trước, hay bạn chỉ muốn nói vị trí mặc định của con trỏ bằng cách đó?