Biorąc pod uwagę jedną linię, która składa się tylko z liter, wykonaj następujące czynności:
- Utrzymujesz ciąg pusty na początku.
- Jeśli następny ciąg wejściowy znajduje się w ciągu, usuń go z ciągu.
- Jeśli następnego znaku wejściowego nie ma w ciągu, dołącz go do ciągu.
Wyprowadza końcowy stan ciągu.
Możesz bezpiecznie założyć, że dane wejściowe zawierają co najmniej jeden znak (tzn. Niepuste), ale nie ma gwarancji, że dane wyjściowe nie są puste.
Pseudokod (zachęcamy do gry w golfa):
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
Dane wejściowe pasują do wyrażenia regularnego ^[A-Za-z]+$
.
Przykładowe przypadki testowe:
ABCDBCCBE -> ADCBE
ABCXYZCABXAYZ -> A
aAABBbAbbB -> aAbB
GG -> (empty)
Dane wejściowe można podać w dowolny odpowiedni sposób, ale należy je traktować jako ciąg znaków i to samo dla danych wyjściowych. Program nie powinien wychodzić z błędem.
Zwycięża najkrótszy program w każdym języku!
Dodatkowe (opcjonalne): wyjaśnij, jak działa Twój program. Dziękuję Ci.
Odpowiedzi:
Haskell ,
4442 bajtyWypróbuj online! Edycja: -2 bajty dzięki Zgarb!
Wyjaśnienie:
Druga linia definiuje funkcję,
(#)
która pobiera ciąg znakóws
i znakx
i wykonuje operację usuwania lub dołączania. Osiąga się to przezfilter
wygaszenie każdego wystąpieniax
ins
, co powoduje powstanie ciąguz
. Jeślix
nie występuje ws
, toz
jest równes
iz++[x|z==s]
zwraca oryginalny ciąg zx
dołączonym. W przeciwnym razie[x|z==s]
zwraca pusty ciąg i zwracany jest tylko ciąg filtrowany.foldl(#)""
jest anonimową funkcją, która pobiera ciąg znaków i dodaje jeden znak po drugim początkowo pusty ciąg""
z funkcją(#)
.źródło
Galaretka , 3 bajty
Wypróbuj online!
Pełny program
źródło
œ^/
nie wystarczy?the input is never empty
Cóż, teraz to działa.J ,
2119 bajtówJak to działa:
=/~
- tworzy tabelę równości znaków w ciągu:1#.
- suma każdego wiersza według przelicznika podstawowego 1 (ile razy litera występuje)~:&.|
- odwróć, następnie zastosuj sito nub (unikalny jest char) i odwróć ponownie. W ten sposób znajduję ostatnie wystąpienia znaków w ciągu:*
- mnoży liczbę przez 1 dla ostatniej pozycji znaku w sringu, przez 0 w przeciwnym razie, obliczoną przez powyższe~:&.|
2|
- moduł 2 (ustawia na 0 pozycje znaków, które się liczą):#~
- skopiuj prawy argument left arg. razy (~ odwraca miejsca argumentów)]f # a A
Wypróbuj online!
źródło
Brainfuck, 95 bajtów
Wypróbuj online
Jak to działa
źródło
Haskell , 47 bajtów
Kolejny bajtuje kurz dzięki Bruce'owi Forte.
Wypróbuj online!
Pobiera listę ciągów.
Różnica symetryczna jest denerwująca ...
źródło
++
union
dzięki tej metodzie oszczędza 2 bajty .Siatkówka , 16 bajtów
Wypróbuj online!
źródło
R ,
928477 bajtówWypróbuj online!
-15 bajtów dzięki djhurio
Wyjaśnienie
djhurio zapewnił doskonałą odpowiedź R, unikając
for
pętli - jak programiści R instynktownie robią z reguły (łącznie ze mną). Oto odpowiedź R, która wykorzystujefor
pętlę (i zapisuje kilka bajtów w procesie).x=scan(,'');
- przypisz dane wejściowe do zmiennejx
y='';
- utwórz pusty ciąg w zmiennej o nazwiey
for(i in el(strsplit(x,'')))
- dla każdej postacii
wx
y=c(y[y!=i],if(!i%in%y)i)
- przypisać doy
każdego elementu,y
który nie jest równyi
, dołączając,i
jeśli jeszczei
go nie byłoy
cat(y,sep='')
- wydrukuj elementyy
bez odstępu między nimiUwaga
Jeśli klikniesz powyższy link TIO, znajdziesz w nagłówku
library(methods)
; ma to na celu rozwiązanie błędu djhurio występującego w związku zel()
funkcją - funkcja jest dostarczana przezmethods
pakiet, który w dowolnej wersji R, z której korzystałem, jest domyślnie ładowany, ale z jakiegokolwiek powodu nie jest to TIO. Jeślilibrary(methods)
zostanie usunięty z nagłówka iunlist
zastąpionyel
, zyskuję cztery bajty, ale tak też zrobi djhurio , ustawiając liczbę naszych bajtów odpowiednio na9688 i 99.źródło
for(i in el(strsplit(scan(,y<-''),y)))y=c(y[y!=i],if(!i%in%y)i);cat(y,sep='')
....[[1]]
jest dłuższy niż,el(...)
ale krótszy niżunlist(...)
, pod warunkiem, że...
jest to lista długości 1.0
jest tonul
znak i zostaje przekonwertowany na pusty ciąg.MATL , 6 bajtów
Nie działa w środowisku TIO, ale działa dobrze w implementacji MATLAB, a dzięki nowej łatce możesz wypróbować ją w MATL Online
X~
jest równasetxor
lub różnica symetryczna, co robi dokładnie to, o co prosi wyzwanie. Reszta po prostu zapętla dane wejściowei"@
i zaczyna od pustego łańcucha, łącząc cały stos, który jest pusty na początku (dzięki Luis Mendo).źródło
Python 2 , 56 bajtów
-2 bajty dzięki xnor. -3 bajty dzięki ovs.
Wypróbuj online!
Dosłownie właśnie grałem w pseudokod. : P
źródło
s=(s+c).replace(c,c[c in s:])
.s=s.replace(c,'')+c[c in s:]
JavaScript (ES6), 60 bajtów
Przypadki testowe
Pokaż fragment kodu
źródło
q , 38 bajtów
źródło
APL + WIN, 19 bajtów
Logika podobna do rozwiązania J Galena.
źródło
Wolfram Language (Mathematica) , 36 bajtów
Wypróbuj online!
Pobiera dane wejściowe i wyjściowe jako listę znaków.
Jak to działa
Używa
//.
(aliasuReplaceRepeated
), aby znaleźć dwa powtarzające się znaki i usunąć oba, dopóki nie będzie już więcej powtarzających się znaków. Jeśli postać występuje więcej niż dwa razy, Mathematica zawsze usunie pierwsze dwa wystąpienia. Jeśli więc postać pojawi się nieparzystą liczbę razy, jej ostatnią instancją zawsze będzie ta, która przeżyje.źródło
Prolog 81 bajtów
Wersja nie zaciemniona:
delete/3
zapewnia, że jego trzeci argument ujednolica się z pierwszym argumentem, a wszystkie wystąpienia drugiego argumentu zostaną z niego usunięte.append/3
jak sama nazwa dołącza element do listy.[]
(pustą listę), w którym to momencie wynik pośredni zostanie zjednoczony z pożądanym wynikiem.Test:
Niektóre Prologi traktują ciągi w podwójnych cudzysłowach jak listy, SWI można skonfigurować tak, aby robił to samo, ale dla uproszczenia
string_codes/2
ładnie sformatowałem dane wyjściowe.źródło
Perl 5, 28 + 2 (-pF) = 30 bajtów
Wypróbuj online
źródło
R , 84 bajtów
Wypróbuj online!
Inne rozwiązanie, ale tutaj są lepsze odpowiedzi R.
R , 88 bajtów
Wypróbuj online!
Dzięki Giuseppe za -7 bajtów!
Odpowiedź kaczki jest krótsza .
scan(,"")
odczytać wejście ze standardowego wejścia.y<-el(strsplit(scan(,""),""))
podziel wprowadzanie na znaki i zapisz jakoy
.z=table(y<-el(strsplit(scan(,""),"")))
oblicz częstotliwości każdego znaku i zapisz wynikową tabelę jakoz
;unique(y,,T)
zabierz unikalne postacie z prawej strony.names(z[!z%%2])
wybierz tylko parzyste liczby i wyodrębnij nazwy.setdiff(unique(y,,T),names(z[!z%%2]))
usuń postacie z parzystą liczbą.cat(setdiff(unique(y,,T),names(z[!z%%2])),sep="")
wydrukować wynik.źródło
el()
pochodzi on zmethods
pakietu, który choć zwykle ładowany jest domyślnie, nie jest TIO (omówiony w mojej odpowiedzi poniżej)rev(unique(rev(y)))
? Czy po prostu nieunique(y)
zadziała? ooohhh czekaj, rozumiem, chcesz unikalne postacie od prawej do lewej. W takim przypadkuunique(y,,T)
(ustawieniefromLast=T
) wyniesie 88 bajtów .Alice , 9 bajtów
Wypróbuj online!
Wyjaśnienie
Zasadniczo port odpowiedzi Erika . Poza odrobiną przekierowania adresu IP kod jest po prostu:
co robi:
źródło
APL (Dyalog) , 16 bajtów
Wypróbuj online!
Gdyby błędy były dozwolone, byłoby to 9 bajtów:
źródło
DOMAIN ERROR
jeśli ciąg jest pusty, ponieważ(,⍨~∩)
nie ma predefiniowanego elementu tożsamości.Pyth , 15 bajtów
Wypróbuj online!
źródło
Rubin , 53 bajty
Wypróbuj online!
Dane wejściowe i wyjściowe są tablicą znaków. Testuj połączenia kodowe
.chars
i.join
dla wygody.Wyjaśnienie
Wykorzystuje fakt, że litery w wynikowym ciągu pojawiają się nieparzystą liczbę razy i w kolejności od prawej do lewej.
źródło
Pyth, 13 bajtów
Pobiera dane wejściowe jako listę znaków. Przetestuj to!
źródło
Röda , 34 bajty
Wypróbuj online!
To jest bezpośrednie tłumaczenie pseudokodu. Traktuje dane wejściowe i wyjściowe jako strumienie znaków.
Wyjaśnienie:
źródło
Python 3 , 73 bajty
Nie najkrótszy, ale podoba mi się to podejście.
Wypróbuj online!
Pętle przechodzą przez ciąg, zachowując tylko te znaki, w których:
(s.count(c)%2) == 0
- Postać pojawia się parzysta liczba razy.(i==s.rfind(c))
- Obecny indeks jest ostatnim pojawieniem się danej postaci.źródło
REXX , 102 bajty
Wypróbuj online!
Jak to działa: weź prawą literę, zobacz, czy liczba wystąpień jest parzysta czy nieparzysta (która również podwaja się jako wartość prawdy), a jeśli nieparzysta, dodaj ją do ciągu wyjściowego. Następnie usuń wszystkie wystąpienia litery z ciągu wejściowego. Powtarzaj do momentu wyczerpania się danych wejściowych.
źródło
Perl 5, 22 + 1 (
-p
) = 23 bytesTry it online!
źródło
Java 8, 93 bytes
A lambda from
String
toString
. Just an implementation of the pseudocode in the question.Try It Online
Java 8, 182 bytes
Here's another lambda of the same type that uses streams! It's probably more efficient.
Try It Online
Ungolfed
źródło
R, 70 bytes
Try it online!
I was encouraged by djhurio to post this solution; djhurio's answer can be found here.
This uses the same idea as duckmayr's answer, but it leverages a numeric approach by converting the string to its codepoints rather than splitting it into characters, and is a function rather than a full program so it can return the new string rather than printing to stdout.
One important observation is that
F
is initialized toFALSE
or0
andutf8ToInt(0)==""
, so this will succeed for the empty string as well as correctly collapsing the codepoints.źródło
PHP, 71+1 bytes
Run as pipe with
-nR
or try it online.źródło
Python 3.6, 69 bytes
Try it online!
Dict insertion order is preserved in Python 3.6 .
źródło
SNOBOL4 (CSNOBOL4),
9795 bytesTry it online!
źródło