紐をはずす


48

すでにスペースから文字列を削除する方法はすでにあります。

しかし、適切な紳士/婦人として、むしろそれを脱がなければなりません。


文字列を脱ぐことは、それを取り除くことと同じですが、より繊細です。先行スペースと後続スペースをすべて一度に削除する代わりに、それらを1つずつ削除します。また、ステップを燃やさないように、先頭と末尾を交互に切り替えます。

" codegolf "(先頭と末尾の5つのスペース)で始まる例:

     codegolf     
    codegolf     
    codegolf    
   codegolf    
   codegolf   
  codegolf   
  codegolf  
 codegolf  
 codegolf 
codegolf 
codegolf

  1. 最初に文字列を変更せずに出力します。次に、すべてのステップを出力します。先頭のスペースを削除することから始めます(該当する場合-ルール2を参照)。

  2. 入力の先頭と末尾のスペースの数が異なる場合があります。片方のスペースが足りなくなった場合は、ひもがむき出しになるまでもう片方を脱いでください。

  3. 入力には、先頭または末尾のスペースがない場合があります。その場合は、そのまま出力します。

  4. PPCGのデフォルトのI / Oメソッドを使用しますPPCGデフォルトの抜け穴は禁止されています。

  5. 空の入力、またはスペースのみを含む入力での未定義の動作は問題ありません。

  6. 文字列にはASCII印刷可能スペース(0x20to 0x7E)の文字のみが含まれると想定できます。


例- .読みやすくするためにスペースをドットに置き換えます:

4 leading spaces, 5 trailing: "....Yes, Sir!....."
....Yes, Sir!.....
...Yes, Sir!.....
...Yes, Sir!....
..Yes, Sir!....
..Yes, Sir!...
.Yes, Sir!...
.Yes, Sir!..
Yes, Sir!..
Yes, Sir!.
Yes, Sir!

6 leading, 3 trailing: "......Let's go golfing..."
......Let's go golfing...
.....Let's go golfing...
.....Let's go golfing..
....Let's go golfing..
....Let's go golfing.
...Let's go golfing.
...Let's go golfing
..Let's go golfing
.Let's go golfing
Let's go golfing

0 leading, 2 trailing: "Hello.."
Hello..
Hello.
Hello

0 leading, 0 trailing: "World"
World

21 leading, 5 trailing: ".....................a....."
.....................a.....
....................a.....
....................a....
...................a....
...................a...
..................a...
..................a..
.................a..
.................a.
................a.
................a
...............a
..............a
.............a
............a
...........a
..........a
.........a
........a
.......a
......a
.....a
....a
...a
..a
.a
a

紳士/婦人は簡潔なので、バイト単位の最短回答が勝ちます。



少なくとも1つの非スペース文字があると仮定できますか?
マーティンエンダー

2
@KevinCruijssen印刷可能なスペース(0x20to 0x7E)でASCII文字のみを処理する必要があります。他のものは未定義の動作です。
Nathan.Eilisha Shiraini

1
@KevinCruijssenはい、このようなテストケースはありません。何のようなものは存在しません" test\r "" \v test"のどちらか。
Nathan.Eilisha Shiraini

1
これは有効なテストケース".....................a....."ですか?もしそうなら、いくつかの答えはこの種のテストに失敗するようだから追加することをお勧めします。(もちろん、ドットは読みやすくするためです)
シナスキ

回答:


11

網膜、26バイト

