Wyzwanie polega na zwykłym przełączaniu łańcucha w innym łańcuchu.
Wyjaśnienie
Jeśli łańcuch przełączający jest podciągiem łańcucha głównego , usuń wszystkie instancje łańcucha przełączającego z łańcucha głównego ; w przeciwnym razie dołącz łańcuch przełączający na końcu łańcucha głównego .
Zasady
- Wszystkie ciągi znaków składają się z drukowalnych znaków ASCII
- Funkcja powinna przyjmować dwa parametry: ciąg główny i ciąg przełączający .
- Główny ciąg może być pusta.
- Ciąg przełącznik nie może być pusta.
- Wynik powinien być ciągiem, który może być pusty.
- Najkrótsza odpowiedź wygrywa.
Przykłady
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'
Testuje przypadki
'','a' => 'a'
'a','a' => ''
'b','a' => 'ba'
'ab','a' => 'b'
'aba','a' => 'b'
'ababa', 'aba' => 'ba'
Odpowiedzi:
Galaretka , 7 bajtów
Wypróbuj online!
Jak to działa
źródło
Java 8,
80706534 bajtówPrawdopodobnie mój najkrótszy jak dotąd „codegolf” Java .. xD
z pewną pomocą komentarzy ..;)
Wyjaśnienie:
Wypróbuj online.
źródło
if
trójskładnikowy. Jeśli nic więcej, pozbędzie się „dodatkowych”return
.return m=m.replace(t,"")?m+t:m;
m==(m=m.replace...
MATL, 11 bajtów
Wypróbuj online!
Wszystkie przypadki testowe
Wyjaśnienie
źródło
Python 3, 38 bajtów
źródło
JavaScript (ES6),
3937 bajtówźródło
Pyke, 14 bajtów
Wypróbuj tutaj!
Biorąc pod uwagę, że Pyke nie ma
else
struktury, myślę, że jest to całkiem rozsądny wynikWyjaśnienie:
źródło
CJam, 9
Wypróbuj online. Dzięki jimmy23013 za odcięcie 1 bajtu :)
Wyjaśnienie:
źródło
q~:B/2Be]
.JavaScript (ECMAScript 6): 47 bajtów
źródło
("a", ".")
zwraca""
zamiast"a."
.Siatkówka ,
3831 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Końcowe podawanie linii jest znaczące. Format wejściowy to oba ciągi znaków oddzielone wierszem.
Wypróbuj online! Pierwszy wiersz pozwala na uruchomienie kilku przypadków testowych jednocześnie (w zestawie testowym użyj
;
do oddzielenia ciągów i kanałów do osobnych przypadków testowych; pierwszy wiersz zajmuje się konwersją).Wyjaśnienie
W tym pierwszym kroku zamieniamy wszystkie wystąpienia ciągu przełączającego w ciągu głównym na
·
. Musimy wstawić te znaczniki, abyśmy mogli później ustalić, czy nastąpiła jakaś zamiana.Jest to kolejne podstawienie, które usuwa
·
marker lub drugą linię (w tym separację linii). Jednak1>
jest granica co oznacza, że pasuje tylko po pierwsze są uznawane. Dlatego jeśli ciąg przełączający nie wystąpił w głównym ciągu, nie wstawilibyśmy żadnego·
, więc druga linia będzie pierwszym dopasowaniem i nie zostanie usunięta. W przeciwnym razie usuwamy drugą linię wraz ze wszystkimi znacznikami oprócz pierwszego.Chociaż wykorzystuje to etap transliteracji, służy również do usuwania znaków. W szczególności przenosimy oba
·
i linie. Potrzebujemy pierwszego, na wypadek, gdyby był mecz (ponieważ wtedy pierwszy·
zostanie pominięty przez poprzedni etap) i potrzebujemy drugiego, na wypadek, gdyby nie było dopasowania (aby połączyć dwie linie razem, a tym samym dodaj ciąg przełączający do ciągu głównego).źródło
Python (3.4):
55544744 bajtówTestowanie:
Wyjście testowe
Użycie def byłoby dłuższe, ponieważ musisz użyć instrukcji return, jeśli byłoby to możliwe bez return, zaoszczędziłoby 2 bajtyPonieważ jawna deklaracja funkcji nie jest potrzebna (przepraszam, nie wiedziałem o tym) 7 bajtów zostało zapisanych.źródło
toggle=
.toggle=
pracy Testytoggle
jest to potrzebne do przetestowania. Ale musisz tylko liczyć od samego początkulambda m,t:
.m+''+t
abym+t
zapisać 3 bajty, jeśli się nie mylę.m+' '+t
wpisania spacji między nimi, ale po ponownym przeczytaniu opisuC #, 63
Lepsze niż Java :)
Kod testowy:
Wynik:
źródło
Pyth,
131110 bajtówZestaw testowy.
Format wejściowy: pierwszy ciąg w cudzysłowach, drugi ciąg bez cudzysłowów.
To także 10 bajtów:
Zestaw testowy.
To jest 11 bajtów:
Zestaw testowy.
Poprzednie 13-bajtowe rozwiązanie:
Zestaw testowy.
źródło
?}zQ:Qzk+Qz
Jolf, 12 bajtów
Lub, jeśli musimy dołączyć znaki wrażliwe na wyrażenia regularne:
Wypróbuj tutaj!
Wyjaśnienie
źródło
JavaScript (ES6), 37 bajtów
Nieco krótsza niż odpowiedź @ nobe4, wykorzystując split i join
źródło
Rakieta, 70 bajtów
Całkiem prosto.
źródło
Scala,
7270 bajtówTłumacz online: www.tryscala.com
źródło
if(r==m)
.Oracle SQL 11.2, 66 bajtów
źródło
Perl,
3730 bajtówWyrażenia regularne wewnątrz ciągu przełączającego nie są obliczane z powodu cytowania za pomocą
\Q
...\E
.sub F
i\E
są usuwane zgodnie z komentarzem msh210.Nie jest całkowicie wolny od skutków ubocznych z powodu ustawienia
$_
. Korzystanie ze zmiennej lokalnej będzie kosztowało sześć dodatkowych bajtów:Z drugiej strony, przy przełączanych parametrach wejściowych można zapisać dwa bajty, używając
pop
zamiastshift
(28 bajtów):Plik testowy:
Wynik testu:
źródło
sub F
liczbę bajtów. Ponadto powinieneś być w stanie używaćpop
zamiastshift
(poprzez odwrócenie kolejności wejść, natch), oszczędzając dwa bajty. (Niesprawdzone). Wreszcie powinieneś być w stanie pominąć\E
, oszczędzając dwa kolejne bajty. (Również niesprawdzone.)pop
zamiastshift
pomóc, bo$_
powinien być pierwszym argumentem, którego należy unikać$_[1]=~s/.../
. Kolejność argumentów wejściowych jest ustalona przez pytanie AFAIK.C # (58 bajtów)
string F(string s,string t)=>s==(s=s.Replace(t,""))?s+t:s;
Używa wbudowanego przydziału, aby zgolić kilka bajtów
źródło
var s,t
czyvar s,var t
zamiast tegostring
?var
można go używać tylko w miejscach, w których typ jest znany w czasie kompilacji, więc nie można go używać w podpisach metod. Możesz użyćdynamic
, ale jest o 1 dłużej niżstring
var F(string s, string t
? Można to wywnioskować ...bash + sed, 28 bajtów
Skrypt znajduje się w pliku toggle-string.bash, który wywołujemy
bash toggle-string.bash mainstring togglestring
.s/$2//g
usuwa ciąg przełączający z ciągu głównegot
przeskakuje na koniec, jeśli poprzednie podstawienie zakończyło się powodzeniem (tzn. główny ciąg zawierał łańcuch przełączający)/$/$2/
dodaje ciąg przełączający na końcu ($
), jeśli nie przeskoczyliśmy do końcabash jest wymagany dla linków
źródło
Julia,
3331 bajtówWypróbuj online!
źródło
PowerShell v2 +, 47 bajtów
Pobiera dane wejściowe,
$a,$b
a następnie używa pseudo-trójkowej(... , ...)[...]
instrukcji do wykonania instrukcji if / else. Wewnętrzne części są oceniane najpierw w celu utworzenia układu dwóch elementów. 0 oznacza$a
wszystkie wystąpienia$b
-replace
d bez niczego, w którym jest przechowywany$c
. Pierwszy to tylko połączenie strunowe$a
i$b
.Jeśli
$c
jest-eq
równe$a
, co oznacza, że$b
nie znaleziono, to jest wartość logiczna$true
lub1
, i dlatego wybierany jest pierwszy element tablicy (konkatenacja). W przeciwnym razie jest to wartość logiczna$false
, więc wyprowadzamy$c
0 element.Zauważ, że
-replace
jest chciwy, więc najpierw zastąpi od lewej, co oznacza, żeababa / aba
przypadek testowy zostanie poprawnie zwróconyba
.źródło
Java 8, 65 bajtów
Ta sama logika, co rozwiązanie Java 7, napisane za pomocą lambda.
Wypróbuj tutaj
źródło
Ruby,
33 bajty27 bajtów (28, jeśli używasz globalnej podstawienia)zdecydowanie 28 bajtówźródło
Mathematica, 45 bajtów
Anonimowa funkcja, która pobiera ciąg główny i ciąg przełączający (w tej kolejności) i zwraca wynik. Wyjaśnienie:
źródło
TSQL,
143129121 bajtówCzytelny:
Live Demo
114 bajtów przy wprowadzeniu 1 znaku
źródło
TSQL (Sqlserver 2012), 49 bajtów
Wypróbuj online!
źródło
Rubin,
353728 bajtówBrawo dla interpolacji łańcuchów! Działa nawet w wyrażeniach regularnych. Reszta jest prosta: jeśli ciąg w
t
meczach abym
wymienićt
z''
Else zamianm+t
.Edycja: Naprawiono błąd.
Edycja: Zastosowałem sugestię Kevina Laua, ale wygląda na to, że osiągnąłem ten sam algorytm, który zastosowano w odpowiedzi Luisa Masuelliego .
źródło
("a", ".")
zwraca"a"
zamiast"a."
.m[t]
jest znacznie krótszy niżm.include?(t)
i nadal sprawdza włączenie w ciągi znaków.k (23 bajty)
Przykłady:
źródło
Kotlin, 61 bajtów
Byłoby to krótsze, gdyby przypisanie było wyrażeniem w Kotlinie, a parametry były zmienne, a byłby trójskładnikowy operator warunkowy, niestety tak nie jest :(
Wypróbuj online!
UnGolfed
źródło