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'

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.

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`

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


4

JavaScript (ES6), 39 37 byte

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

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

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)

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

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


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.


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


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

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


2

Racket, 70 byte

Cukup lurus ke depan.

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

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


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

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

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


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


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.


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


0

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

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

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.

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

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!


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 .


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"

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
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.