{m`^ (.+)\z
$&¶$1
 $
 ¶$%`

オンラインでお試しください!(テストスイートでは、明確にするためにピリオドを使用しています。フッターとヘッダーは、メインコードのスペースとの間でそれらを変換します。)

説明

毎回先頭と末尾のスペースをドロップし、中間結果を出力することを交互に行うことができればいいと思います。問題は、現在Retinaは条件付きで印刷できないため、先頭または末尾のスペースが残っていない場合にこの中間結果を印刷し、重複を生成することです。(Retina 1.0は、操作によって文字列が変更された場合にのみ結果を出力するオプションを取得しますが、まだそこにいません...)

そのため、代わりに、すべての中間結果を含む単一の文字列を作成し、それを最後に出力します。

{m`^ (.+)\z
$&¶$1

この{プログラムは、プログラムの両方の段階をループでラップします。ループは、文字列の変更が止まるまで繰り返されます(つまり、先頭または末尾のスペースがなくなる)。ステージ自体は、文字列の最後の行の先頭のスペースとその最後の行に一致し、その一致と新しい行のスペースの後のものを書き戻します(これにより、コピーの先頭のスペースが削除されます)。

 $
 ¶$%`

末尾のスペースを削除するのは少し簡単です。最終スペースに一致するだけであれば、その前にある(同じ行にある)ものにアクセスできます。$%`これは、プレフィックス置換の行対応バリアントです$`


11

パイソン2122 107 103 102 98 95 93 91 90の 88 87のバイト

s=input()+' '
a=0
while-a*s!=id:
 if a:id=s
 a=~a
 if'!'>s[a]:s=s[1+a:len(s)+a];print s

オンラインでお試しください!


Pythonの397の 95 93 90バイト

s=input()
a=p=print
p(s)
while s!=a:
 a=s
 if'!'>s:s=s[1:];p(s)
 if'!'>s[-1]:s=s[:-1];p(s)

オンラインでお試しください!


s=input()関数の代わりに使用すると、バイト数が少なくなります。
ジョナサンフレッチ

を参照して5. Undefined behaviour on empty input, or input that only contains spaces, is OK.98バイト
ジョナサンフレッチ


@JonathanFrech私はそれを見なかった。ありがとう:)
TFeld

2
Python 2コードaは、組み込み関数idに置き換えることでさらに学習でき、最初に定義する必要がなくなります。-2バイト。
LyricLy

7

Perl 6、55バイト

@nwellnhofのおかげで3バイト節約されました。

{($_,{$++%2??S/" "$//!!S/^" "//}...*)[^.comb*2].unique}

オンラインでお試しください!

説明($_,{$++%2??S/" "$//!!S/^" "//}...*)元の文字列($_)で始まる再帰的な無限シーケンスであり、次の要素は前の要素で呼び出されたブロックによって指定されます。

ブロック自体は$_変数内の文字列を取得します。演算子S/(regex)/(string)/は、(regex)in の最初の出現を検索し、$_それを(string)に置き換えて、結果を返します。一致するものがない場合は、$_変更されていないコンテンツを返します。and を交互に繰り返す?? !!条件付きの三項演算子を使用します(ブロックの呼び出し全体でその内容を保存する自由変数です)。$++%2FalseTrue$

最悪の場合(片側のすべてのスペースと他の1文字)、2ステップごとに1スペースを削除します。したがって、2 *(文字列の長さ)ステップで、すべてのスペースが削除されたことを確認できます。再帰シーケンスからその多くの要素を取得し[^.comb*2]、最後に重複を破棄します(スペースは削除されるべきですが、そこにない場合に発生し.uniqueます)。これは、スペースが徐々に取り除かれた文字列のリストを返します。


[^.comb*2]2バイト節約します。何らかの理由でこれは機能しますが、[^2*.comb]機能しません。理由はわかりません。3進数?? !!を使用して正規表現を選択すると、別のバイトが節約されます。
nwellnhof

ありがとう!試し[^2*.comb]たがうまくいかなかったので、私はを使用した[0..2*.comb]。そして、三元のためのおかげで、私はちょうどそれがあまりにも高価だと思ったし、私がさらに高価なもの...とそれを置き換えるように私には発生しなかった
Ramillies

7

05AB1E21 15バイト

=v¬ðQi¦=}¤ðQi¨=

オンラインでお試しください!

説明 ^

=                 # print input
 v                # for each character in input
  ¬ðQi  }         # if the first char in the current string is a space
      ¦=          # remove it and print without popping
         ¤ðQi     # if the last char in the current string is a space
             ¨=   # remove it and print without popping

ダン、私は似たようなことを試しましたが、何らかの理由で頭/尾が文字列で動作しないと確信し、githubでそれについて問題を提起しようとしていました。デバッグログを間違えて読んだに違いありません。:-)
スコチネット

1
@scottinet:エンドチェックを回避する方法を見つけたところです:)
Emigna

ああ...なぜ私たちは以前それについて考えなかったのですか?条件付きで印刷するため、正確な回数だけループする必要はないので、十分な回数だけループする必要があります。私は答えを改善するためにそのアイデアを借りています:
scottinet

1
@scottinet:ええ。あなたがそれについて考えるとき、それは明らかですが、時々それらのものを見逃すのは簡単です:P
Emigna

TFWの不格好な冗長回答がリードを獲得...
エリックアウトゴルファー

7

C(gcc)89 84バイト

再帰バージョンはより短いです;-)

j;f(char*s){puts(s);*s^32||puts(++s);s[j=strlen(s)-1]<33?s[j]=0,f(s):*s^32||f(s+1);}

オンラインでお試しください!

C(GCC) 107の 102 101 100 99バイト

スペースと〜を使用した@Jonathan Frechのおかげで2バイト節約

i,j,k;f(char*s){for(i=~++k,puts(s);i^k;k=s[j=strlen(s)-1]<33?s[j]=0,puts(s):0)*s^32?i=0:puts(++s);}

オンラインでお試しください!


2
質問は本当にドットではなくスペースを削除することを望んでいると思います。スペースを使用することにも利点があります。あなたは置き換えることができ==46<33スペースが最小の印刷可能な文字であるとして、あなたがものだけを処理する必要があります。
ジョナサンフレッチ

何をし++k+ますか?
ジョナサンフレッチ

@JonathanFrechはインクリメントを事前kとに相当する、1を加算しますk = k + 1; i = k + 1;か、i = k + 2; k = k + 1
ハイパーニュートリノ

技術的にi=k+++2はあまりにも+++奇妙に見えるので私が使用したはずです:P
HyperNeutrino

@HyperNeutrinoええ、プリインクリメント演算子が何をするか知っています。ただし、それなしではコードがどのように機能するかわかりません。だから、私はそれがどのように定義されているかではなく、どのような役割を果たしているのかを尋ねていました。
ジョナサンフレッチ

6

JavaScript(ES6)92

@Upvoters:76バイトの長さである他のJSの回答を下に見てください

(s,q,l=2,p=0)=>{for(alert(s);l--;p=!p)s[+p&&s.length-p]<'!'&&alert(s=s.slice(!p,-p||q,l=2))}

前方または末尾のスペースを探すループ。見つかった場合は、スペースと出力文字列を削除します。スペースが2回見つからない場合は、停止します。

F=
(s,q,l=2,p=0)=>{for(alert(s);l--;p=!p)s[+p&&s.length-p]<'!'&&alert(s=s.slice(!p,-p||q,l=2))}

// some trick to show dots instead of spaces, for test
alert=x=>console.log(x
  .replace(/^ +/g,z=>'.'.repeat(z.length))
  .replace(/ +$/g,z=>'.'.repeat(z.length))
)

function go() {F(I.value.replace(/\./g,' '))}

go()
<input ID=I value='....yes Sir!....'> (use dot instead of space)
<button onclick='go()'>Go</button>


でスペースをチェックすることでバイトを節約できます<'!'。スニペットを引き続きreplace機能させるには、関数に渡す前にスペースでピリオドを使用します。
ジャスティンマリナー

@JustinMarinerは大丈夫です。OPは ''よりも小さい文字は期待しないと述べているためです。おかげで
edc65

6

Perl 5、32バイト

@Abigailにより4バイトを節約しました

1while s/^ /!say/e+s/ $/!say/e

-pl2としてカウントする必要があります-E

サンプルの使用法

$ echo '   test   ' | perl -plE'1while s/^ /!say/e+s/ $/!say/e'
   test   
  test   
  test  
 test  
 test 
test 
test

オンラインでお試しください!


末尾にスペースがない文字列では正しく機能しません。
nwellnhof

print;s/^ //&&print,s/ $//&&print while/^ | $/-nフラグで動作し、また-l必要ありません
ナウエルフイユル

@nwellnhofが修正されました。
プリモ

5

C#(.NETコア)192の 183 182 181 179 178バイト

Kevin Cruijssenのおかげで-3バイト

n=>{var o=n+"\n";for(var e=1;n.Trim()!=n;){if(1>(e^=1))if(n[0]<33)n=n.Remove(0,1);else continue;else if(n.TrimEnd()!=n)n=n.Remove(n.Length-1);else continue;o+=n+"\n";};return o;}

オンラインでお試しください!


ゴルフのいくつかのこと:var e=1;while(n.Trim()!=n)-> for(var e=1;n.Trim()!=n;); if(n[0]==' ')->if(n[0]<33)
ケビンクルイッセン

私は2番目のものについて考えましたが、テスト文字列に改行が含まれている場合はどうなりますか?
誰か

OK、<33OPの新たに追加されたルールにより可能です0x200x7E:「文字列にはASCII印刷可能スペース(to )の文字のみが含まれると仮定できます。
ケビンクルーッセン

5

ジャワ8、150の 146 145 137バイト

s->{String r=s;for(int f=0;s!=s.trim();f^=1)r+="\n"+(s=f+s.charAt(0)<33|!s.endsWith(" ")?s.substring(1):s.replaceAll(" $",""));return r;}

@Nevayがに変更さ(f<1&s.charAt(0)<33)れたため、-4バイトf+s.charAt(0)<33
-1バイトの代わりに、@ someoneのC#.NET回答!s.trim().equals(s)からのトリックを使用します@Nevayに -8バイトのおかげで、に変更することにより、「先頭および末尾の空白が削除されたこの文字列のコピー、または先頭または末尾の空白がない場合はこの文字列のコピー」を返すため、参照は同じままであり、同じ値を確認する代わりに、それらが同じ参照であるかどうかを確認するために使用できます。s.matches(" .*|.* ")
!s.trim().equals(s)s!=s.trim()String#trim!=.equals

説明:

ここでそれを試してみてください(またはそれ以上の視覚的なバージョンを試してみてください、ここ#スペースの代わりに)。

s->{                               // Method with String as both parameter and return-type
  String r=s;                      //  Result-String (starting at the input)
  for(int f=0;                     //  Flag-integer (starting at 0)
      s!=s.trim();                 //  Loop as long as `s` contains leading/trailing spaces
      f^=1)                        //    And XOR(1) `f` after every iteration (0->1; 1->0)
    r+="\n"                        //   Append the result with a new-line
       +(                          //    Followed by:
         s=f+                      //     If `f` is 0,
             s.charAt(0)<33        //     and `s` starts with a space
           |!s.endsWith(" ")?      //     Or doesn't end with a space
            s.substring(1)         //      Remove the first leading space
           :                       //     Else:
            s.replaceAll(" $",""));//      Remove the last trailing space
                                   //  End of loop (implicit / single-line body)
  return r;                        //  Return the result-String
}                                  // End of method

1
(-4バイト)のs=f+s.charAt(0)<33代わりに使用できます(f<1&s.charAt(0)<33)
ネベイ

1
s!=s.trim()代わりに!s.trim().equals(s);(-8バイト)を使用できます。
ネベイ


4

ゼリー、16バイト

Ḋ=⁶Ḣ$¡UµÐĿ¹Ṛƭ€QY

オンラインでお試しください!

Erik the Outgolferのおかげで-2バイト
マイルのおかげで-1バイト

説明

Ḋ=⁶Ḣ$¡UµÐĿ¹Ṛƭ€QY  Main link
       µÐĿ        While the results are unique (collecting intermediate results), apply the last link (`µ` creates a new monadic link):
Ḋ=⁶Ḣ$¡            Remove a space from the beginning if there is one
 =⁶Ḣ$             If the first character is a space, then 1, else 0
 =                Compare each character to
  ⁶               ' '
   Ḣ              Get the first comparison
Ḋ                 Then Dequeue the string (s -> s[1:])
    ¡             That many times
     U            And reverse the string (the next time this is called, it will remove spaces from the end instead)
             €    For each string
            ƭ     Alternate between two commands:
          ¹       Identity (do nothing), and
           Ṛ      Reverse
          ¹Ṛƭ€    Correct all strings that are reversed to remove the trailing space
              Q   Remove duplicates (where there was no space to remove)
               Y  Join on newlines


@EriktheOutgolfer編集ありがとうございます。
ハイパーニュートリノ

反転/同一性の交互のコマンドを使用したクールなアイデア!
エミグナ

@Emignaありがとう!:DIは、主に新しいクイックを使用する言い訳が欲しかった... heh:P
HyperNeutrino

ƭチェーンが2より長い場合にのみniladが必要です。¹Ṛƭここで正常に動作します。
マイル


3

Java(OpenJDK 8)161 147 146バイト

x->{for(int l=0,r=x.length(),k=-1,u,v;((u=32-x.charAt(l)>>k)*(v=32-x.charAt(r-1)>>-1))<1;x+="\n"+x.substring(l-=k&~u|v,r+=(k=~k)&~v|u));return x;}

オンラインでお試しください!

@Kevin Cruijssenのおかげで-1バイト!

x -> {
    /*
     * l: left index (inclusive)
     * r: right index (exclusive)
     * k: side to remove from, -1:=left, 0:=right
     * u: left character   0:=space, <0:=no space (-1 if k is left side)
     * v: right character  0:=space, -1:=no space
     */
    for (int l = 0, r = x.length(), k = -1, u, v;
            ((u = 32 - x.charAt(l) >> k)
           * (v = 32 - x.charAt(r - 1) >> -1)) < 1; // loop while left or right has space(s)
            x += "\n" + x.substring(                // append newline and substring
                    l -= k & ~u | v,                // inc. left  if k is left side
                                                    //               and left has space
                                                    //            or right has no space
                    r += (k = ~k) & ~v | u));       // dec. right if k is right side
                                                    //               and right has space
                                                    //            or left has no space
    return x;
}

1
ふふ、あなたの削除された答えを見て、あなたが私の150バイトを下回っていて、それを取り消すだろうと思っていました。;)
ケビンクルーイッセン

1
私は完全には(u=32-x.charAt(l)>>-1)(u=32-x.charAt(l)>>k)
わかり

@KevinCruijssenウィルない仕事は、kある0ごとに2回目の反復。
ネベイ

1
はい、しかし、奇妙な部分は、TIOが動作し、この変更を含むすべてのテストケースに対して正しい結果を提供することですu。私もforに変更-1するときはそうではありません。それはかかわらず動作しますなぜ以来、私は、困惑している確かになります後..:Skvk0k=~k
ケビンCruijssen

1
@KevinCruijssen k=0シナリオの場合:leftにスペースが残っuている場合、前と同じ値(0); leftにスペースが残っていない場合、()と(k=~k)&~v|u評価されるため、の未定義(負)の値は重要ではありません()。-1|u~0&-1|uu-1|x==-1
ネベイ

3

05AB1E25 17バイト

Emignaからのエンドチェック不要のアイデアを借用して-8バイト

,v2F¬ðQi¦DNiR},}R

