Dada una línea que consta de solo letras, procese de la siguiente manera:
- Mantiene una cadena que está vacía al principio.
- Si el siguiente carácter de entrada está en la cadena, elimínelo de la cadena.
- Si el siguiente carácter de entrada no está en la cadena, agréguelo a la cadena.
Salida del estado final de la cadena.
Puede suponer con seguridad que la entrada consta de al menos un carácter (es decir, no vacío), pero no hay garantía de que la salida no esté vacía.
Pseudocódigo (siéntase libre de jugar al golf):
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
La entrada coincide con la expresión regular ^[A-Za-z]+$.
Ejemplos de casos de prueba:
ABCDBCCBE -> ADCBE
ABCXYZCABXAYZ -> A
aAABBbAbbB -> aAbB
GG -> (empty)
La entrada se puede dar de cualquier manera aplicable, pero debe tratarse como una cadena, y lo mismo para la salida. El programa no debe salir con un error.
¡El programa más corto en cada idioma gana!
Extra (Opcional): explique cómo funciona su programa. Gracias.

Respuestas:
Haskell ,
4442 bytesPruébalo en línea! Editar: -2 bytes gracias a Zgarb!
Explicación:
La segunda línea define una función
(#)que toma una cadenasy un carácterxy realiza la eliminación o la adición. Esto se lografiltereliminando cada aparición dexins, dando como resultado la cadenaz. Sixno ocurre ens, entonceszes igualsyz++[x|z==s]produce la cadena original conxadjunta. De lo contrario, se[x|z==s]obtiene la cadena vacía y solo se devuelve la cadena filtrada.foldl(#)""es una función anónima que toma una cadena y agrega un carácter después del otro, la cadena inicialmente vacía""con la función(#).fuente
Jalea , 3 bytes
Pruébalo en línea!
Programa completo
fuente
œ^/no es suficiente?the input is never emptyBueno, ahora funciona.J ,
2119 bytesCómo funciona:
=/~- hace una tabla de igualdad de los caracteres en la cadena:1#.- suma de cada fila por conversión de base 1 (cuántas veces aparece la letra)~:&.|- invierta, luego aplique el tamiz de protuberancia (es el carbón único) e invierta nuevamente Así encuentro las últimas ocurrencias de los caracteres en la cadena:*- multiplica el recuento por 1 para la última posición del personaje en la banda, por 0 de lo contrario, calculado por lo anterior~:&.|2|- módulo 2 (establece en 0 las posiciones de los caracteres que cuentan incluso):#~- Copie el argumento derecho arg de la izquierda. veces (~ invierte los lugares de los argumentos)]f # a APruébalo en línea!
fuente
Brainfuck, 95 bytes
Pruébalo en línea
Cómo funciona
fuente
Haskell , 47 bytes
Otro bytes el polvo gracias a Bruce Forte.
Pruébalo en línea!
Toma una lista de cadenas.
La diferencia simétrica es molesta ...
fuente
++ahorra 2 bytesunioncon este método.Retina , 16 bytes
Pruébalo en línea!
fuente
R ,
928477 bytesPruébalo en línea!
-15 bytes gracias a djhurio
Explicación
djhurio proporcionó una excelente respuesta R evitando un
forbucle, como lo hacen instintivamente los programadores R por regla general (incluido yo mismo). Aquí hay una respuesta R que utiliza unforbucle (y ahorra algunos bytes en el proceso).x=scan(,'');- asignar la entrada a la variablexy='';- Crear una cadena vacía en una variable llamadayfor(i in el(strsplit(x,'')))- por cada personajeienxy=c(y[y!=i],if(!i%in%y)i)- asignar aycada elemento deyeso no es igual ai, agregandoisi aúnino estaba enycat(y,sep='')- imprime los elementosysin espacio entre ellosNota
Si hace clic en el enlace TIO anterior, encontrará en el encabezado
library(methods); esto es para lidiar con el error que djhurio experimentó con respecto a lael()función: la función es proporcionada por elmethodspaquete, que en cualquier versión de R que he usado, se carga por defecto, pero por cualquier razón no es por TIO. Silibrary(methods)se elimina del encabezado yunlistse sustituyeel, gano cuatro bytes, pero también lo haría djhurio , poniendo nuestros recuentos de bytes en9688 y 99 respectivamente.fuente
for(i in el(strsplit(scan(,y<-''),y)))y=c(y[y!=i],if(!i%in%y)i);cat(y,sep='')....[[1]]es más largoel(...)pero más corto queunlist(...), siempre que...sea una lista de longitud 1.0es elnulpersonaje y se convierte en la cadena vacía.MATL , 6 bytes
No funciona en el entorno TIO, pero funciona bien en la implementación de MATLAB, y gracias a un parche nuevo, puede probarlo en MATL Online
X~igualsetxor, o diferencia simétrica, que hace exactamente lo que el desafío pide. El resto es simplemente recorrer la entradai"@y comenzar con una cadena vacía concatenando toda la pila que está vacía al comienzo (gracias Luis Mendo).fuente
Python 2 , 56 bytes
-2 bytes gracias a xnor. -3 bytes gracias a los ovs.
Pruébalo en línea!
Literalmente solo jugué al pseudocódigo. :PAG
fuente
s=(s+c).replace(c,c[c in s:]).s=s.replace(c,'')+c[c in s:]JavaScript (ES6), 60 bytes
Casos de prueba
Mostrar fragmento de código
fuente
q , 38 bytes
fuente
APL + WIN, 19 bytes
Lógica similar a la solución J de Galen.
fuente
Wolfram Language (Mathematica) , 36 bytes
Pruébalo en línea!
Toma entrada y salida como una lista de caracteres.
Cómo funciona
Utiliza
//.(aliasReplaceRepeated) para buscar dos caracteres repetidos y eliminar ambos, hasta que no existan más caracteres repetidos. Si el personaje aparece más de dos veces, Mathematica siempre eliminará las dos primeras ocurrencias. Entonces, si un personaje aparece un número impar de veces, su última instancia siempre será la que sobreviva.fuente
Prólogo 81 byte
Versión no ofuscada:
delete/3asegura que su tercer argumento se unifique con su primer argumento, con todas las instancias del segundo argumento eliminadas de él.append/3según su nombre, agrega un elemento a la lista.[](lista vacía), en cuyo punto el resultado intermedio se unificará con el resultado deseado.Prueba:
Algunos Prologs tratan las cadenas entre comillas dobles como listas, SWI se puede configurar para hacer lo mismo, pero por simplicidad, solía
string_codes/2formatear muy bien la salida.fuente
Perl 5, 28 + 2 (-pF) = 30 bytes
Pruébalo en línea
fuente
R , 84 bytes
Pruébalo en línea!
Otra solución, pero hay mejores respuestas R aquí.
R , 88 bytes
Pruébalo en línea!
¡Gracias a Giuseppe por -7 bytes!
Hay una respuesta más corta por duckmayr .
scan(,"")leer la entrada de stdin.y<-el(strsplit(scan(,""),""))dividir la entrada por caracteres y guardar comoy.z=table(y<-el(strsplit(scan(,""),"")))calcular las frecuencias de cada carácter y guardar la tabla resultante comoz;unique(y,,T)tomar personajes únicos del lado derecho.names(z[!z%%2])seleccione solo recuentos pares y extraiga nombres.setdiff(unique(y,,T),names(z[!z%%2]))eliminar personajes con recuento par.cat(setdiff(unique(y,,T),names(z[!z%%2])),sep="")imprime la salida.fuente
el()proviene delmethodspaquete, que normalmente mientras se carga por defecto, no es por TIO (discutido en mi respuesta a continuación)rev(unique(rev(y)))? ¿No solounique(y)funcionaría? ooohhh espera ya veo, quieres los personajes únicos de derecha a izquierda. En ese casounique(y,,T)(configuraciónfromLast=T) será de 88 bytes .Alice , 9 bytes
Pruébalo en línea!
Explicación
Básicamente un puerto de la respuesta de Erik . Además de un poco de redirección de IP, el código es realmente justo:
que hace:
fuente
APL (Dyalog) , 16 bytes
Pruébalo en línea!
Si se permitieran errores, esto habría sido de 9 bytes:
fuente
DOMAIN ERRORsi la cadena está vacía, ya(,⍨~∩)que no tiene un elemento de identidad predefinido.Pyth , 15 bytes
Pruébalo en línea!
fuente
Ruby , 53 bytes
Pruébalo en línea!
La entrada y la salida son un conjunto de caracteres. Prueba de código de llamadas
.charsy.joinpara mayor comodidad.Explicación
Utiliza el hecho de que las letras en la cadena resultante aparecen un número impar de veces y en el orden de derecha a izquierda.
fuente
Pyth, 13 bytes
Toma entrada como lista de caracteres. ¡Pruébalo!
fuente
Röda , 34 bytes
Pruébalo en línea!
Esta es una traducción directa del pseudocódigo. Trata la entrada y la salida como secuencias de caracteres.
Explicación:
fuente
Python 3 , 73 bytes
No es el más corto, pero me gusta este enfoque.
Pruébalo en línea!
Recorre la cadena, manteniendo solo aquellos caracteres donde:
(s.count(c)%2) == 0- El personaje aparece un número par de veces.(i==s.rfind(c))- El índice actual es la última aparición del personaje en cuestión.fuente
REXX , 102 bytes
Pruébalo en línea!
Cómo funciona: tome la letra más a la derecha, vea si el número de ocurrencias es par o impar (que también funciona como un valor de verdad) y si es impar, agréguelo a la cadena de salida. Luego, elimine todas las apariciones de la letra de la cadena de entrada. Repita hasta que se agote la entrada.
fuente
Perl 5 , 22 + 1 (
-p) = 23 bytesPruébalo en línea!
fuente
Java 8, 93 bytes
Una lambda de
StringaString. Solo una implementación del pseudocódigo en la pregunta.Pruébalo en línea
Java 8, 182 bytes
¡Aquí hay otra lambda del mismo tipo que usa secuencias! Probablemente sea más eficiente.
Pruébalo en línea
Sin golf
fuente
R , 70 bytes
Pruébalo en línea!
Djhurio me animó a publicar esta solución; la respuesta de djhurio se puede encontrar aquí .
Utiliza la misma idea que la respuesta de duckmayr , pero aprovecha un enfoque numérico al convertir la cadena en sus puntos de código en lugar de dividirla en caracteres, y es una función en lugar de un programa completo para que pueda devolver la nueva cadena en lugar de imprimirla en stdout .
Una observación importante es que
Fse inicializa aFALSEo0yutf8ToInt(0)=="", por lo que este tendrá éxito para la cadena vacía, así como el colapso de los puntos de código correctamente.fuente
PHP, 71 + 1 bytes
Ejecutar como tubería
-nRo probarlo en línea .fuente
Python 3.6 , 69 bytes
Pruébalo en línea!
El orden de inserción de Dict se conserva en Python 3.6.
fuente
SNOBOL4 (CSNOBOL4) ,
9795 bytesPruébalo en línea!
fuente