GNUはsedの、178 158 132 + 1 = 133のバイト
-r
フラグ用に+1バイト。
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
オンラインでお試しください!
説明
で以前のリビジョン私は直感的に、私は必ず彼らを避けることができたにもかかわらず、数学、特別な場合、およびクリーンアップを扱うバイトの多くを使用しました。私はそれ以来、ほとんど何とかそうすることができました。
inputがあるとしますabcdEFGHIJKLMnop
。文字EFGHIJKLM
は三角形の下部になるため、視覚的な補助として大文字を使用しました。
最初に、最初の文字を独自の行(スペースが前に付く)に置き;
、最後の文字の前にカーソル()を挿入することにより、入力を準備します。
s/(.)(.*)(.)/ \1\n\2;\3/
今、私たちは持っています:
a
bcdEFGHIJKLMno;p
次に、ループで、最後の行にいくつかの処理を行います。1.前の行からスペースをコピーし、最初の文字に2を加えた後に挿入します。2.スペースの直後に最後の文字を移動し、その後に改行を続けます。および3.カーソルを左に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
ピラミッドが形になり始めるのを見ることができます。また、カーソルの目的を確認することもできます。各反復で左に3文字移動し、左に3文字がなくなると、ループが中断されます。ピラミッドの。
次に、同様の操作を行いますが、逆にします。ループでは、カーソルのある行の先頭から前の行の先頭に1を加えた行まで、カーソルをその行に移動するプロセスでスペースをコピーします。
: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 と余分なスペース、および次の3行のピラミッドの「中央」の2つのスペース。単純な置換はそれらを取り除きます:
s/. (.)$/\1/gm
出来た!
a
b p
c o
d n
EFGHIJKLM
✂
sは何をしますか?