オンラインでお試しください!

私は、それほど単純でないアプローチがそのソリューションを簡単に打ち負かすことができると確信しています。今のところ...

説明:

,v2F¬ðQi¦DNiR},}R           Full Programm
,                           Print the input string
 v                          For each char of the string
                               (we don't really care, we only need to loop
                                enough times to accomplish our task, since
                                we print conditionally we can loop more
                                times than necessary)
  2F...........}            Two times...
    ¬õQi                       Is 1st item a space?
        ¦D                        Remove 1st item + duplicate
          NiR}                    If on the second pass: reverse the list
              ,                   Pop & print with newline
               }               End If
                 R          Reverse the list

私はあなたのループのアプローチが好きです:)私は複数のifなしで1つのパスですべてを行う方法を見つけようとしましたが、まだそれを理解していません。また、説明にはスペースではなく空の文字列が含まれているようです。
エミナ

ありがとう!説明を修正し、コードをゴルフしたときに「-1バイト」のS代わりに「空」の部分を編集するのを忘れました#。ループは...まあ...簡単なアプローチに比べてなんと1バイト節約できます。私は現在、タスクの終了を検出するためのより短い方法を探しています(これには5バイトが多くなります)。また、まったく別のアプローチも検討しています。この課題を解決するより賢い方法があると思います。
スコチネット

