Alihkan string

15

Tantangannya melibatkan hanya beralih string dalam string lain.

Penjelasan

Jika toggle string adalah substring dari string utama , hapus semua instance dari string toggle dari string utama ; jika tidak, tambahkan string sakelar di akhir string utama .

Aturan

  • Semua string terdiri dari karakter ASCII yang dapat dicetak
  • Fungsi harus mengambil dua parameter: string utama dan string toggle .
  • The String utama bisa kosong.
  • The beralih String tidak boleh kosong.
  • Hasilnya harus berupa string, yang bisa kosong.
  • Jawaban terpendek menang.

Contohnya

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'

Menguji kasus

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

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

'aba','a'       => 'b'
'ababa', 'aba'  => 'ba'
nobe4
sumber
2
@ KennyLau Itu di kotak pasir selama 3 jam. Rekomendasi adalah 2 hari.
Morgan Thrapp
9
Rekomendasi ini sebenarnya 72 jam . Halaman utama memiliki lebih banyak visibilitas daripada Sandbox, jadi lebih banyak komentar dijamin di sini. Yang mengatakan, ini bukan tantangan yang buruk , hanya memiliki beberapa sisi yang kasar.
AdmBorkBork
2
Jadi, Anda mengganti semua instance yang tidak tumpang tindih ?
Suever
1
@ Yakub Ya, saya harus membatasi ini hanya untuk huruf dan angka.
nobe4
1
Tidak, saya pikir memungkinkan nonalphanumerics: lebih menantang seperti itu.
msh210

Jawaban:

5

Jelly , 7 byte

œṣȮ⁸e⁹ẋ

Cobalah online!

Bagaimana itu bekerja

œṣȮ⁸e⁹ẋ  Main link. Arguments: s (string), t (toggle string)

œṣ       Split s at occurrences of t.
  Ȯ      Print the result.
   ⁸e    Check if s occurs in the split s. Yields 1 (true) or 0 (false).
     ⁹ẋ  Repeat t that many times.
Dennis
sumber
11

Java 8, 80 70 65 34 byte

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

Mungkin 'codegolf' terpendek saya sejauh ini .. xD
dengan bantuan dari komentar ..;)

Penjelasan:

Cobalah online.

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`
Kevin Cruijssen
sumber
1
Anda harus dapat menyimpan beberapa dengan mengubah ifke ternary. Jika tidak ada yang lain, itu akan menyingkirkan "ekstra" return.
Geobit
@ Geobits Ah, tentu saja .. Saya sangat antusias bahwa metode tunggal memiliki jumlah byte 'rendah' ​​(dalam hal java 'codegolfing') sehingga saya lupa salah satu dari codegolfing yang paling jelas untuk ifs dan return ..>.> Terima kasih sudah diedit.
Kevin Cruijssen
1
Anda dapat menyimpan beberapa byte lagi dengan menggunakan lambda alih-alih fungsi biasa.
Denker
return m=m.replace(t,"")?m+t:m;
Leaky Nun
2
m==(m=m.replace...
Leaky Nun
8

MATL, 11 byte

yyXf?''YX}h

Cobalah secara Online!

Semua uji kasus

Penjelasan

            % 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
Suever
sumber
6

Python 3, 38 byte

lambda s,t:(s+t,s.replace(t,""))[t in s]
Hunter VL
sumber
4

JavaScript (ES6), 39 37 byte

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

Pyke, 14 byte

DX{iIXRk:)i!IJ

Coba di sini!

Mengingat bahwa Pyke tidak punya else struktur, saya pikir ini skor yang cukup masuk akal

Penjelasan:

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
Biru
sumber
3

CJam, 9

q~:B/2Be]

Cobalah online. Terima kasih jimmy23013 untuk memotong 1 byte :)

Penjelasan:

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)
aditsu
sumber
1
9 byte: q~:B/2Be].
jimmy23013
2

Javascript (ECMAScript 6): 47 byte

(a,b)=>(c=a.replace(RegExp(b,'g'),''))!=a?c:a+b
nobe4
sumber
5
Ini bisa gagal jika toggle string berisi karakter khusus. Misalnya, ("a", ".")mengembalikan ""bukan "a.".
Dennis
2

Retina , 38 31 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

T`·¶

Linefeed tambahan sangat penting. Format input adalah kedua string dipisahkan dengan linefeed.

Cobalah online! Baris pertama memungkinkan menjalankan beberapa test case sekaligus (untuk test suite, gunakan ;untuk memisahkan string dan linefeed untuk memisahkan test case; baris pertama menangani konversi).

Penjelasan

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

Pada langkah pertama ini kami mengganti semua kemunculan string toggle di string utama dengan ·. Kita perlu memasukkan penanda ini sehingga kita dapat menentukan setelahnya apakah ada substitusi yang terjadi.

