Wenn eine Zeile nur aus Buchstaben besteht, verfahren Sie wie folgt:
- Sie pflegen eine Zeichenfolge, die am Anfang leer ist.
- Wenn sich das nächste Eingabezeichen in der Zeichenfolge befindet, entfernen Sie es aus der Zeichenfolge.
- Wenn das nächste Eingabezeichen nicht in der Zeichenfolge enthalten ist, hängen Sie es an die Zeichenfolge an.
Gibt den Endzustand der Zeichenkette aus.
Sie können davon ausgehen, dass die Eingabe aus mindestens einem Zeichen besteht (dh nicht leer ist), es kann jedoch nicht garantiert werden, dass die Ausgabe nicht leer ist.
Pseudocode (Fühlen Sie sich frei, dies zu spielen):
str = EMPTY
for each character ch in input
if ch exists in str
remove all ch from str
else
append ch to str
print str
Die Eingabe entspricht dem regulären Ausdruck ^[A-Za-z]+$
.
Beispiel Testfälle:
ABCDBCCBE -> ADCBE
ABCXYZCABXAYZ -> A
aAABBbAbbB -> aAbB
GG -> (empty)
Die Eingabe kann auf beliebige Weise erfolgen, muss jedoch als Zeichenfolge behandelt werden und für die Ausgabe identisch sein. Das Programm sollte nicht mit einem Fehler beendet werden.
Das kürzeste Programm in jeder Sprache gewinnt!
Extra (Optional): Bitte erläutern Sie, wie Ihr Programm funktioniert. Vielen Dank.
Antworten:
Haskell ,
4442 BytesProbieren Sie es online! Edit: -2 Bytes dank Zgarb!
Erläuterung:
Die zweite Zeile definiert eine Funktion,
(#)
die eine Zeichenfolges
und ein Zeichenx
akzeptiert und entweder das Entfernen oder das Anhängen ausführt. Dies wird erreicht durchfilter
ing aus jedem Auftretenx
ins
, was in der Zeichenfolgez
. Wenn inx
nicht vorkommts
, dannz
ist gleichs
undz++[x|z==s]
ergibt den Originalstring mitx
angehängtem. Andernfalls wird[x|z==s]
die leere Zeichenfolge ausgegeben und nur die gefilterte Zeichenfolge zurückgegeben.foldl(#)""
ist eine anonyme Funktion, die eine Zeichenfolge verwendet und""
der Funktion eine anfangs leere Zeichenfolge nach der anderen hinzufügt(#)
.quelle
Gelee , 3 Bytes
Probieren Sie es online!
Volles Programm.
quelle
œ^/
nicht genug?the input is never empty
Nun, jetzt funktioniert es.J ,
2119 BytesWie es funktioniert:
=/~
- erstellt eine Gleichheitstabelle der Zeichen in der Zeichenfolge:1#.
- Summe jeder Zeile nach Basis 1-Konvertierung (wie oft der Buchstabe vorkommt)~:&.|
- umkehren, dann Noppensieb auftragen (ist das Zeichen einzigartig) und erneut umkehren. So finde ich die letzten Vorkommen der Zeichen in der Zeichenkette:*
- multipliziert die Anzahl mit 1 für die letzte Position des Zeichens im Ring, ansonsten mit 0, wie oben berechnet~:&.|
2|
- Modulo 2 (setzt die Position der Zeichen, die gerade zählen, auf 0):#~
- Kopieren Sie das rechte Argument left arg. times (~ kehrt die Orte der Argumente um)]f # a A
Probieren Sie es online!
quelle
Brainfuck, 95 Bytes
Probieren Sie es online
Wie es funktioniert
quelle
Haskell , 47 Bytes
Ein weiteres Mal kommt Bruce Forte zu Hilfe.
Probieren Sie es online!
Nimmt eine Liste von Strings auf.
Symmetrischer Unterschied ist ärgerlich ...
quelle
++
Spartunion
mit dieser Methode 2 Bytes .Netzhaut , 16 Bytes
Probieren Sie es online!
quelle
R ,
928477 BytesProbieren Sie es online!
-15 Bytes dank Djhurio
Erläuterung
djhurio lieferte eine ausgezeichnete R-Antwort, die eine
for
Schleife vermeidet - wie es R-Programmierer in der Regel instinktiv tun (ich selbst eingeschlossen). Hier ist eine R-Antwort, die einefor
Schleife verwendet (und dabei einige Bytes einspart).x=scan(,'');
- ordnen Sie den Eingang der Variablen zux
y='';
- Erstellen Sie eine leere Zeichenfolge in einer Variablen namensy
for(i in el(strsplit(x,'')))
- Für jedes Zeicheni
inx
y=c(y[y!=i],if(!i%in%y)i)
- Weisen Siey
jedem Element zuy
, das nicht gleich ist,i
und fügen Sie hinzu,i
wenni
es nicht bereits vorhanden wary
cat(y,sep='')
- drucke die Elementey
ohne Zwischenraum ausHinweis
Wenn Sie oben auf den TIO-Link klicken, finden Sie ihn in der Kopfzeile
library(methods)
. Dies soll den Fehler behandeln, den djhurio in Bezug auf dieel()
Funktion hatte - die Funktion wird durch dasmethods
Paket bereitgestellt, das in jeder Version von R, die ich verwendet habe, standardmäßig geladen ist, aber aus irgendeinem Grund nicht von TIO. Wennlibrary(methods)
aus dem Header entfernt und durch ersetztunlist
wirdel
, erhalte ich vier Bytes, aber djhurio würde dies auch tun und unsere Byteanzahl auf9688 bzw. 99 setzen.quelle
for(i in el(strsplit(scan(,y<-''),y)))y=c(y[y!=i],if(!i%in%y)i);cat(y,sep='')
....[[1]]
es länger als,el(...)
aber kürzer als istunlist(...)
, sofern es sich...
um eine Liste der Länge 1 handelt.0
ist dasnul
Zeichen und wird in die leere Zeichenfolge konvertiert.MATL , 6 Bytes
Funktioniert nicht in der TIO-Umgebung, funktioniert aber gut in der MATLAB-Implementierung, und dank eines neuen Patches können Sie es in MATL Online ausprobieren
X~
Gleichsetxor
oder symmetrischer Unterschied, der genau das tut, was die Herausforderung verlangt. Der Rest durchläuft einfach die Eingabei"@
und beginnt mit einer leeren Zeichenfolge, indem der gesamte Stapel verkettet wird, der zu Beginn leer ist (danke Luis Mendo).quelle
Python 2 , 56 Bytes
-2 Bytes dank xnor. -3 Bytes dank ovs.
Probieren Sie es online!
Ich habe buchstäblich nur den Pseudocode gespielt. : P
quelle
s=(s+c).replace(c,c[c in s:])
.s=s.replace(c,'')+c[c in s:]
JavaScript (ES6), 60 Byte
Testfälle
Code-Snippet anzeigen
quelle
q , 38 Bytes
quelle
APL + WIN, 19 Bytes
Logik ähnlich der Galenschen J-Lösung.
quelle
Wolfram Language (Mathematica) , 36 Byte
Probieren Sie es online!
Nimmt die Eingabe und Ausgabe als Liste von Zeichen.
Wie es funktioniert
Verwendet
//.
(AliasReplaceRepeated
), um zwei wiederholte Zeichen zu finden und beide zu löschen, bis keine wiederholten Zeichen mehr vorhanden sind. Wenn das Zeichen mehr als zweimal vorkommt, löscht Mathematica immer die ersten beiden Vorkommen. Wenn ein Charakter also ungerade oft vorkommt, ist seine letzte Instanz immer diejenige, die überlebt.quelle
Prolog 81 Byte
Nicht verschleierte Version:
delete/3
Stellt sicher, dass das dritte Argument mit dem ersten Argument vereinigt wird, wobei alle Instanzen des zweiten Arguments entfernt werden.append/3
Fügt gemäß seinem Namen ein Element an die Liste an.[]
(leere Liste) An diesem Punkt wird das Zwischenergebnis mit dem gewünschten Ergebnis vereinheitlicht.Prüfung:
Einige Prologe behandeln Strings in doppelten Anführungszeichen als Listen. SWI kann so konfiguriert werden, dass es dasselbe tut. Der Einfachheit halber habe ich die
string_codes/2
Ausgabe jedoch ordentlich formatiert.quelle
Perl 5, 28 + 2 (-pF) = 30 Bytes
Probieren Sie es online aus
quelle
R 84 Bytes
Probieren Sie es online!
Eine andere Lösung, aber hier gibt es bessere R- Antworten.
R 88 Bytes
Probieren Sie es online!
Danke an Giuseppe für -7 Bytes!
Es gibt eine kürzere Antwort von duckmayr .
scan(,"")
Eingabe von stdin lesen.y<-el(strsplit(scan(,""),""))
Eingabe nach Zeichen aufteilen und speichern untery
.z=table(y<-el(strsplit(scan(,""),"")))
Berechne die Häufigkeit jedes Zeichens und speichere die resultierende Tabelle alsz
;unique(y,,T)
Nimm einzigartige Charaktere von der rechten Seite.names(z[!z%%2])
wähle nur gerade Zählungen und extrahiere Namen.setdiff(unique(y,,T),names(z[!z%%2]))
Zeichen mit gerader Anzahl entfernen.cat(setdiff(unique(y,,T),names(z[!z%%2])),sep="")
Ausgabe drucken.quelle
el()
dasmethods
Paket, das normalerweise standardmäßig geladen wird, nicht von TIO stammt (rev(unique(rev(y)))
? Würde nicht einfachunique(y)
funktionieren? ooohhh warte ich sehe, du willst die eindeutigen Zeichen von rechts nach links. In diesem Fallunique(y,,T)
(EinstellungfromLast=T
) wird 88 Bytes .Alice , 9 Bytes
Probieren Sie es online!
Erläuterung
Grundsätzlich eine Portierung von Eriks Antwort . Abgesehen von ein bisschen IP-Umleitung ist der Code wirklich nur:
was macht:
quelle
APL (Dyalog) , 16 Bytes
Probieren Sie es online!
Wenn Fehler erlaubt wären, wären dies 9 Bytes:
quelle
DOMAIN ERROR
wenn die Zeichenfolge leer ist, da(,⍨~∩)
sie kein vordefiniertes Identitätselement hat.Pyth , 15 Bytes
Probieren Sie es online!
quelle
Ruby , 53 Bytes
Probieren Sie es online!
Input und Output sind beide ein Array von Zeichen. Testen Sie Codeaufrufe
.chars
und.join
zur Vereinfachung.Erläuterung
Verwendet die Tatsache, dass die Buchstaben in der resultierenden Zeichenfolge ungerade oft und in der Reihenfolge von rechts nach links erscheinen.
quelle
Pyth, 13 Bytes
Nimmt Eingaben als Liste von Zeichen auf. Probieren Sie es aus!
quelle
Röda , 34 Bytes
Probieren Sie es online!
Dies ist eine direkte Übersetzung des Pseudocodes. Eingaben und Ausgaben werden als Zeichenströme behandelt.
Erläuterung:
quelle
Python 3 , 73 Bytes
Nicht die kürzeste, aber ich mag diesen Ansatz.
Probieren Sie es online!
Durchläuft die Zeichenfolge und behält nur die Zeichen bei, bei denen:
(s.count(c)%2) == 0
- Der Buchstabe erscheint eine gerade Anzahl von Malen.(i==s.rfind(c))
- Der aktuelle Index ist das letzte Auftreten des betreffenden Zeichens.quelle
REXX , 102 Bytes
Probieren Sie es online!
So funktioniert es: Nehmen Sie den Buchstaben ganz rechts, prüfen Sie, ob die Anzahl der Vorkommen gerade oder ungerade ist (was auch als Wahrheitswert gilt), und fügen Sie ihn, falls ungerade, zur Ausgabezeichenfolge hinzu. Entfernen Sie dann alle Vorkommen des Buchstabens aus der Eingabezeichenfolge. Wiederholen, bis die Eingabe erschöpft ist.
quelle
Perl 5 , 22 + 1 (
-p
) = 23 BytesProbieren Sie es online!
quelle
Java 8, 93 Bytes
Ein Lambda von
String
bisString
. Nur eine Implementierung des Pseudocodes in der Frage.Probieren Sie es online
Java 8, 182 Bytes
Hier ist ein weiteres Lambda des gleichen Typs, das Streams verwendet! Es ist wahrscheinlich effizienter.
Probieren Sie es online
Ungolfed
quelle
R , 70 Bytes
Probieren Sie es online!
Djhurio hat mich ermutigt, diese lösung zu posten. Die Antwort von Djhurio finden Sie hier .
Dies verwendet die gleiche Idee wie die Antwort von duckmayr , nutzt jedoch einen numerischen Ansatz, indem die Zeichenfolge in ihre Codepunkte konvertiert wird, anstatt sie in Zeichen aufzuteilen , und ist eher eine Funktion als ein vollständiges Programm, sodass die neue Zeichenfolge zurückgegeben werden kann, anstatt zu stdout zu drucken .
Eine wichtige Beobachtung ist, dass
F
mitFALSE
oder0
und initialisiert wirdutf8ToInt(0)==""
, sodass dies sowohl für die leere Zeichenfolge als auch für das korrekte Reduzieren der Codepunkte gelingt.quelle
PHP, 71 + 1 Bytes
Lauf als Pipe mit
-nR
oder versuche es online .quelle
Python 3.6 , 69 Bytes
Probieren Sie es online!
Die Reihenfolge beim Einfügen von Dikten bleibt in Python 3.6 erhalten.
quelle
SNOBOL4 (CSNOBOL4) ,
97 bis95 ByteProbieren Sie es online!
quelle