あなたがしようとすると(私は現在に探していたように)1回のパスですべてを行う場合は、最高のは、ループを終了するため、私が持っているチェック... 8バイトである
Emigna

3

R145の 133 111バイト

@Giuseppeのおかげで、結果をsub新しい変数に保存し、それが変更されたかどうかをテストして、-12バイト

改行を含む文字列ではなく、文字列のベクトルを返すことにより、-22バイト

function(s){L=s
while(grepl("^ | $",s)){if((x=sub("^ ","",s))!=s)L=c(L,x)
if((s=sub(" $","",x))!=x)L=c(L,s)}
L}

オンラインでお試しください!

部分的に未使用のバージョンの説明:

function(s){
  L=s                          # Initialise a vector with the original string
  while(grepl("^ | $",s)){     # While there are leading or trailing spaces...
    if((x=sub("^ ","",s))!=s){ # Check whether we can remove a leading space
      L=c(L,x)                 # If so, add the shortened string to the vector
    }
    if((s=sub(" $","",x))!=x){ # Check whether we can remove a trailing space
      L=c(L,x)                 # If so, add the shortened string to the vector
    }
  }
  L                            # Return the vector
}                              

C(s<-sub(),\n)別の印刷ステートメントの代わりに使用できませんか?あ、いや、なぜならsep=" "
ジュゼッペ