1>`·|¶.+

Ini adalah subtitusi lain yang menghilangkan ·marker, atau baris kedua (termasuk linefeed terpisah). Namun, batas 1>adalah yang berarti bahwa hanya kecocokan setelah yang pertama dipertimbangkan. Oleh karena itu, jika toggle string tidak muncul di string utama, kami tidak akan memasukkan apa pun ·, sehingga baris kedua akan menjadi yang pertama cocok dan tidak akan dihapus. Kalau tidak, kami menghapus baris kedua bersama dengan semua kecuali penanda pertama.

T`·¶

Meskipun ini menggunakan tahap transliterasi, ini juga digunakan hanya untuk menghapus karakter. Secara khusus, kami memindahkan keduanya ·dan umpan baris. Kita membutuhkan yang pertama, jika ada pertandingan (karena kemudian yang pertama ·akan tertinggal pada tahap sebelumnya) dan kita membutuhkan yang kedua jika tidak ada pertandingan (untuk menggabungkan dua baris bersama-sama dan dengan demikian tambahkan toggle string ke string utama).

Martin Ender
sumber
2

Python (3.4): 55 54 47 44 Bytes

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

Pengujian:

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'))

Output Uji

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

Menggunakan def akan lebih lama karena Anda harus menggunakan pernyataan kembali, jika mungkin tanpa kembali itu akan menghemat 2 Bytes Karena pernyataan eksplisit dari fungsi tidak diperlukan (maaf saya tidak tahu itu) 7 Bytes disimpan.

Levant
sumber
Jawaban bagus! Untuk aturan kami, Anda tidak perlu nama untuk fungsi tersebut. Jadi, Anda dapat menghapus toggle=.
Rɪᴋᴇʀ
Saya baru sadar, Tes saya tidak akan berfungsi jika saya tidak menyebutkan fungsi, tetapi dengan toggle=pekerjaan Tes
levanth
ya, togglediperlukan untuk mengujinya. Tapi Anda hanya perlu menghitung mulai lambda m,t:dari.
Rɪᴋᴇʀ
Anda dapat mengubah m+''+tke m+tuntuk menyimpan 3 byte, jika saya tidak salah.
Sherlock9
Anda benar, saya mulai dengan m+' '+tmemasukkan spasi di antara mereka, tetapi setelah membaca deskripsi lagi saya menghapus spasi putih tetapi bukan '' dan +
levanth
2

C #, 63

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

Lebih baik dari Jawa :)

Kode uji:

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();
}

Keluaran:

a

ba
b
b
ba
RedLaser
sumber
2

Pyth, 13 11 10 byte

?/Qz:Qzk+z

Suite uji.

Format input: string pertama dalam tanda kutip, string kedua tanpa tanda kutip.

Ini juga 10 byte:

?tJcQzsJ+z

Suite uji.

Ini adalah 11 byte:

pscQz*!}zQz

Suite uji.

Solusi 13 byte sebelumnya:

?:IQzk+Qz:Qzk

Suite uji.

Biarawati Bocor
sumber
1
Juga 11 byte:?}zQ:Qzk+Qz
Biru
2

Jolf, 12 byte

?=iγρiIE+iIγ

Atau, jika kita harus menyertakan karakter regex-sensitif:

?=iγρiLeIE+iIγ

Coba di sini!

Penjelasan

?=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(γ);
Conor O'Brien
sumber
2

JavaScript (ES6), 37 Bytes

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

Sedikit lebih pendek dari jawaban @ nobe4 dengan memanfaatkan split dan gabung

MayorMonty
sumber
2

Racket, 70 byte

Cukup lurus ke depan.

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

Scala, 72 70 byte

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

Penerjemah online: www.tryscala.com

Avis
sumber
1
Selamat Datang di Programming Puzzles & Code Golf! Saya tidak tahu Scala, tapi saya pikir Anda dapat menghapus spasi di sekitar if(r==m).
Dennis
Ya Anda benar
Avis
1

Oracle SQL 11.2, 66 byte

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

Perl, 37 30 byte

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

Ekspresi reguler di dalam string toggle tidak dievaluasi karena kutipan dengan \Q ... \E.

sub F dan \E dihapus sesuai dengan komentar oleh msh210.

Ini tidak sepenuhnya bebas dari efek samping karena pengaturan $_ . Menggunakan variabel lokal akan dikenakan biaya enam byte tambahan:

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

Di sisi lain, dengan parameter input yang diaktifkan, dua byte dapat disimpan dengan menggunakan popalih-alihshift (28 byte):

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

File uji:

#!/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__

Hasil tes:

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.'
Heiko Oberdiek
sumber
perlsub mengatakan, "Tanda tangan adalah bagian dari tubuh subrutin. Biasanya tubuh subrutin hanyalah blok kode yang diperkuat." Dengan demikian, Anda dapat menghilangkan sub Fdari jumlah byte Anda. Selain itu, Anda harus dapat menggunakan popalih-alih shift(dengan membalik urutan input, natch), menghemat dua byte. (Belum diuji.) Akhirnya, Anda harus dapat menghilangkan \E, menghemat dua byte lagi. (Juga belum diuji.)
msh210
@ msh210 Terima kasih, tips Anda menghemat tujuh byte. Saya tidak mengerti, bagaimana popalih-alih shiftbisa membantu, karena $_harus menjadi argumen pertama yang harus dihindari $_[1]=~s/.../. Urutan argumen input ditetapkan oleh pertanyaan AFAIK.
Heiko Oberdiek
Urutan argumen input tidak diperbaiki oleh pertanyaan afaict.
msh210
1

