良さ、それはタブで覆われています!


26

スペースインデントユーザー、団結!私たちはすべての低タブユーザーと戦わなければなりません!

あなたの使命(受け入れることを選択した場合)は、2つの引数を取るプログラムまたは関数を作成することです。

  • 文字列:これは入力です。
  • 正の整数:タブごとのスペースの数。

文字列のすべての行を調べて、インデントに使用されるすべてのタブを指定された数のスペースに置き換え、インデントに使用されないすべてのタブ(行の中央など)を1つのスペースに置き換える必要があります。

などの行\t \tabcは未定義の動作であることに注意してください。プログラムを複雑にするために、邪悪なタブのユーザーによって挿入されました。

Tabs Must Die Societyによると、悪のタブユーザーによる検出を避けるため、プログラムはできるだけ短くする必要があります。

\t ここでタブを表すために使用されます。

入力文字列:

a
\t\tb\tc
d

入力番号:

4

出力:

a
        b c
d

中央の行は、タブごとに4つの8スペースでインデントされています(指定された数値は4だったため)。

入力文字列:

\ta\t\tb

入力番号:

4

出力:

    a  b

注:これはタブ拡張チャレンジの複製ではありません。非常に異なる入力形式とわずかに異なる要件が必要です。


1
はい、質問で明示的に10進数を要求しない限り(要求しません)。
マーティンエンダー


1
入力に印刷可能なASCII、タブ、改行のみが含まれると仮定できますか?
デニス

2
提案されたテストケース:\ta\t\tb4(私の以前のリビジョンは失敗していました)
デニス

2
ホワイトスペースで答えが必要です。
カズウルフ

回答:


7

CJam、30 24 23バイト

q{_9=NA=Seasi*' ?@?:N}/

私は通常、インターネットに悪意のあるコードを投稿することを拒否します…

これは、STDINから文字列を読み取り、コマンドライン引数として数値を読み取る完全なプログラムです。

CJamインタープリターでオンラインで試してください。

使い方

q                        Read all input from STDIN.
 {                   }/  For each character C in the input:
  _9=                      Push 1 if C is a tab and 0 otherwise.
     NA=                   See below.
        Seasi*             Push a string of W spaces, where W is the integer from
                           the command-line arguments.
              '            Push a spaces character.
                ?          Select the string if NA= pushed a truthy value, the
                           single space otherwise.
                 @         Rotate C on top of the stack.
                  ?        Select the string of spaces or the single space if _9=
                           pushed 1, the character C otherwise.
                   :N      Save the result in N.

NA=が:

  • 最初の文字にNは、デフォルト値、つまりstringが含まれます"\n"

    後続のすべての文字についてNは、最後の反復の結果、つまり入力からの最後の文字、スペース文字、または1つ以上のスペースの文字列が含まれます。

  • Nが文字列の場合NA=、Nのインデックス10の要素を選択します(折り返します)。結果は、スペースまたは改行文字になります。どちらも真実です。

    Nが文字の場合NA=、改行には1をプッシュし、そうでない場合は0をプッシュします。

  • 上記のNA=ため、最初の文字、改行の前の文字、またはスペースの文字列の前の文字(既に置き換えられているインデント)の真理値をプッシュします。

    他のすべての場合(スペース文字に置き換えられNA=たタブレータを含む)、偽の値をプッシュします。


6
悪意のあるタブを削除して、インターネットでサービスを提供しているのは良いことです。;)
アレックスA.

19

K5、53の 45バイト