@Giuseppeはい、追加する必要があるため、すべてを1つのステートメントに含めると少し長くなりsep=""ます。ほとんどの課題では、余分な後続スペースは重要ではありませんが、残念ながらここでは重要です。
user2390246

133バイト -あなたの使用に関する何かsubがこれを示唆した、IDK理由
ジュゼッペ

@ジュゼッペ非常にエレガント!
user2390246

L=s文字列のベクトルを設定して返すだけですか?
ジュゼッペ

3

JAVA(OpenJDKの8) 137の 125 121 120 124バイト

s->{int i=1;do System.out.println(s);while(s!=(s=s.substring(s.charAt(0)<33?i:(i=0),s.length()-(s.endsWith(" ")?i^=1:0))));}

オンラインでお試しください!


素敵な答え!同じようにshortとして私の答え 137バイトの、しかし、あなたはまだゴルフ12は次のようにバイトすることができます:s->{for(int i=0;s!=s.trim();)System.out.println(s=s.substring(s.charAt(0)<33?1-i%2:0,s.length()-(s.endsWith(" ")?i++%2:0)));}
ケビンCruijssen

現在、これは「...文字列を変更せずに出力」せず、先頭にスペースがあり、末尾にスペースがない入力では失敗します。
ネベイ

1
s->{int i=1;do System.out.println(s);while(s!=(s=s.substring(s.charAt(0)<33?i:(i=0),s.length()-(s.endsWith(" ")?i^=1:0))));}(124バイト)を使用できるかもしれません(正しいようですが、あまりテストしていません)。
ネベイ

