Tôi đã nghe nói rằng mã của bạn có thể chạy nhanh hơn nếu bạn thụt lề ngược lại, để trình biên dịch có thể xử lý nó giống như một mẫu thiết kế cây từ đầu "các nhánh" trở xuống. Điều này giúp vì trọng lực sẽ tăng tốc thời gian để mã của bạn được biên dịch và hiệu quả cấu trúc dữ liệu được cải thiện. Đây là một ví dụ, trong kịch bản Java:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Nhưng vì một số lý do, Notepad không có cài đặt để thực hiện việc này một cách tự động, vì vậy tôi cần một chương trình để thực hiện điều đó cho tôi.
Sự miêu tả
Đệ trình phải lấy một đoạn mã làm đầu vào, đảo ngược thụt lề và xuất mã kết quả.
Điều này được thực hiện theo thủ tục sau đây:
Chia mã thành các dòng. Mỗi dòng sẽ bắt đầu bằng 0 hoặc nhiều khoảng trắng (sẽ không có tab).
Tìm tất cả các mức thụt đầu dòng duy nhất trong mã. Ví dụ, với ví dụ trên, đây sẽ là
0 4 8 12
Đảo ngược thứ tự của danh sách các mức thụt dòng này và ánh xạ danh sách đảo ngược vào danh sách ban đầu. Điều này thật khó để giải thích bằng lời, nhưng ví dụ, nó sẽ giống như
0 — 12 4 — 8 8 — 4 12 — 0
Áp dụng ánh xạ này cho mã gốc. Trong ví dụ, một dòng có thụt lề 0 không gian sẽ bị thụt vào bởi 12 khoảng trắng, 4 khoảng trắng sẽ trở thành 8 khoảng trắng, v.v.
Đầu ra đầu vào
Đầu vào và đầu ra có thể được cung cấp theo bất kỳ cách nào bạn muốn (STDIN / STDOUT, tham số hàm / giá trị trả về, v.v.); nếu ngôn ngữ của bạn không hỗ trợ đầu vào đa dòng (hoặc bạn chỉ không muốn), bạn có thể sử dụng |
ký tự để phân tách các dòng thay thế.
Đầu vào sẽ chỉ bao gồm các dòng mới ASCII + có thể in và nó sẽ không chứa các dòng trống.
Các trường hợp thử nghiệm
Đầu vào:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Đầu ra: mã ví dụ ở trên.
Đầu vào:
a
b
c
d
e
f
g
h
Đầu ra:
a
b
c
d
e
f
g
h
Đầu vào:
1
2
3
2
1
Đầu ra:
1
2
3
2
1
Đầu vào:
foo
Đầu ra:
foo