文字列を切り替える


15

課題は、単に別の文字列内の文字列を切り替えることです。

説明

場合は、トグル文字列はのサブある主な文字列は、すべてのインスタンス削除トグル文字列からの主な文字列を、それ以外の場合は、メイン文字列の最後にトグル文字列を追加します

ルール

  • すべての文字列は印刷可能なASCII文字で構成されています
  • この関数は、メイン文字列トグル文字列の 2つのパラメーターを受け取る必要があります
  • 主な文字列は空にすることができます。
  • トグル文字列は空にすることはできません。
  • 結果は文字列でなければならず、空でもかまいません。
  • 最短の答えが勝ちです。

function toggle(main_string, toggle_string){ ... }

toggle('this string has 6 words ', 'now') 
=> 'this string has 6 words now'

toggle('this string has 5 words now', ' now') 
=> 'this string has 5 words'

テストケース

'','a'          => 'a'
'a','a'         => ''

'b','a'         => 'ba'
'ab','a'        => 'b'

'aba','a'       => 'b'
'ababa', 'aba'  => 'ba'

2
@KennyLau 3時間ずっとサンドボックスにいました。推奨は2日間です。
モーガンスラップ

9
推奨事項は実際には72時間です。メインページはサンドボックスよりもはるかに可視性が高いため、ここでより多くのコメントが保証されます。とはいえ、これは悪い挑戦ではなく、いくつかのラフなエッジがあります。
AdmBorkBork

2
重複していないすべてのインスタンスを置き換えますか?
Suever

1
@Jakubeはい、これを文字と数字に制限する必要があります。
nobe4

1
いいえ、非英数字を許可していると思います。その方法はより難しいです。
msh210

回答:



11

Java 8、80 70 65 34バイト

t->m->m==(m=m.replace(t,""))?m+t:m

おそらくこれまでの私の最短のJava 'codegolf' ..
コメントからの助けを借りたxD ..;)

説明:

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

t->m->                     // Method with two String parameters and String return-type
                           // (NOTE: Takes the toggle `t` and main `m` in reversed order)
  m==(m=m.replace(t,""))?  //  If `m` equals `m` with all `t`-substrings removed:
                           //  (And set `m` to `m` with all `t`-substrings removed)
   m+t                     //   Output this new `m` concatted with `t`
  :                        //  Else:
   m                       //   Output just this new `m`

1
if3進法に変更すると、かなりの数を節約できるはずです。それ以外の場合は、「余分」を取り除きますreturn
ジオビット

@Geobits Ah、もちろん..私は非常に熱心だったので、1つのメソッドが(java 'codegolfing'の観点から) '低'バイトカウントを持っていたため、ifsおよびreturnの最も明らかなcodegolfingの1つを忘れました。編集ありがとうございます。
ケビンCruijssen

1
通常の関数の代わりにラムダを使用すると、さらに数バイトを節約できます。
デンカー

return m=m.replace(t,"")?m+t:m;
リーキー修道女

2
m==(m=m.replace...
リーキー修道女

8

MATL、11バイト

yyXf?''YX}h

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

すべてのテストケース

説明

            % Implicitly grab the main string
            % Implicitly grab the toggle string
y           % Copy the main string
y           % Copy the toggle string
Xf          % Check to see if the toggle string is present in the main string
?           % If so
    ''YX    % Replace with an empty string
}           % else
    h       % Horizontally concatenate the two strings
            % Implicit end of if...else
            % Implicitly display the result


4

JavaScript(ES6)、39 37バイト

(s,t,u=s.split(t).join``)=>u==s?s+t:u

3

パイク、14バイト

DX{iIXRk:)i!IJ

ここで試してみてください!

Pykeにはelse構造がないため、これはかなり合理的なスコアだと思います

説明:

D              -    Duplicate input
 X             -   a,b = ^
  {            -  a in b
   i           - i = ^
    I          - if i:
     XRk:      -  a = b.replace(a,"")
         i!I   - if not i:
            J  -  a = "".join(input)
               - print a

3

CJam、9

q~:B/2Be]

オンラインでお試しください。1バイトを切り捨ててくれてありがとうjimmy23013 :)

説明:

q~     read and evaluate the input (given as 2 quoted strings)
:B     store the toggle string in B
/      split the main string by the toggle string
2Be]   pad the array of pieces to the right with B, up to length 2 (if shorter)

1
9バイト:q~:B/2Be]
jimmy23013