3

MATL21 16バイト

tnE:"t@o&)w46-?x

明確にするために、スペースではなくドットを使用します。スペースのために置き換える46ことで32

オンラインでお試しください!

説明

tn      % Input (implicit). Duplicate and push length, say L
E       % Multiply by 2
:       % Push range [1 2 ... 2*L]
"       % For each k in that array
  t     %   Duplicate the string at the top of the stack
  @     %   Push k
  o     %   Parity: gives 1 or 0
  &)    %   Two-ouput indexing. Pushes the k-th entry of the string and then
        %   the rest of the string. The 1-st output is the first, the 0-th
        %   is the last (indexing is 1-based dand modular)
  w     %   Swap
  46-   %   Subtract 46, which ias ACII for '.'
  ?     %   If non-zero
    x   %     Delete sub-string that was obained by removing that entry
        %   End (implicit)
        % End (implicit)
        % Display stack (implicit)

3

ハスク23 22バイト

u§↑L`G`I¢e₁ȯ↔₁↔
?tI<"!

-1バイトのLeoに感謝します。

オンラインでお試しください!

説明

関数`G`Iは本当に組み込みのはずです...

?tI<"!  Helper function: remove initial space.
?  <"!  If less than the string "!",
 t      remove first character,
  I     else return as is.
u§↑L`G`I¢e₁ȯ↔₁↔  Main function.
         e       List containing
          ₁      the helper function
           ȯ↔₁↔  and the composition reverse-helper-reverse.
        ¢        Repeat it cyclically.
    `G`I         Cumulative reduce from left by function application
                 using input string as initial value.
 §↑L             Take first length(input) values.
u                Remove duplicates.

いいね!実際、関数を周期的に適用するために、より多くのビルトインが必要になります...ところで、最初のスペースを削除するためのわずかに短い方法が見つかりました:tio.run
Leo

@レオありがとう!使い方?...後知恵で明らかに思える
Zgarb

3

C ++、196の 193 189 186 183バイト

ジョナサン
フレッシュのおかげで-10バイトザカリーのおかげで-3バイト

#include<iostream>
#include<string>
#define D std::cout<<s<<'\n'
#define R ~-s.size()
auto u=[](auto s){D;while(s[0]<33||s[R]<33){if(s[0]<33)s.erase(0,1),D;if(s[R]<33)s.erase(R),D;}};

MSVCでのコンパイルには、SDLチェックの非アクティブ化が必要です


あなたは交換することができるかもしれない==32<33
ジョナサンフレッチ

私はC ++マスターではありませんが、#include<string> 本当に必要ですか?
ジョナサンフレッチ

if(...){...;D;}-> if(...)...,D;
ジョナサン

@JonathanFrechあなたがそこでしたことはコンパイラー固有のものであり、標準では保証されていません。VC ++は、文字列を明示的に含めない限り、<<演算子の定義を見つけることができません。
HatsuPointerKun

#define R ...<33||R){およびif(R){-> #define R ...<33)||R{およびif(R{
ジョナサンフレッチ

2

C#(.NET Core)176 170バイト

using System;s=>{Action o=()=>Console.WriteLine(s);o();Func<int>l=()=>s.Length-1;while(s!=s.Trim()){if(s[0]<33){s=s.Remove(0,1);o();}if(s[l()]<33){s=s.Remove(l());o();}}}

