スペース対タブをめぐって聖戦が繰り広げられてきました。(そしてもちろん、客観的に優れているスペースが勝ちました。)— アレックスA.
S青梅PEO Pルはまだ拒否していることccept WHI のC HがClである電子アルリーの upreme。あなただけ受け取った incorを使用してファイルを再、CT Bの広告を、そしてINF のE WHIのriorフォームトンエスパス、そして今ではt彼続きのEファイルのNTS のR eは、汚染されたと台無しに。
あなたは、あなたにファイルを送った人に、彼らがどれだけ間違っているかを示すこともできます。
説明
タイトルが示すように、あなたの課題は、1つ以上のタブを含むファイルを取得することです。
this is an evil tab onoes
そして容赦なくそれらを粉々に砕きます:
this is an evil tab
o
n
o
e
s
Stack Exchangeソフトウェアはリテラルタブを4つのスペースに変換することに注意してください(正しいため)。この投稿内のタブは4つのスペースとして表示されます。ただし、プログラムへの入力には実際のタブが含まれます。
チャレンジ
ソリューションでは、入力として単一の文字列を使用する必要があります。これには、印刷可能なASCII、改行、およびタブが含まれる場合があります。入力には常に少なくとも1つのタブがあります。
出力は同じ文字列で、次の規則が適用されている必要があります。
カーソルを座標(0,0)で右方向に開始します。座標は(列、行)、ゼロインデックス、方向は文字を印刷した後にカーソルを移動する方法です。
文字列の各文字に対して:
改行の場合は、座標(0、n)に移動します(nはこれまでの文字列内の改行の数(これを含む)で、方向を右にリセットします)。
タブの場合、2つのスペースを出力し、カーソルの方向を時計回りに90度回転し、さらに2つのスペースを出力して、タブを半分に効果的に「分割」します。以下は視覚的な例です。タブはで
--->
、スペースはで表されます·
:foo--->bar--->baz
になる
foo··· · b a r · · zab··
それ以外の場合は、単にカーソルの位置に文字を出力し、カーソルを現在の方向に1ステップ移動します。
文字列を最初から最後まで読んでいるので、既存の文字の「上」に書く必要がある可能性があります。これは問題ありません。たとえば、入力
foo--->bar
spaces are superior
の出力になるはずです
foo
b
spaces are superior
r
「壊れたタブ」が他の文字を上書きするかどうかを選択できます。元々の意図はそれらを上書きしないことでしたが、仕様はあいまいだったので、これはあなたの決定です。
さらに、これらのルールを適用した後、次のこともできます
末尾のスペースを必要な数だけ追加または削除します。
最大で1つの末尾の改行を追加します。
入力に末尾のスペースが含まれることはありません。また、先頭または末尾の改行が含まれることはありません。また、0未満の列または行(つまり画面外)に書き込む必要がないと常に仮定することもできます。
テストケース
このテストケースのタブは、--->
SE がタブを取得するため、表されます。
入力:
Test case. Here's a tab--->there's a tab--->everywhere a tab--->tab--->this is some more text
blah
blah
blah blah blah blah blah blah--->blaah--->blaah--->blah--->blaaaaah--->blah--->blah--->blah--->blah--->blah
出力:
Test case. Here's a tab
blah
blah t
blah blah blah blah blah blah
blaablah
r b
e l b
h 'h a l
a sa a a
l l h h
this is some mobe tbxt
haalhalb
b a
a b
t
bat a erehwyreve
ファンシーアニメーション:
ルール
- これはcode-golfなので、バイト単位の最短コードが勝ちます!
(0,0)
、最初にコンソールをクリアする必要があるということですか、それとも単にカーソルのデフォルト位置を意味するだけですか?