GNU sed , 178 158 132 + 1 = 133 bayt
-r
Bayrak için +1 bayt .
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
Çevrimiçi deneyin!
açıklama
İçinde önceki revizyonlar Ben sezgisel Emin onlar önlenebileceği olsa bile, matematik, özel durumlarda ve temizleme ile uğraşan bayt çok kullanılır. O zamandan beri, çoğunlukla bunu başardım.
Diyelim ki girdi bizde. abcdEFGHIJKLMnop
. HarflerEFGHIJKLM
üçgenin dibi olacak, bu yüzden onları görsel yardım olarak büyük harf kullandım.
Önce, ilk karakteri kendi satırına koyarak (önce bir boşluk bırakarak) ve imleci ekleyerek girişi hazırlarız.;
son karakterden önce ) :
s/(.)(.*)(.)/ \1\n\2;\3/
Şimdi biz var:
a
bcdEFGHIJKLMno;p
Şimdi, bir döngüde, son satıra birkaç şey yapacağız: 1. Boşlukları önceki satırdan kopyalayın ve ilk karakterden sonra artı iki ekleyin; 2. Son karakteri boşluklardan hemen sonra sağa, sonra yeni bir satırla hareket ettirin; ve 3. İmleci üç karakter sola hareket ettirin.
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1 \6\n\3;\4\5/m
t
İşte her yinelemenin sonucu:
a
b p
cdEFGHIJKL;Mno
a
b p
c o
dEFGHI;JKLMn
a
b p
c o
d n
EF;GHIJKLM
Piramidin şekillenmeye başladığını görebilirsiniz. İmlecin ne için olduğunu da görebilirsiniz: Her yinelemede üç karakter sola hareket etti ve solunda üç karakter kalmadığında, sadece "alt" a ulaştığımızda olan döngüyü keser. Piramidin
Şimdi benzer bir işlem yapacağız ancak tersi. Döngüde, imleci bu satırın üstüne getirme işleminde, imleçle satırın başından imleci bir önceki satırın başına kadar olan boşlukları kopyalayacağız.
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
İşte birkaç yineleme ve sonuç:
a
b p
c o
;d n
EFGHIJKLM
a
b p
;c o
d n
EFGHIJKLM
...
; a
b p
c o
d n
EFGHIJKLM
Bazı ekstra karakterler hariç, şimdi hepimiz bitti: A ;
ve ilk satırda fazladan boşluk ve sonraki üç satırda piramidin "ortasında" iki boşluk. Basit bir oyuncu değişikliği onlardan kurtulur:
s/. (.)$/\1/gm
Hepsi tamam!
a
b p
c o
d n
EFGHIJKLM
✂
lar do?