{{,/(b+a&~b:x*&\a:9=y){$[x;x#" ";y]}'y}[x]'y}

動作中:

  {{,/(b+a&~b:x*&\a:9=y){$[x;x#" ";y]}'y}[x]'y}[4;(,"a";"\t\tb\tc";,"d")]
(,"a"
 "        b c"
 ,"d")

この質問が道徳的に非難できることを記録に示したいだけです。


11
-21346106841の... this question is morally reprehensible.
TheNumberOne

3
人々が脚注を見ることができるように、これは最終的に投票で選ばれた答えになる必要があります。
ジオビット

結果を3バイトで出力する代わりに返すことができます。
kirbyfan64sos

1
@ kirbyfan64sos:行を結合する必要がないように結果を出力しています。結果を文字列のリスト(各行に1つずつ)として受け入れて返すことができれば、保存`0:して `" \ n "\` にすることができます。
ヨーネ

@JohnEできないと言うルールを付けなかったので、できると思います。:)
kirbyfan64sos

8

Perl、23バイト

22バイトのコード+ 1バイトのコマンドライン

願わくば、数値入力が-iパラメーターを介して与えられると仮定するのにあまり生意気ではありません!以下のコードの\ tを実際のタブ文字に置き換えてください。

s/\G\t/$"x$^I/ge;y/\t/ /

使用例:

printf "a\n\t\tb\tc\nd" | perl -p entry.pl -i4

または便宜上:

printf "a\n\t\tb\tc\nd" | perl -pe 's/\G\t/$"x$^I/ge;y/\t/ /' -i4

説明:

-p引数を使用すると、入力のすべての行に対してプログラムが実行され、最後に結果が出力されます。

上記の例では、正規表現の置換が(4回繰り返されるスペース)に置き換え\G\tられ" "x4ます。\G最初の反復の場合は最初の一致の位置に一致するか、最初の反復ではない場合は前の一致の位置から一致する、あまり知られていない正規表現構成体です。つまり、文字列の先頭のすべてのタブのみを置き換えます。 1つずつ行います。y/\t/ /単にスペースで、残りのすべてのタブを置き換えます。


2

ジュリア、69 59バイト

f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")

ゴルフをしていない:

function f(s::String, n::Int)
    # Replace the leading indentation tabs
    r1 = replace(s, r"^\t*"m, i -> " "^endof(i)n)

    # Replace any remaining tabs between words
    r2 = replace(r1, r"\t", " ")

    # Return
    r2
end

10バイトを保存し、グレンOのおかげで問題を修正しました!


主要なインデントタブを個別に置き換えることには利点がありますか?「残りのタブ」部分で直接処理する必要があるように思えます。また、「テキスト間のタブを置き換える」部分は単一のタブにのみ一致します"hello\t\t1"
グレンO

すべてのインデントがタブ("\t \t"状況なし)で行われると仮定するとf(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")、これを行うことができます:置換関数を使用し、1回のヒットですべてのインデントタブをキャッチします。
グレンO

@GlenOうわー、それは本当に天才だ。本当にありがとう!
アレックスA.

私は自分の答えがダウン投票されたことに気づきました。私が間違ったことをしたことはありますか?どんな問題にも対処できてうれしいです。
アレックスA.

問題は見当たりません。たぶんそれは、言語やそのようなものが好きではないからといって、それを支持するのは、あからさまなタイプの1つにすぎないのでしょうか?欠陥は見当たりません。
グレンO


2

Mathematica、42 37バイト

複数のコード保存の提案をしてくれた@ LegionMammal978に感謝します。最初のパラメーター#は入力テキスト用、2番目のパラメーターは#2タブごとのスペース数用です。

StringReplace[#,"\t"->" "~Table~{#2}]&

また、バイトを保存するTable[" ",{#2}]よう" "~Table~{#2}に変更できます。なぜStringJoin空の文字列をその上に入れているのですか?
LegionMammal978


1

JavaScript(ES6)、70

テンプレート文字列を使用すると、改行は重要でカウントされます

(s,n,r=n)=>[...s].map(c=>c<`
`?` `.repeat(r):(r=c<` `?n:1,c)).join``

Firefoxで以下のスニペットを実行してテストします。

F=(s,n,r=n)=>[...s].map(c=>c<`
`?` `.repeat(r):(r=c<` `?n:1,c)).join``

// TEST
out=x=>O.innerHTML+=x+'\n\n'

out('Input: "A\\n\\t\\tB\\tC\\nD" 4\nOutput:\n'+F('A\n\t\tB\tC\nD',4))

out('Input: "\\tA\\t\\tB" 4\nOutput:\n'+F('\tA\t\tB', 4))
<pre id=O></pre>


1
うわー!「Firefoxでのテスト」を読んだり理解したりできない人になりますか?
-edc65

言語の偏りが疑われる。ジュリアとCJamもダウン票を獲得しました。
デニス

1

CoffeeScript、72バイト

(s,n)->s.replace(/^\t+/mg,(m)->" ".repeat(m.length*n)).replace /\t/g," "

(ゴルフに少なくとも2回噛み付くと、ES6ソリューションに勝ちます...感謝します:D)

使用法:

f=(s,n)->s.replace(/^\t+/mg,(m)->" ".repeat(m.length*n)).replace /\t/g," "
str="""
My nice\tString
\tIndent <--
\t\tDouble
""" #\t is recognized as tab by CS
alert(f(str,4))

1

網膜、42バイト

のすべての出現.はスペースであり、すべて\tリテラルタブ(1バイト)であり<empty>、空のファイルを表します。読みやすさのためだけです。また、ループを正しく実行していることも完全にはわかりませんが、そうだと思います。各行は独自のファイルに配置する必要があります。追加ファイルごとに1バイトを追加しました。

入力は、入力の最後にある独自の行で単項にあると想定されます。

(1*)$
_$1
m+`(?<!^|\t)\t
.
(`1$
<empty>
)`\t
\t.
\t|_
<empty>

説明

_置換中に区切るために単項入力の前にaを追加して、入力文字列から後続のものを削除しないようにします。次に、行の先頭にないすべてのタブを単一のスペースに置き換えます。次に、1入力がなくなるまでループし、タブを1 つ削除して各タブの後にスペースを1つ追加します。最後に、タブとアンダースコアを削除してクリーンアップします。


1

Python、72 68バイト

タブはリテラルタブ(1バイト)なので、r'...'不要です。残念ながら、Pythonは「固定幅」の後読み/先読みを必要とするため、を使用できません(?<!^|\t)。Retinaソリューションとほぼ同じ方法を使用します。

import re
lambda s,n:re.sub('\t',' '*n,re.sub('(?<!^)(?<!\t)\t',' ',s))




0

Haskell、75バイト

s#m|let('\t':r)#n=(' '<$[1..n])++r#n;(x:r)#n=x:r#(m^sum[1|x<' ']);e#_=e=s#m

オンラインでお試しください!これは、OPでコメントで許可されているように、入力にタブと改行だけでなく印刷可能な文字のみが含まれていることを前提としています。

説明:

外部#関数は文字列sと数値mを受け取り#、同じ引数でローカルに定義された内部関数を呼び出します。これはm、内部#関数が数値を変更するため、元の値を追跡するために行われます。

  • ('\t':r)#n=(' '<$[1..n])++r#nタブが見つかった場合は、タブをnスペースに置き換え、そのままにしておきnます。
  • (x:r)#n=x:r#(m^sum[1|x<' ']) ある場合 xタブではないものがそのままにしておきますが、改行の場合はn元の番号に設定し、そうでないm場合xは設定します1。これはm^sum[1|x<' ']:によって行われm、その力は、スペース(つまり、改行)よりも小さいときにsum[1|x<' ']評価されるため1xが得られm^1 = mます。それ以外の場合0は、がありm^0 = 1ます。

0

Java 11、134バイト

n->s->{var r="";for(var p:s.split("\n")){for(;p.charAt(0)==9;p=p.substring(1))r+=" ".repeat(n);r+=p+"\n";}return r.replace('\t',' ');}

オンラインでお試しください。
注:Java 11はまだTIO上にないので" ".repeat(n)repeat(" ",n)代わりに(同じバイト数で)エミュレートされています。

説明:

n->s->{                 // Method with integer & String parameters and String return-type
  var r="";             //  Result-String, starting empty
  for(var p:s.split("\n")){
                        //  Loop over the rows (split by new-lines)
    for(;p.charAt(0)==9;//   Inner loop as long as the current row starts with a tab
       p=p.substring(1))//     After every iteration: remove the first character (tab)
      r+=" ".repeat(n); //    Append `n` amount of spaces to the result-String
    r+=p+"\n";}         //   Append the rest of the row with a newline to the result
  return r.replace('\t',' ');} 
                        //   Replace any remaining tabs with a space, and return the result
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.