オンラインでお試しください!

これは@someoneのanswerの代替であり、文字列を直接出力するだけです。


プログラムは、スペースを削除する前に文字列を変更せずに出力しません。
Nathan.Eilisha Shiraini

@ Nathan.EilishaShiraini私はその間違いを修正し、とにかくバイト数を減らすために数バイトをゴルフしました。
BgrWorker

2

JavaScript(ES6)、76バイト

f=(s,r,n,l=s.length)=>s[r?--l:0]<"!"?s+`
`+f(s.slice(!r,l),!r):n?s:f(s,!r,1)

複数行の文字列として出力します。

テストケース

ほとんどの回答が行っているように、スペースの代わりにドットを使用します。



2

オクターブ88 83バイト

Stewie Griffinのおかげで5バイトオフ

x=[input('') 0];for p=mod(1:sum(x),2)if x(~p+end*p)<33,disp(x=x(2-p:end-p)),end,end

オンラインでお試しください!


非常に素晴らしい。「とにかく、いくつかのバイトを削除できるかどうかを確認してください」: -P
Stewie Griffin

@StewieGriffin私はあなたの答えで言った... :-D良いアイデア、ありがとう!
ルイスメンドー

私はそれが...これに比べてとても平凡だ...鉱山を削除するかもしれない
Stewieグリフィン

@StewieGriffinこれは、2バイト削除するアイデアです。動的に縮小さminれるために必要な同情s
ルイスメンドー

2

Linux用のx86マシンコード、60バイト

e8 1f 00 00 00 31 c0 80 3f 20 75 09 47 4d 74 10
e8 0f 00 00 00 80 7c 2f ff 20 74 05 84 c0 75 e5
c3 4d eb dc 6a 04 58 50 31 db 43 89 f9 89 ea cd
80 58 6a 0a 89 e1 89 da cd 80 58 c3

これはLinux x86の機能です。入力文字列としての文字列ediと文字列の長さを受け取りますebp

テストするインフラストラクチャを備えたUngolfed(FASMでコンパイルし、文字列をプログラム引数として実行します。undress:実際の関数コードのラベルを探します):

format ELF executable
segment executable
SYS_WRITE = 4
    jmp     callUndress
; -------------------- the function itself --------------------------------
; Input:
;   edi=string
;   ebp=length
undress:
undressLoopPrint:
    call    print
undressLoop:
    xor     eax, eax    ; flag of having printed anything on this iteration
    cmp     byte [edi], ' '
    jne     startsWithoutSpace
    inc     edi
    dec     ebp
    jz      quit
    call    print
startsWithoutSpace:
    cmp     byte [edi+ebp-1], ' '
    je      endsWithSpace
    test    al, al      ; if print has been called, then we have 0x0a in eax
    jnz     undressLoop
quit:
    ret
endsWithSpace:
    dec     ebp
    jmp     undressLoopPrint
print:
    push    SYS_WRITE
    pop     eax
    push    eax
    xor     ebx, ebx
    inc     ebx ; STDOUT
    mov     ecx, edi
    mov     edx, ebp
    int     0x80
    pop     eax
    push    0x0a    ; will print newline
    mov     ecx, esp
    mov     edx, ebx ; STDOUT=1, which coincides with the length of newline
    int     0x80
    pop     eax
    ret
; --------------------- end undress ---------------------------------------
SYS_EXIT = 1
STDERR = 2
callUndress:
    pop     eax     ; argc
    cmp     eax, 2
    jne     badArgc
    pop     eax     ; argv[0]
    pop     edi
    mov     al, 0
    cld
    mov     ecx, -1
    repne   scasb
    lea     edi, [edi+ecx+1] ; argv[1]
    neg     ecx
    sub     ecx, 2
    mov     ebp, ecx     ; strlen(argv[1])
    call    undress
    xor     ebx, ebx
exit:
    mov     eax, SYS_EXIT
    int     0x80
    ud2
badArgc:
    mov     esi, eax
    mov     eax, SYS_WRITE
    mov     ebx, STDERR
    mov     ecx, badArgcMsg
    mov     edx, badArgcMsgLen
    int     0x80
    mov     ebx, esi
    neg     ebx
    jmp     exit
badArgcMsg:
    db      "Usage: undress YourString",0x0a,0
badArgcMsgLen = $-badArgcMsg
segment readable writable
string:
    db      100 dup(0)
    stringLen = $-string