2

Javascript(ECMAScript 6):47バイト

(a,b)=>(c=a.replace(RegExp(b,'g'),''))!=a?c:a+b

5
トグル文字列に特殊文字が含まれている場合、これは失敗する可能性があります。たとえば、ではなくを("a", ".")返します。"""a."
デニス

2

網膜 38 31バイト

バイトカウントはISO 8859-1エンコーディングを前提としています。

(.+)(?=.*¶\1$)
·
1>`·|¶.+

T`·¶

後続の改行は重要です。入力形式は、両方とも改行で区切られた文字列です。

オンラインでお試しください!最初の行では、複数のテストケースを一度に実行できます(テストスイートの場合は、;、文字列と改行をしてテストケースを分離します。最初の行で変換を処理します)。

説明

(.+)(?=.*¶\1$)
·

この最初のステップでは、メイン文字列内のトグル文字列のすべての出現をに置き換えます·。置換が発生したかどうかを後で判断できるように、これらのマーカーを挿入する必要があります。

1>`·|¶.+

これは、·マーカーまたは2行目(分離改行を含む)を削除する別の置換です。ただし、これ1>は制限です。つまり、最初の一致以降のみが考慮されます。したがって、メイン文字列にトグル文字列が発生しなかった場合、を挿入していない·ので、2行目が最初に一致し、削除されません。そうでない場合は、最初のマーカーを除くすべてのマーカーとともに2行目を削除します。

T`·¶

これは音訳ステージを使用しますが、単に文字を削除するためにも使用されます。特に、両方·とラインフィードを移動します。マッチがあった場合(最初の·ステージが前のステージで取り残されたため)、マッチがなかった場合(2行を結合してトグル文字列をメイン文字列に追加します)。


2

Python(3.4):55 54 47 44バイト

lambda m,t:m.replace(t,'')if t in m else m+t

テスト:

toggle=lambda m,t:m.replace(t,'')if t in m else m+t
print('', 'a', toggle('','a'))
print('a', 'a', toggle('a','a'))
print('b', 'a', toggle('b','a'))
print('ab', 'a', toggle('ab','a'))
print('aba', 'a', toggle('aba','a'))
print('ababa', 'aba', toggle('ababa','aba'))

テスト出力

 a a
a a
b a ba
ab a b
aba a b
ababa aba ba

returnステートメントを使用する必要があるため、defを使用すると長くなります。戻りなしで可能であれば、2バイトを節約 します関数の明示的な宣言は必要ないので(申し訳ありませんが、私は知りませんでした)7バイトが保存されました。


いい答え!私たちのルールでは、関数の名前は必要ありません。したがって、toggle=
Rɪᴋᴇʀ

ただ実現I、私のテストは、私は機能に名前を付けていない場合は動作しませんが、とtoggle=テストの作業
levanth

はい、toggleそれをテストするために必要です。しかし、あなただけのために必要なカウントからlambda m,t:上。
Rɪᴋᴇʀ

間違っていなければ、3バイトを節約するm+''+tようm+tに変更できます。
Sherlock9

もし私が始めている右、m+' '+tそれらの間のスペースを入力することではなく、再び説明を読んだ後、私は空白を削除ではなく、「」と+
levanth

2

C#、63

string F(string s,string t)=>s.Contains(t)?s.Replace(t,""):s+t;

Javaよりも良い:)

テストコード:

public static void Main()
{
    Console.WriteLine(F("", "a"));
    Console.WriteLine(F("a", "a"));
    Console.WriteLine(F("b", "a"));
    Console.WriteLine(F("ab", "a"));
    Console.WriteLine(F("aba", "a"));
    Console.WriteLine(F("ababa", "aba"));
    Console.ReadLine();
}

出力:

a

ba
b
b
ba


2

Jolf、12バイト

?=iγρiIE+iIγ

または、正規表現に敏感な文字を含める必要がある場合:

?=iγρiLeIE+iIγ

ここで試してみてください!

説明

?=iγρiIE+iIγ    if(i === (γ = i.replace(I, E))) alert(i + I); else alert(γ);
  i                i
 =                   ===
    ρ                          .replace( ,  )
     iI                       i         I 
       E                                   E
   γ                     (γ =                )
?               if(                           )
        +iI                                     alert(i + I);
                                                              else
           γ                                                       alert(γ);

2

JavaScript(ES6)、37バイト

(m,t)=>(w=m.split(t).join``)==m?m+t:w

分割と結合を利用して、@ nobe4の答えよりもわずかに短い


2

ラケット、70バイト

かなり簡単です。

(λ(s t)((if(string-contains? s t)string-replace string-append)s t""))

2

Scala、72 70バイト

def x(m:String,s:String)={val r=m.replaceAll(s,"");if(r==m)m+s else r}

オンライン通訳:www.tryscala.com


1
プログラミングパズルとコードゴルフへようこそ!私はScalaを知りませんが、周りのスペースを削除できると思いますif(r==m)
デニス

そうだね
エイビス

1

Oracle SQL 11.2、66バイト

SELECT DECODE(:1,s,s||:2,s)FROM(SELECT REPLACE(:1,:2)s FROM DUAL);

1

Perl、37 30バイト

{$_=shift;s/\Q@_//g?$_:"$_@_"}

トグル文字列内の正規表現は、\Q...でクォートされるため評価されません。\E

sub Fそしてコメント\Eに従って削除されます、msh210によるれます。

設定のために副作用がないわけではありません $_。ローカル変数を使用すると、6バイト追加されます:

{my$a=shift;$a=~s/\Q@_//g?$a:"$a@_"}

一方、切り替えられた入力パラメーターでは、pop代わりに次を使用して2バイトを保存できます。shift(28バイト)の。

{$_=pop;s/\Q@_//g?$_:"$_@_"}

テストファイル:

#!/usr/bin/env perl

sub F{$_=shift;s/\Q@_//g?$_:"$_@_"}

sub test ($$$) {
  my ($m, $t, $r) = @_;
  my $result = F($m, $t);
  print "F('$m', '$t') -> '$result' ",
    ($result eq $r ? '=OK=' : '<ERROR>'), " '$r'\n";
}
test '', 'a', 'a';
test 'a', 'a', '';
test 'b', 'a', 'ba';
test 'ab', 'a', 'b';
test 'aba', 'a', 'b';
test 'ababa', 'aba', 'ba';
test 'ababa', 'a*', 'ababaa*';
test 'foobar', '.', 'foobar.';
__END__

テスト結果:

F('', 'a') -> 'a' =OK= 'a'
F('a', 'a') -> '' =OK= ''
F('b', 'a') -> 'ba' =OK= 'ba'
F('ab', 'a') -> 'b' =OK= 'b'
F('aba', 'a') -> 'b' =OK= 'b'
F('ababa', 'aba') -> 'ba' =OK= 'ba'
F('ababa', 'a*') -> 'ababaa*' =OK= 'ababaa*'
F('foobar', '.') -> 'foobar.' =OK= 'foobar.'

perlsubは、「署名はサブルーチンの本体の一部です。通常、サブルーチンの本体は、単にブレースされたコードブロックです。」したがって、sub Fバイトカウントから省略することができます。また、(入力の順序を逆にすることで、natch)のpop代わりに使用してshift、2バイトを節約できるはずです。(テストされていません。)最後に、を省略して\E、さらに2バイト節約できます。(テストもされてい
ません

@ msh210ありがとう、ヒントで7バイト節約できました。を回避するための最初の引数である必要があるため、pop代わりにどのようにshift役立つことができるかわかりません。入力引数の順序は質問AFAIKで固定されています。$_$_[1]=~s/.../
ハイコOberdiek

入力引数の順序は質問afaictによって固定されていません。
msh210

1

C#(58バイト)

string F(string s,string t)=>s==(s=s.Replace(t,""))?s+t:s;

インライン割り当てを使用して、数バイトを削ります


こんにちは、PPCGへようこそ!素晴らしい最初の投稿!私は多くのC#を使用していないが、あなたは行うことができないvar s,tか、var s,var t代わりにstring
NoOneIsHere

ありがとう!悲しいvarことに、型はコンパイル時に既知である場所でのみ使用できるため、メソッドシグネチャでは使用できません。あなたは使用することができますdynamicが、それは1つの文字長くだことstring
Blue0500

どうvar F(string s, string t?それは推測できます...
NoOneIsHere

1

bash + sed、28バイト

sed "s/$2//g;t;s/$/$2/"<<<$1

スクリプトはtoggle-string.bashファイルにあり、これはで呼び出しますbash toggle-string.bash mainstring togglestring

s/$2//g メイン文字列からトグル文字列を削除します

t 前の置換が成功した場合(つまり、メイン文字列にトグル文字列が含まれていた場合)、最後にジャンプします

/$/$2/$最後にジャンプしなかった場合、最後にトグル文字列を追加します()

ヒアストリングにはbashが必要です


トグル文字列に特殊文字が含まれている場合、これは機能しません。
デニス


0

PowerShell v2 +、47バイト

param($a,$b)(($c=$a-replace$b),"$a$b")[$c-eq$a]

入力$a,$bを取得し、擬似三項(... , ...)[...]ステートメントを使用してif / elseを実行します。内側の部分が最初に評価され、2つの要素の配列が形成されます。0番目は$a$b -replacedのすべての出現で、何もありません。これはに格納され$cます。第一は、ちょうどの文字列の連結である$a$b

$c-equal toの場合$a$b見つからなかったことを意味します。これはブール値$trueまたは1であり、配列の最初の要素(連結)が選択されます。それ以外の場合はブール値です$falseなので、出力します$c、0番目の要素。

-replaceそれはつまり、左の最初から置き換えられますので、貪欲であるababa / abaテストケースが正常に戻りますba



0

ルビー、33バイト 27バイト(グローバル置換を使用する場合は 28 間違いなく28バイト

->u,v{u[v]?u.gsub(v,''):u+v}

0

Mathematica、45バイト

If[StringContainsQ@##,StringDelete@##,#<>#2]&

メイン文字列とトグル文字列を(この順序で)受け取り、結果を返す匿名関数。説明:

                                            &  Anonymous function returning...

If[StringContainsQ@##,               ,     ]    if its first argument contains
                                                its second argument, then...
                      StringDelete@##            its first argument with its
                                                 second argument removed, else...
                                      #<>#2      its second argument appended to
                                                 its first argument.

0

TSQL、143 129 121バイト

DECLARE @1 VARCHAR(10)='',@2 VARCHAR(10)='a'SELECT CASE WHEN @1 LIKE'%'+@2+'%'THEN REPLACE(@1,@2,'')ELSE CONCAT(@1,@2)END

読みやすい:

   DECLARE @1 VARCHAR(10) = ''
    , @2 VARCHAR(10) = 'a'

SELECT CASE WHEN @1 LIKE '%' + @2 + '%'
            THEN REPLACE(@1, @2, '')
            ELSE CONCAT (@1, @2)
            END

Live Demo

厳密に1文字の入力で114バイト

DECLARE @1 CHAR(1) = 'a'
    , @2 CHAR(1) = '.'

SELECT CASE WHEN @1 LIKE '%' + @2 + '%'
            THEN REPLACE(@1, @2, '')
            ELSE CONCAT (@1, @2) END

こんにちは、PPCGへようこそ!素晴らしい答えです!
NoOneIsHere


0

ルビー、35 37 28バイト

->m,t{m[t]?m.gsub(t,''):m+t}

文字列補間のための万歳!正規表現でも動作します。残りは単純です:内の文字列ならばt試合をするためにm、交換するt''、他のリターンm+t

編集:バグを修正しました。

編集: Kevin Lauの提案を適用しましたが、Luis Masuelliの答えで使用したものと同じアルゴリズムに到達したようです。


トグル文字列に特殊文字が含まれている場合、これは失敗する可能性があります。たとえば、ではなくを("a", ".")返します。"a""a."
デニス

m[t]m.include?(t)文字列内に含まれているかどうかよりもはるかに短く、チェックします。
バリューインク

0

k(23バイト)

{$[#x ss y;,/y\:x;x,y]}

例:

k){$[#x ss y;,/y\:x;x,y]}["aba";"a"]
,"b"
k){$[#x ss y;,/y\:x;x,y]}["this string has 6 words ";"now"]
"this string has 6 words now"
k){$[#x ss y;,/y\:x;x,y]}["this string has 5 words now";"now"]
"this string has 5 words "
k){$[#x ss y;,/y\:x;x,y]}["ababa";"ba"]
,"a"
k){$[#x ss y;,/y\:x;x,y]}["";"a"]
,"a"

0

Kotlin、61バイト

{m:String,t:String->var n=m.replace(t,"");if(m==n)m+t else n}

これは、割り当てがKotlinの式であり、パラメーターが可変であり、3項条件演算子があった場合は短くなります。悲しいことに、そうではありません:(

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

UnGolfed

fun t(m:String, t:String):String{
    var n=m.replace(t, "")
    return if(m==n)m+t else n
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.