Die Herausforderung besteht darin, einfach eine Zeichenfolge innerhalb einer anderen Zeichenfolge zu wechseln.
Erläuterung
Wenn die Umschaltzeichenfolge eine Teilzeichenfolge der Hauptzeichenfolge ist , entfernen Sie alle Instanzen der Umschaltzeichenfolge aus der Hauptzeichenfolge . Ansonsten hängen Sie die Umschaltzeichenfolge an das Ende der Hauptzeichenfolge an .
Regeln
- Alle Zeichenfolgen bestehen aus druckbaren ASCII-Zeichen
- Die Funktion sollte zwei Parameter annehmen: die Hauptzeichenfolge und die Umschaltzeichenfolge .
- Die Hauptzeichenfolge kann leer sein.
- Die Umschaltzeichenfolge darf nicht leer sein.
- Das Ergebnis sollte eine Zeichenfolge sein, die leer sein kann.
- Die kürzeste Antwort gewinnt.
Beispiele
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'
Testet Fälle
'','a' => 'a'
'a','a' => ''
'b','a' => 'ba'
'ab','a' => 'b'
'aba','a' => 'b'
'ababa', 'aba' => 'ba'
Antworten:
Gelee , 7 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Java 8,
80706534 BytesWahrscheinlich mein bisher kürzester Java 'Codegolf' .. xD
mit etwas Hilfe aus den Kommentaren ..;)
Erläuterung:
Probieren Sie es online aus.
quelle
if
in ein ternäres ändern . Wenn nichts anderes, wird es das "Extra" losreturn
.return m=m.replace(t,"")?m+t:m;
m==(m=m.replace...
MATL, 11 Bytes
Probieren Sie es online!
Alle Testfälle
Erläuterung
quelle
Python 3, 38 Bytes
quelle
JavaScript (ES6),
3937 Bytesquelle
Pyke, 14 Bytes
Probieren Sie es hier aus!
Vorausgesetzt, Pyke hat keine
else
Struktur hat, halte ich dies für eine ziemlich vernünftige PunktzahlErläuterung:
quelle
CJam, 9
Probieren Sie es online aus. Danke jimmy23013 für das Abhacken von 1 Byte :)
Erläuterung:
quelle
q~:B/2Be]
.Javascript (ECMAScript 6): 47 Bytes
quelle
("a", ".")
gibt""
statt"a."
.Retina ,
3831 BytesDie Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Der Zeilenvorschub am Ende ist signifikant. Das Eingabeformat besteht aus beiden durch einen Zeilenvorschub getrennten Zeichenfolgen.
Probieren Sie es online!In der ersten Zeile können mehrere Testfälle gleichzeitig ausgeführt werden (für die Testsuite
;
trennen Sie die Zeichenfolgen und Zeilenvorschübe nach Testfällen; in der ersten Zeile wird die Konvertierung vorgenommen).Erläuterung
In diesem ersten Schritt ersetzen wir alle Vorkommen der Umschaltzeichenfolge in der Hauptzeichenfolge durch
·
. Wir müssen diese Marker einfügen, damit wir später feststellen können, ob eine Substitution stattgefunden hat.Dies ist eine weitere Ersetzung, durch die ein
·
Marker oder die zweite Zeile (einschließlich des Trennzeilenvorschubs) entfernt wird. Dies1>
ist jedoch eine Grenze, was bedeutet, dass nur Übereinstimmungen nach der ersten berücksichtigt werden. Wenn die Umschaltzeichenfolge nicht in der Hauptzeichenfolge vorkommt, haben wir keine eingefügt·
, sodass die zweite Zeile die erste Übereinstimmung darstellt und nicht entfernt wird. Ansonsten entfernen wir die zweite Zeile zusammen mit allen bis auf den ersten Marker.Während dies eine Transliterationsstufe verwendet, wird sie auch einfach zum Entfernen von Zeichen verwendet. Insbesondere verschieben wir sowohl
·
Zeilen- als auch Zeilenvorschübe. Wir brauchen die erste, falls es ein Match gab (weil dann die erste·
von der vorherigen Phase zurückgelassen wurde) und wir brauchen die zweite, falls es kein Match gab (um die beiden Linien miteinander zu verbinden und damit die Toggle-Zeichenfolge an die Hauptzeichenfolge anhängen).quelle
Python (3.4):
55544744 BytesTesten:
Die Testausgabe
Die Verwendung eines def würde länger dauern, da Sie eine return-Anweisung verwenden müssen, wenn dies ohne return möglich wäre, würde dies 2 Bytes sparen.Da keine explizite Deklaration der Funktion erforderlich ist (sorry, das wusste ich nicht), wurden 7 Bytes gespeichert.quelle
toggle=
.toggle=
toggle
wird benötigt um es zu testen. Aber Sie brauchen nur zu zählen , vonlambda m,t:
auf.m+''+t
,m+t
um 3 Bytes zu speichern, wenn ich mich nicht irre.m+' '+t
, ein Leerzeichen zwischen ihnen einzugeben, aber nachdem ich die Beschreibung noch einmal gelesen hatte, habe ich das Leerzeichen gelöscht, aber nicht das '' und das +C #, 63
Besser als Java :)
Testcode:
Ausgabe:
quelle
Pyth,
131110 BytesTestsuite.
Eingabeformat: erste Zeichenfolge in Anführungszeichen, zweite Zeichenfolge ohne Anführungszeichen.
Dies sind ebenfalls 10 Bytes:
Testsuite.
Das sind 11 Bytes:
Testsuite.
Bisherige 13-Byte-Lösung:
Testsuite.
quelle
?}zQ:Qzk+Qz
Jolf, 12 Bytes
Oder, wenn wir regex-sensitive Zeichen einfügen müssen:
Probieren Sie es hier aus!
Erläuterung
quelle
JavaScript (ES6), 37 Bytes
Etwas kürzer als die Antwort von @nobe4, da Split und Join genutzt werden
quelle
Schläger, 70 Bytes
Ziemlich einfach.
quelle
Scala,
72-70BytesOnline-Dolmetscher: www.tryscala.com
quelle
if(r==m)
.Oracle SQL 11.2, 66 Byte
quelle
Perl,
37-30BytesReguläre Ausdrücke in der Umschaltzeichenfolge werden aufgrund der Anführungszeichen mit
\Q
... nicht ausgewertet\E
.sub F
und\E
werden laut Kommentar von msh210 entfernt.Es ist nicht ganz frei von Nebenwirkungen aufgrund der Einstellung
$_
. Die Verwendung einer lokalen Variablen kostet sechs zusätzliche Bytes:Andererseits können bei umgeschalteten Eingangsparametern zwei Bytes mit
pop
anstelle vonshift
(28 Bytes) gespeichert werden :Testdatei:
Testergebnis:
quelle
sub F
Ihre Byteanzahl weglassen . Außerdem sollten Sie in der Lage sein,pop
anstelle vonshift
(durch Umkehren der Reihenfolge der Eingaben, natch), zwei Bytes zu sparen. (Ungetestet.) Schließlich sollten Sie in der Lage sein, das wegzulassen\E
und zwei weitere Bytes zu sparen. (Auch ungetestet.)pop
stattshift
helfen kann, denn$_
sollte das erste Argument sein, das es zu vermeiden gilt$_[1]=~s/.../
. Die Reihenfolge der Eingabeargumente wird durch die Frage AFAIK festgelegt.C # (58 Bytes)
string F(string s,string t)=>s==(s=s.Replace(t,""))?s+t:s;
Es verwendet eine Inline-Zuweisung, um ein paar Bytes zu sparen
quelle
var s,t
odervar s,var t
stattdessenstring
?var
Kann leider nur an Stellen verwendet werden, an denen der Typ zur Kompilierungszeit bekannt ist, sodass er nicht in Methodensignaturen verwendet werden kann. Sie könnten verwendendynamic
, aber es ist 1 Zeichen länger alsstring
var F(string s, string t
?Bash + Sed, 28 Bytes
Das Skript befindet sich in einer toggle-string.bash-Datei, die wir aufrufen
bash toggle-string.bash mainstring togglestring
.s/$2//g
Entfernt die Umschaltzeichenfolge aus der Hauptzeichenfolget
springt zum Ende, wenn die vorherige Ersetzung erfolgreich war (dh die Hauptzeichenfolge enthielt die Umschaltzeichenfolge)/$/$2/
Fügt die Umschaltzeichenfolge am Ende hinzu ($
) hinzu, wenn wir nicht zum Ende gesprungen sindbash wird für den herestring benötigt
quelle
Julia,
3331 BytesProbieren Sie es online!
quelle
PowerShell v2 +, 47 Byte
Übernimmt Eingaben
$a,$b
und verwendet dann eine pseudoternäre(... , ...)[...]
Anweisung, um ein if / else auszuführen. Die inneren Teile werden zuerst ausgewertet, um ein Array aus zwei Elementen zu bilden. Die 0. ist$a
bei allen Vorkommen von$b
-replace
d mit nichts, was in gespeichert ist$c
. Die 1. ist nur eine String-Verkettung von$a
und$b
.If
$c
is-eq
ual to$a
, was bedeutet, dass$b
das nicht gefunden wurde, ist Boolean$true
or1
, und daher wird das erste Element des Arrays (die Verkettung) ausgewählt. Sonst ist es Boolean$false
, also geben wir$c
das 0. Element aus.Beachten Sie, dass dies
-replace
gierig ist und daher zuerst von links ersetzt wird, was bedeutet, dass derababa / aba
Testfall ordnungsgemäß zurückgegeben wirdba
.quelle
Java 8, 65 Bytes
Dieselbe Logik wie die Java 7-Lösung, die mit einem Lambda geschrieben wurde.
Probieren Sie es hier aus
quelle
Ruby,
33 Bytes27 Bytes (28 bei Verwendung der globalen Substitution)definitiv 28 Bytesquelle
Mathematica, 45 Bytes
Anonyme Funktion, die die Hauptzeichenfolge und die Umschaltzeichenfolge (in dieser Reihenfolge) verwendet und das Ergebnis zurückgibt. Erläuterung:
quelle
TSQL,
143129121 BytesLesbar:
Live Demo
114 Bytes mit einer Zeicheneingabe
quelle
TSQL (SQL Server 2012), 49 Byte
Probieren Sie es online!
quelle
Ruby,
353728 BytesHurra für die String-Interpolation! Es funktioniert sogar in regulären Ausdrücken. Der Rest ist einfach: Wenn der String in
t
übereinstimmtm
, ersetzen Sie ihnt
durch''
, sonst kehren Sie zurückm+t
.Bearbeiten: Ein Fehler wurde behoben.
Bearbeiten: Ich habe den Vorschlag von Kevin Lau angewendet, aber es scheint, dass ich den gleichen Algorithmus wie in Luis Masuellis Antwort erreicht habe .
quelle
("a", ".")
gibt"a"
statt"a."
.m[t]
ist viel kürzer alsm.include?(t)
und prüft immer noch auf die Aufnahme in Strings.k (23 Bytes)
Beispiele:
quelle
Kotlin, 61 Bytes
Dies wäre kürzer, wenn die Zuweisung ein Ausdruck in Kotlin wäre und Parameter veränderlich wären und es einen ternären bedingten Operator gäbe. Leider ist dies nicht der Fall :(
Probieren Sie es online!
Ungolfed
quelle