sys_write()は、eax非ゼロ(具体的1には、書き込まれていない文字の数-errno)になりprintます。したがってpop eax、最後に行かない場合はそうなります。の直前xor eax,eaxcmp byte [edi], ' 'を保存しmov al,1、を保存することもできeaxます。保存/復元することもできます。実際に保存するのは、で強打しSYS_WRITEた後です。うーん、代わりに0、あなたが使用できるSYS_WRITE対を1するので、cmp al, imm8同じサイズですtest al,al
ピーターコーデス

あなたは2番目を'\n'するmov byte [ecx + edx], '\n'代わりに配列に入れることができますwrite()か?(そして、印刷後に長さを減らしますか?)いくつかの指示を節約するかもしれません。
ピーターコーデス

実際、print()現在は'\n'eaxありますが、これはとは異なりSYS_WRITEますので、まだ確認できます。私はあなたが保存/復元していると思いましたがeax、それは周りの定数をコピーしてバイトを保存しているだけです。長い文字列のsys_write()場合、eaxの上位バイトをゼロ以外のままにしておくことができるため、残念ながらを使用するだけで除外されmov al, SYS_WRITEます。
ピーターコーデス

@PeterCordesは実際、はい、mov al, 1無関係でした。-2バイト、ありがとう。
ルスラン

レジスタ呼び出し規則は、ロード命令を保存します。コードゴルフでは、カスタム呼び出し規約は通常、asmにとって公正なゲームです。OTOH、標準のスタック引数呼び出し規約をゴルフしたいなら、それも面白いです。
ピーターコーデス

2

PHP、117バイト

最初に余分なスペースを追加して、スペースを取り、余分なコードなしで元のスペースを表示します。

ちょっと新しい...... <phpとPHPファイルの先頭のスペースは6バイト余分に追加されますか、それとも無料で取得できますか?

$s=" $argn";while($r!=$s){$r=$s;if($s[0]==" ")echo($s=substr($s,1))."
";if($s[-1]==" ")echo($s=substr($s,0,-1))."
";}

オンラインでお試しください!


1
メソッドを使用すると、6バイト削減できます:オンラインで試してみてください!
Night2

1
PHPの開始タグは、次のようなコマンドで実行できるため省略できます。php -r "echo 1;"ただし、次のようなコマンドを使用する場合<?=1;は、タグをバイトカウントに含める必要があります。
Night2

1

Pyth、28バイト

QW<lrKQ6lQ=hZ?&%Z2qdhQ=tQ=PQ

ここで試してみてください!またはすべてのテストケースを検証してください!

説明

QW<lrKQ6lQ=hZ?&%Z2qdhQ=tQ=PQ   ~ Full program. Q is autoinitialized to input.

Q                              ~ Output the input.
 W<lrKQ6lQ                     ~ Loop while the condition is met.
  <                            ~ Is smaller?
   lrKQ6                       ~ The length of the original input, stripped on both sides.
        lQ                     ~ The length of the current Q.
          =hZ                  ~ Increment a variable Z, initially 0
             ?&%Z2qdhQ         ~ If Z % 2 == 1 and Q[0] == " ", then:
                      =tQ      ~ Make Q equal to Q[1:] and output, else:
                         =PQ   ~ Make Q equal to Q[:-1] and output.



1

オクターブ、89バイト

s=input('');while any(s([1,end])<33)if s(1)<33,s(1)=[],end,if s(end)<33,s(end)=[],end,end

オンラインでお試しください!

時間があれば、後で説明を追加します。アプローチを完全に変更すれば、いくつかのバイトをゴルフで飛ばせるかもしれませんが、残念ながらその程度はわかりません。

ここの最後の文字は「sendsendendend」と綴っています。end変数として保存し、それを使用する方法があればいいのにと思いますが...


で出力するのは有効ですs = ...か?(私は知っている通常の質問)
ルイスメンドー

とにかく、いくつかのバイトを削除できるかどうかを確認してください:-P
ルイスメンドー

1

Bash、98 94バイト

シーケンスの代わりにサブシェルを使用して4バイトを保存(パフォーマンスが悪い)

r()(s=$1;[[ $s = $b ]]||([[ $s = $a ]]||echo "$s"
b=$a a=$s;((i=!i))&&r "${s# }"||r "${s% }"))

最初の答え

r(){ s=$1;[[ $s = $b ]]||{ [[ $s = $a ]]||echo "$s"
b=$a a=$s;((i=!i))&&r "${s# }"||r "${s% }";};}

!対話モードでエスケープする必要があることに注意してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.