sed, 367 (byte mã nguồn) + 535 (số lượng que diêm cho mã nguồn) = 899
s/[^0-9a-jln-suxyz]//Ig;/^$/{s/.*/0/;b};s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/;:1;s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I;/ ;/!b1;s/;.+//;s/^/,;/;:2;s/(;[^%]*)(%+)/\2\1/;:3;s/,%{10}/%,/;s/^%/,&/;/%{10}/b3;/;.*%/b2;:4;s/,[;,]/,0,/;/,[;,]/b4;s/%{9}/9/g;s/%{8}/8/g;s/%{7}/7/g;s/%{6}/6/g;s/%{5}/5/g;s/%%%%/4/g;s/%%%/3/g;s/%%/2/g;s/%/1/g;s/[^0-9]//g
Dùng thử trực tuyến
Phiên bản nhiều dòng:
s/[^0-9a-jln-suxyz]//Ig
/^$/{s/.*/0/;b}
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
s/;.+//
s/^/,;/
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
:4
s/,[;,]/,0,/
/,[;,]/b4
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
s/[^0-9]//g
Giải trình:
Kịch bản trên đọc dòng đầu vào tiêu chuẩn theo dòng (vào không gian mẫu - "cách thức thông thường") và, đối với mỗi dòng, nó xuất ra số lượng que diêm cần thiết để thể hiện tất cả các ký tự đại diện cho que diêm trong dòng đó. Việc tính toán cho từng dòng đầu vào xảy ra như sau:
s/[^0-9a-jln-suxyz]//Ig
Đầu tiên, chúng tôi xóa mọi ký tự mà chúng tôi không có biểu diễn que diêm tương ứng (như được nêu trong câu hỏi) khỏi không gian mẫu. Đó là, chúng tôi xóa mọi ký tự không phải là một chữ số từ "0" đến "9", một chữ cái từ "a" đến "j", "n" thành "s", "l", "u", "x", "y" hoặc "z". Chữ in hoa và chữ thường được xử lý như nhau.
/^$/{s/.*/0/;b}
Nếu chúng ta kết thúc với một không gian mẫu trống, chúng ta sẽ in 0 (tự động theo dòng mới, giống như sed luôn làm trừ khi bạn chuyển một cờ đặc biệt cho nó), bỏ qua tất cả các dòng sau của tập lệnh và chuyển sang "chu kỳ sed" tiếp theo ( tức là đọc dòng tiếp theo của đầu vào và lặp lại xử lý lại từ lệnh đầu tiên cho đến khi không còn dòng đầu vào nào được xử lý nữa).
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
Mặt khác, nếu không gian mẫu không trống, bây giờ chúng ta chia nó thành hai "không gian con" được phân tách bằng dấu chấm phẩy: đầu tiên là không gian đầu vào , ban đầu được hình thành bởi tất cả các ký tự không được xóa khỏi không gian mẫu sau thực hiện dòng 1; tiếp đến là dấu chấm phẩy và sau đó là không gian bản đồ .
Không gian bản đồ cho chúng ta biết cần bao nhiêu que diêm bên cạnh 1 để thể hiện mỗi ký tự chữ và số có liên quan. Nếu chúng ta muốn biết có bao nhiêu que diêm cần thiết để đại diện cho bất kỳ ký tự chữ và số nào trong không gian bản đồ, chúng ta sẽ tìm chuỗi đầu tiên của %% liền kề bên trái ký tự đó và câu trả lời sẽ là số% của chuỗi đó cộng với 1. Vì vậy, ví dụ, số lượng que diêm cần thiết để biểu thị "b" là 4 + 1 = 5; để đại diện cho "4", 3 + 1 = 4, để đại diện cho "y", 3 + 1 = 4; vân vân
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
Đây là một vòng lặp. Bây giờ chúng ta sẽ thay thế mọi ký tự trong không gian đầu vào bằng chuỗi (hoàn thành) của% có số cho biết số lượng que diêm cần thiết để thể hiện ký tự đó và theo dõi chuỗi đó bằng ký tự khoảng trắng (một lần nữa, chữ hoa và chữ thường là đưa ra cách xử lý tương tự). Tiêu chí để xác định xem vòng lặp có nên kết thúc hay không là kiểm tra xem có ký tự khoảng trắng ở bên trái dấu chấm phẩy trong không gian mẫu hay không: nếu điều kiện đó giữ, chúng ta chấm dứt vòng lặp và tiếp tục vào dòng tiếp theo.
s/;.+//
s/^/,;/
Hai dòng đó loại bỏ dấu chấm phẩy và mọi thứ sau nó từ không gian mẫu và sau đó chèn dấu phẩy và dấu chấm phẩy vào đầu không gian mẫu. Bây giờ chúng ta có không gian mẫu được chia một lần nữa thành hai không gian con mới: không gian kết quả tương tự trước dấu chấm phẩy và không gian đầu vào tương tự sau nó.
Không gian đầu vào tương tự chỉ là cái mà trước đây chúng ta gọi là "không gian đầu vào", nhưng ở một dạng khác: giờ đây nó chứa các chuỗi% được phân tách bằng khoảng trắng. Tổng số% như vậy trong không gian đầu vào tương tự là cùng số lượng que diêm cần thiết để biểu diễn chuỗi ký tự đầu vào ban đầu, nghĩa là số đó là kết quả. Nhưng chúng ta phải in kết quả đó bằng ký hiệu thập phân, không phải là một chuỗi các dấu phần trăm. Mục đích của không gian kết quả tương tự là giữ một biểu diễn tương tự của từng chữ số của kết quả trong khi chúng tôi tính kết quả đó bằng cách tính tổng từng chuỗi tiếp giáp của% trong từng không gian đầu vào tương tự. Vòng lặp tiếp theo thực hiện tổng đó:
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
Đầu tiên, sau nhãn 2 , chúng tôi di chuyển chuỗi tiếp theo của% sau dấu chấm phẩy từ không gian đầu vào tương tự sang bên trái của dấu chấm phẩy, trong không gian kết quả tương tự;
Tiếp theo, chúng tôi bước vào một vòng lặp phụ (nhãn 3 ) để thực hiện các tính toán sau:
Nếu có một chuỗi mười% liền kề sau dấu phẩy trong không gian kết quả tương tự, chúng tôi sẽ xóa các% đó và đặt một% ngay lập tức ở bên trái dấu phẩy. Nói một cách đơn giản, điều này chỉ ra rằng một trong những vị trí thập phân trong kết quả đã thu được hơn 9 đơn vị, vì vậy chúng tôi lấy 10 đơn vị từ vị trí thập phân đó và thêm 1 đơn vị vào vị trí thập phân lớn hơn tiếp theo;
Nếu "%" là ký tự đầu tiên trong không gian mẫu, chúng tôi sẽ chèn một dấu phẩy mới ngay trước nó. Điều này chỉ ra rằng tổng đã đạt đến một giá trị có biểu diễn thập phân có thêm một vị trí thập phân ở bên trái so với giá trị trước đó;
Nếu vẫn còn bất kỳ chuỗi mười% tiếp giáp nào trong không gian kết quả tương tự, chúng tôi quay lại nhãn 3 và lặp lại quy trình này. Nếu không, chúng ta thoát khỏi vòng lặp phụ này và bước vào dòng tiếp theo.
Bây giờ, nếu vẫn còn bất kỳ "%" nào trong không gian đầu vào tương tự (nghĩa là sau dấu chấm phẩy), điều đó có nghĩa là vẫn còn một số lượng que diêm được thêm vào tổng số - vì vậy chúng tôi quay lại nhãn 2 .
Khi tổng đã hoàn thành, chúng tôi bước vào vòng lặp cuối cùng của mã:
:4
s/,[;,]/,0,/
/,[;,]/b4
Ở đây, chúng tôi kiểm tra từng cặp ký tự được hình thành bởi dấu phẩy bên trái và dấu chấm phẩy hoặc dấu phẩy bên phải. Chúng tôi thay thế tất cả các cặp ký tự như vậy bằng "0" bên trong hai dấu phẩy.
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
Đoạn mã trên khá đơn giản: chúng tôi thay thế từng chuỗi tiếp giáp của% trong không gian kết quả tương tự bằng một ký tự chữ số thập phân tương ứng với số% của mỗi chuỗi cụ thể.
s/[^0-9]//g
Cuối cùng, chúng tôi xóa mọi ký tự không số khỏi không gian mẫu và phần còn lại là kết quả cuối cùng trong ký hiệu thập phân quen thuộc. Giá trị đó được in trên đầu ra tiêu chuẩn và chu kỳ sed tiếp theo bắt đầu, nếu có thêm bất kỳ dòng đầu vào nào được xử lý.
|_\n|_
(chữ thườngt
)