รุ่น GNU , 178 158 132 + 1 = 133 ไบต์
+1 ไบต์สำหรับการ-r
ตั้งค่าสถานะ
s/(.)(.*)(.)/ \1\n\2;\3/
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1 \6\n\3;\4\5/m
t
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
s/. (.)$/\1/gm
ลองออนไลน์!
คำอธิบาย
ในการแก้ไขครั้งก่อนหน้านี้ฉันใช้ไบต์จำนวนมากที่เกี่ยวข้องกับคณิตศาสตร์กรณีพิเศษและการล้างข้อมูลแม้ว่าฉันจะแน่ใจว่าสามารถหลีกเลี่ยงได้ ตั้งแต่นั้นมาฉันก็สามารถทำได้เช่นกัน
abcdEFGHIJKLMnop
สมมติว่าเรามีการป้อนข้อมูล ตัวอักษรEFGHIJKLM
จะอยู่ด้านล่างของสามเหลี่ยมดังนั้นฉันจึงใช้ตัวพิมพ์ใหญ่เป็นเครื่องมือช่วยในการมองเห็น
ก่อนอื่นเราเตรียมข้อมูลโดยใส่อักขระตัวแรกในบรรทัดของตัวเอง (นำหน้าด้วยช่องว่าง) และแทรกเคอร์เซอร์ ( ;
) หน้าอักขระสุดท้าย:
s/(.)(.*)(.)/ \1\n\2;\3/
ตอนนี้เรามี:
a
bcdEFGHIJKLMno;p
ทีนี้ในวงเราจะทำสองสามสิ่งกับบรรทัดสุดท้าย: 1. คัดลอกช่องว่างจากบรรทัดก่อนหน้าและแทรกหลังจากอักขระตัวแรกบวกสอง; 2. ย้ายอักขระตัวสุดท้ายไปทางขวาหลังช่องว่างแล้วตามด้วยบรรทัดใหม่ และ 3. เลื่อนเคอร์เซอร์สามตัวไปทางซ้าย
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1 \6\n\3;\4\5/m
t
นี่คือผลลัพธ์ของการวนซ้ำแต่ละครั้ง:
a
b p
cdEFGHIJKL;Mno
a
b p
c o
dEFGHI;JKLMn
a
b p
c o
d n
EF;GHIJKLM
คุณสามารถเห็นปิรามิดเริ่มเป็นรูปเป็นร่าง นอกจากนี้คุณยังสามารถดูว่าเคอร์เซอร์ใช้ทำอะไร: ในแต่ละการวนซ้ำมันจะเลื่อนไปทางซ้ายสามตัวอักษรและเมื่อไม่มีตัวละครสามตัวทางซ้ายมันจะแบ่งลูปซึ่งจะเกิดขึ้นเมื่อเราถึง "ด้านล่าง" ของปิรามิด
ตอนนี้เรากำลังจะทำสิ่งที่คล้ายกัน แต่กลับกัน ในลูปเราจะคัดลอกช่องว่างจากจุดเริ่มต้นของบรรทัดด้วยเคอร์เซอร์ไปยังจุดเริ่มต้นของบรรทัดก่อนหน้าบวกหนึ่งในกระบวนการย้ายเคอร์เซอร์ขึ้นไปที่บรรทัดนั้น
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
นี่คือการวนซ้ำสองครั้งและผลลัพธ์สุดท้าย:
a
b p
c o
;d n
EFGHIJKLM
a
b p
;c o
d n
EFGHIJKLM
...
; a
b p
c o
d n
EFGHIJKLM
เราเสร็จเรียบร้อยแล้วยกเว้นอักขระพิเศษบางตัว: A ;
และช่องว่างพิเศษในบรรทัดแรกและช่องว่างสองช่องใน "กึ่งกลาง" ของปิรามิดในสามบรรทัดถัดไป การทดแทนอย่างง่ายกำจัดพวกมันได้:
s/. (.)$/\1/gm
เสร็จเรียบร้อย!
a
b p
c o
d n
EFGHIJKLM
✂
เขาทำอะไร