C # (58 byte)

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

Ini menggunakan tugas inline untuk mencukur beberapa byte

Biru0500
sumber
Halo, dan selamat datang di PPCG! Pos pertama yang bagus! Saya tidak banyak menggunakan C #, tetapi tidak bisakah Anda melakukannya var s,tatau var s,var tsebaliknya string?
NoOneIsHere
Terima kasih! Sayangnya varhanya dapat digunakan di tempat-tempat di mana jenisnya diketahui pada waktu kompilasi, sehingga tidak dapat digunakan dalam tanda tangan metode. Anda dapat menggunakan dynamic, tetapi 1 karakter lebih lamastring
Blue0500
Bagaimana dengan var F(string s, string t? Itu bisa disimpulkan ...
NoOneIsHere
1

bash + sed, 28 byte

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

Script tinggal di file toggle-string.bash, yang kita panggil bash toggle-string.bash mainstring togglestring.

s/$2//g menghapus string toggle dari string utama

t melompat ke akhir jika penggantian sebelumnya berhasil (mis. string utama berisi string toggle)

/$/$2/menambahkan toggle string di akhir ( $), jika kita tidak melompat ke akhir

bash diperlukan untuk herestring

Itu
sumber
Ini tidak akan berfungsi jika toggle string berisi karakter khusus.
Dennis
0

PowerShell v2 +, 47 byte

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

Mengambil input $a,$bdan kemudian menggunakan pernyataan pseudo-ternary (... , ...)[...]untuk melakukan if / else. Bagian dalam dievaluasi terlebih dahulu untuk membentuk array dari dua elemen. Tanggal 0 adalah $adengan semua kemunculan $b -replaced tanpa apa-apa, yang disimpan ke dalam$c . Yang ke-1 hanyalah rangkaian string dari $adan $b.

Jika $cadalah -equal untuk $a, artinya $btidak ditemukan, itu Boolean $trueatau 1, dan elemen 1 dari array (gabungan) yang dipilih. Lain, itu Boolean$false , jadi kami menampilkan $celemen ke-0.

Catatan yang -replaceserakah, jadi itu akan menggantikan dari kiri dulu, artinyaababa / aba test case akan kembali dengan benar ba.

AdmBorkBork
sumber
0

Java 8, 65 byte

BinaryOperator<String>l=(m,t)->m.contains(t)?m.replace(t,""):m+t;

Logika yang sama dengan solusi Java 7, ditulis dengan lambda.

Coba di sini

nickb
sumber
0

Ruby, 33 byte 27 byte (28 jika menggunakan subtitusi global) pasti 28 byte

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

Mathematica, 45 byte

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

Fungsi anonim yang mengambil string utama dan string toggle (dalam urutan itu) dan mengembalikan hasilnya. Penjelasan:

                                            &  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.
LegionMammal978
sumber
0

TSQL, 143 129 121 Bytes

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

Dapat dibaca:

   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

114 Bytes dengan ketat 1 input karakter

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

SELECT CASE WHEN @1 LIKE '%' + @2 + '%'
            THEN REPLACE(@1, @2, '')
            ELSE CONCAT (@1, @2) END
dfundako
sumber
Halo, dan selamat datang di PPCG! Jawaban bagus!
NoOneIsHere
0

TSQL (Sqlserver 2012), 49 byte

DECLARE @ VARCHAR(10) = 'hello',@x VARCHAR(10) = 'o'

PRINT IIF(@ LIKE'%'+@x+'%',REPLACE(@,@x,''),@+@x)

Cobalah online!

t-clausen.dk
sumber
0

Ruby, 35 37 28 byte

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

Hore untuk interpolasi string! Ia bahkan bekerja di regex. Sisanya sederhana: jika string dalam tcocok dengan m, ganti tdengan '', lain kembali m+t.

Edit: Memperbaiki bug.

Sunting: Saya menerapkan saran Kevin Lau, tetapi tampaknya saya telah mencapai algoritma yang sama dengan yang digunakan dalam jawaban Luis Masuelli .

Sherlock9
sumber
Ini bisa gagal jika toggle string berisi karakter khusus. Misalnya, ("a", ".")mengembalikan "a"bukan "a.".
Dennis
m[t]jauh lebih pendek daripada m.include?(t)dan masih memeriksa untuk dimasukkan dalam string.
Value Ink
0

k (23 byte)

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

Contoh:

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"
skeevey
sumber
0

Kotlin, 61 Bytes

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

Ini akan lebih pendek jika penugasan adalah ekspresi di Kotlin, dan parameter bisa berubah, dan ada operator kondisional ternary, sayangnya ini tidak terjadi :(

Cobalah secara Online!

Tidak disatukan

fun t(m:String, t:String):String{
    var n=m.replace(t, "")
    return if(m==n)m+t else n
}
The_Lone_Devil
sumber