sed, 367 (ไบต์ซอร์สโค้ด) + 532 (จำนวน matchsticks สำหรับซอร์สโค้ด) = 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
ลองออนไลน์
รุ่นหลายสาย:
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
คำอธิบาย:
สคริปต์ด้านบนจะอ่านบรรทัดอินพุตมาตรฐานทีละบรรทัด (ในพื้นที่รูปแบบ - "วิธีการทั่วไป") และสำหรับแต่ละบรรทัดมันจะส่งออกจำนวนของไม้ขีดไฟที่จำเป็นในการเป็นตัวแทนของตัวอักษรที่จับต้องได้ทั้งหมดในบรรทัดนั้น การคำนวณสำหรับอินพุตแต่ละบรรทัดเกิดขึ้นดังนี้:
s/[^0-9a-jln-suxyz]//Ig
ก่อนอื่นเราจะลบตัวละครทุกตัวที่เราไม่มีการจับคู่ไม้ขีดไฟที่สอดคล้องกัน (ตามที่กำหนดในคำถาม) ออกจากพื้นที่รูปแบบ นั่นคือเราลบอักขระทุกตัวที่ไม่ใช่ตัวเลขจาก "0" ถึง "9" จดหมายจาก "a" ถึง "j", "n" ถึง "s", "l", "u", "x", "y" หรือ "z" ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กจะถือว่าเหมือนกัน
/^$/{s/.*/0/;b}
หากเราลงท้ายด้วยช่องว่างรูปแบบที่ว่างเปล่าเราจะพิมพ์ 0 (ตามด้วยการขึ้นบรรทัดใหม่โดยอัตโนมัติเช่นเดียวกับ sed เสมอยกเว้นว่าคุณส่งค่าสถานะพิเศษไปที่มัน) ข้ามบรรทัดด้านหลังทั้งหมดของสคริปต์และดำเนินการต่อไป "วงจรรอบ" ( เช่นอ่านบรรทัดถัดไปของอินพุตและประมวลผลซ้ำอีกครั้งจากคำสั่งแรกจนกว่าจะไม่มีบรรทัดอินพุตที่ต้องดำเนินการอีก)
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
มิฉะนั้นหากพื้นที่รูปแบบไม่ว่างเปล่าตอนนี้เราแบ่งออกเป็นสอง "ช่องว่างย่อย" คั่นด้วยเครื่องหมายอัฒภาค: ก่อนมาพื้นที่อินพุตซึ่งแรกเกิดขึ้นโดยตัวละครทั้งหมดที่ไม่ได้ถูกลบออกจากพื้นที่รูปแบบหลังจาก การดำเนินการของบรรทัดที่ 1 ถัดไปมาเครื่องหมายอัฒภาคและหลังจากนั้นพื้นที่แผนที่พื้นที่แผนที่
พื้นที่บนแผนที่บอกเราว่าต้องใช้ไม้ขีดไฟข้าง 1 จำนวนเท่าใดเพื่อแสดงถึงตัวอักษรและตัวเลขที่เกี่ยวข้อง ถ้าเราต้องการทราบจำนวนไม้ขีดไฟที่จำเป็นในการแสดงอักขระตัวอักษรและตัวเลขใด ๆ ในพื้นที่แผนที่เราจะค้นหาลำดับแรกของ% ที่อยู่ติดกันทางด้านซ้ายของอักขระนั้นและคำตอบจะเป็นจำนวน% ของ ลำดับนั้นบวก 1 ตัวอย่างเช่นจำนวนของไม้ขีดไฟที่จำเป็นในการแสดง "b" คือ 4 + 1 = 5; เพื่อเป็นตัวแทนของ "4", 3 + 1 = 4, เพื่อแทน "y", 3 + 1 = 4; และอื่น ๆ
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
นี่คือลูป ตอนนี้เราจะแทนที่ตัวละครทุกตัวในช่องว่างด้วยลำดับ (สมบูรณ์) ของ% ซึ่งมีจำนวนที่ระบุจำนวนไม้ขีดไฟที่จำเป็นในการเป็นตัวแทนของตัวละครนั้นและทำตามลำดับนั้นด้วยตัวอักษรช่องว่างสีขาว (อีกครั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ได้รับการรักษาแบบเดียวกัน) เกณฑ์ในการพิจารณาว่าลูปควรจบแล้วหรือไม่เพื่อตรวจสอบว่ามีอักขระช่องว่างสีขาวที่ด้านซ้ายของอัฒภาคในรูปแบบพื้นที่ว่าง: หากเงื่อนไขนั้นอยู่เราจะยกเลิกลูปและดำเนินการต่อในบรรทัดถัดไป
s/;.+//
s/^/,;/
เส้นสองเส้นนั้นจะลบเครื่องหมายอัฒภาคและทุกอย่างที่อยู่หลังจากช่องว่างรูปแบบแล้วใส่เครื่องหมายจุลภาคและเครื่องหมายอัฒภาคลงในจุดเริ่มต้นของช่องว่างรูปแบบ ตอนนี้เราได้แบ่งพื้นที่รูปแบบอีกครั้งเป็นสองส่วนย่อยใหม่: พื้นที่ผลลัพธ์อะนาล็อกก่อนเซมิโคลอนและพื้นที่อินพุตอะนาล็อกหลังจากนั้น
พื้นที่อินพุตแบบอะนาล็อกเป็นสิ่งที่เราเคยเรียกว่า "พื้นที่อินพุต" ก่อนหน้านี้ แต่ในรูปแบบที่แตกต่าง: ตอนนี้มันมีลำดับของ% คั่นด้วยช่องว่างสีขาว จำนวนรวมของ% เช่นนี้ในพื้นที่อินพุตแบบอะนาล็อกคือจำนวน matchsticks เท่ากันที่จำเป็นในการแสดงสตริงอักขระเริ่มต้นที่ป้อนเข้ามานั่นคือตัวเลขนั้นเป็นผลลัพธ์ แต่เราต้องพิมพ์ผลลัพธ์นั้นเป็นสัญกรณ์ทศนิยมไม่ใช่ลำดับของเครื่องหมายเปอร์เซ็นต์ จุดประสงค์ของพื้นที่ผลลัพธ์แบบอะนาล็อกคือเพื่อเก็บการแทนแบบอะนาล็อกของแต่ละหลักของผลลัพธ์ในขณะที่เราคำนวณผลลัพธ์นั้นโดยการหาผลรวมของลำดับ% ต่อเนื่องของ% ในพื้นที่อินพุตแบบอะนาล็อกทีละหนึ่ง ลูปถัดไปจะทำการรวม:
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
อันดับแรกหลังจากที่ฉลาก2เราจะย้ายลำดับที่ต่อเนื่องกันของ% หลังจากเซมิโคลอนจากพื้นที่อินพุตอะนาล็อกไปทางซ้ายทันทีของอัฒภาคในพื้นที่ผลลัพธ์อะนาล็อก
ต่อไปเราจะเข้าสู่วงย่อย (ป้ายกำกับ3 ) ซึ่งจะทำการคำนวณต่อไปนี้:
หากมีลำดับที่ต่อเนื่องกันของสิบ% หลังจากเครื่องหมายจุลภาคในพื้นที่ผลลัพธ์แบบอะนาล็อกเราจะลบ% เหล่านั้นและใส่% เดียวทันทีที่ด้านซ้ายของเครื่องหมายจุลภาค หากต้องการกล่าวง่ายๆนี่เป็นการระบุว่าหนึ่งในตำแหน่งทศนิยมในผลลัพธ์ได้รับมากกว่า 9 หน่วยดังนั้นเราจึงนำ 10 หน่วยออกจากตำแหน่งทศนิยมนั้นและเพิ่ม 1 หน่วยไปยังตำแหน่งทศนิยมที่ใหญ่กว่าถัดไป
หาก "%" เป็นอักขระตัวแรกในช่องว่างของรูปแบบเราจะใส่เครื่องหมายจุลภาคใหม่ข้างหน้าทันที สิ่งนี้บ่งชี้ว่าผลรวมได้ถึงค่าที่การแทนทศนิยมมีทศนิยมอีกหนึ่งตำแหน่งทางด้านซ้ายกว่าค่าก่อนหน้า;
หากยังคงมีลำดับที่ต่อเนื่องกันสิบ% ในพื้นที่ผลลัพธ์แบบอะนาล็อกเราจะกลับไปที่ป้ายกำกับ3และทำซ้ำกระบวนการนี้ มิฉะนั้นเราจะออกจากลูปย่อยและก้าวเข้าสู่บรรทัดถัดไป
ตอนนี้ถ้ายังคงมีใด ๆ "%" ในพื้นที่อนาล็อก (เช่นหลังจากอัฒภาค) มันหมายความว่ายังคงมีจำนวนไม้ขีดไฟที่จะเพิ่มผลรวมบาง - เพื่อให้เรากลับไปติดป้าย2
เมื่อผลรวมเสร็จสมบูรณ์เราจะเข้าสู่ลูปสุดท้ายของรหัส:
:4
s/,[;,]/,0,/
/,[;,]/b4
ที่นี่เราตรวจสอบตัวละครทุกคู่ที่เกิดขึ้นจากเครื่องหมายจุลภาคทางซ้ายและเครื่องหมายอัฒภาคหรือเครื่องหมายจุลภาคทางด้านขวา เราแทนที่อักขระทั้งหมดเช่น "0" ภายในเครื่องหมายจุลภาคสอง
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 ในพื้นที่ผลลัพธ์แบบอะนาล็อกด้วยอักขระทศนิยมซึ่งสอดคล้องกับจำนวน% ของแต่ละลำดับเฉพาะ
s/[^0-9]//g
ในที่สุดเราจะลบอักขระที่ไม่ใช่ตัวเลขทั้งหมดออกจากพื้นที่รูปแบบและสิ่งที่เหลืออยู่คือผลลัพธ์สุดท้ายในรูปแบบทศนิยมที่คุ้นเคย ค่านั้นจะถูกพิมพ์ลงในเอาต์พุตมาตรฐานและรอบการประมวลผลรอบถัดไปจะเริ่มขึ้นหากมีสายอินพุตที่ต้องดำเนินการเพิ่มเติม
|_\n|_
(ตัวพิมพ์เล็กt
)