Переключити рядок


15

Завдання полягає у простому перемиканні рядка в інший рядок.

Пояснення

Якщо рядок перемикання є підрядком основної рядки , видаліть усі екземпляри рядка перемикання з головної рядки ; в іншому випадку додайте рядок перемикання в кінці основної рядки .

Правила

  • Усі рядки складаються з символів для друку ASCII
  • Функція повинна приймати два параметри: основну і тумблерну строку .
  • Основна рядок може бути порожньою.
  • Рядок перемикання не може бути порожнім.
  • Результатом має стати рядок, який може бути порожнім.
  • Найкоротша відповідь виграє.

Приклади

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
Отже, ви замінюєте всі екземпляри, що не перекриваються ?
Суєвер

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
Ви можете зберегти досить багато, змінивши на ifпотрійний. Якщо нічого іншого, воно позбудеться "зайвого" return.
Геобіт

@Geobits Ага, звичайно .. Я був настільки захоплений, що в одному методі було "низьке" число байтів (з точки зору java "codegolfing"), що я забув одне з найбільш очевидних кодогольфінгу для ifs і return ..>>> Спасибі, відредаговано.
Кевін Круїссен

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



3

Пайк, 14 байт

DX{iIXRk:)i!IJ

Спробуйте тут!

Враховуючи, що Пайк не має 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


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>`·|¶.+

Це ще одна заміна, яка видаляє ·маркер, або другий рядок (включаючи розділову лінію передачі). Однак 1>межа є межею, що означає, що розглядаються лише матчі після першого. Отже, якщо рядок перемикання не відбувся в основній рядку, ми не будемо вставляти жоден ·, тому другий рядок буде першим збігом і не буде видалений. В іншому випадку ми видаляємо другий рядок разом із усіма, крім першого маркера.

T`·¶

Хоча для цього використовується етап транслітерації, він також використовується просто для видалення символів. Зокрема, ми переміщуємо обидва ·та лінійні стрічки. Перший нам потрібен, якщо відбувся збіг (тому що перший ·буде залишений попереднім етапом), а другий нам потрібен у випадку, якщо не було збігу (об'єднати два рядки разом і тим самим додайте рядок перемикання до основної строки).


2

Пітон (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

Використання def буде довше, тому що ви повинні використовувати оператор return, якби це було можливим без повернення, це дозволить заощадити 2 байти, оскільки явне оголошення функції не потрібно (вибачте, я цього не знав) 7 байтів було збережено.


Гарна відповідь! Для наших правил вам не потрібно імені для функції. Таким чином, ви можете видалити toggle=.
Rɪᴋᴇʀ

Я щойно зрозумів, що мій тест не працюватиме, якщо я не називаю функцію, але з toggle=роботою "Тести"
го

так, toggleнеобхідне для перевірки. Але вам тільки потрібно розраховувати з lambda m,t:на.
Rɪᴋᴇʀ

Ви можете змінити, m+''+tщоб m+tзберегти 3 байти, якщо я не помиляюся.
Шерлок9

Ви маєте рацію, я почав із m+' '+tвведення пробілу між ними, але, прочитавши опис ще раз, я видалив пробіл, але не '', а +
левант

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

Pyth, 13 11 10 байт

?/Qz:Qzk+z

Тестовий набір.

Формат введення: перший рядок у лапках, другий рядок без лапок.

Це також 10 байт:

?tJcQzsJ+z

Тестовий набір.

Це 11 байт:

pscQz*!}zQz

Тестовий набір.

Попереднє 13-байтове рішення:

?:IQzk+Qz:Qzk

Тестовий набір.


1
Також 11 байт:?}zQ:Qzk+Qz
Блакитний

2

Джольф, 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).
Денніс

Так, ви маєте рацію
Avis,

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.

Це не зовсім без побічних ефектів через налаштування $_ . Використання локальної змінної коштуватиме шість додаткових байтів:

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

З іншого боку, із переключеними вхідними параметрами два байти можна зберегти за допомогою pop замість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зі свого числа байтів. Крім того, ви повинні мати можливість використовувати popзамість shift(змінивши порядок входів, natch), зберігаючи два байти. (Неперевірено.) Нарешті, ви зможете опустити \E, зберегти ще два байти. (Також неперевірене.)
msh210

@ msh210 Спасибі, ваші поради зберегли сім байтів. Я не бачу, як popнатомість shiftможе допомогти, бо $_має бути перший аргумент, якого слід уникати $_[1]=~s/.../. Порядок введення аргументів фіксується питанням AFAIK.
Хайко Обердік

Порядок введення аргументів не фіксується фактом запитання.
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. Внутрішні частини оцінюються спочатку для формування масиву з двох елементів. 0-й $aз усіма входженнями $b -replaced ні з чим, що зберігається в$c . 1-й - це лише рядкове з'єднання$a і $b.

Якщо $cце -eqUAL до $a, що означає , що $bне було встановлено, що це Логічне $trueабо 1, і тому вибирається перший елемент масиву (конкатенації). Інакше, це булеве значення $false, тому ми виводимо $c0-й елемент.

Зауважте, що -replaceце жадібно, тому він замінить спочатку зліва, тобто ababa / abaтестовий випадок належним чином повернеться ba.



0

Ruby, 33 байти 27 байт (28, якщо використовується глобальна підстановка), безумовно, 28 байт

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

0

Математика, 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

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.

Редагувати: виправлена ​​помилка.

Редагувати: Я застосував пропозицію Кевіна Лау, але, схоже, я досяг такого ж алгоритму, що і у відповіді Луїса Масуеллі .


Це може не вдатися, якщо перемикача рядок містить спеціальні символи. Наприклад, ("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

Котлін, 61 байт

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

Це було б коротше, якби присвоєння було виразом у Котліна, а параметри були мінливими, і був потрійний умовний оператор, на жаль, це не так :(

Спробуйте в Інтернеті!

UnGolfed

fun t(m:String, t:String):String{
    var n=m.replace(t, "")
    return if(m==n)m+t else n
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.