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 cadenas
y un carácterx
y realiza la eliminación o la adición. Esto se lografilter
eliminando cada aparición dex
ins
, dando como resultado la cadenaz
. Six
no ocurre ens
, entoncesz
es iguals
yz++[x|z==s]
produce la cadena original conx
adjunta. 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 empty
Bueno, 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 A
Prué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 bytesunion
con 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
for
bucle, como lo hacen instintivamente los programadores R por regla general (incluido yo mismo). Aquí hay una respuesta R que utiliza unfor
bucle (y ahorra algunos bytes en el proceso).x=scan(,'');
- asignar la entrada a la variablex
y='';
- Crear una cadena vacía en una variable llamaday
for(i in el(strsplit(x,'')))
- por cada personajei
enx
y=c(y[y!=i],if(!i%in%y)i)
- asignar ay
cada elemento dey
eso no es igual ai
, agregandoi
si aúni
no estaba eny
cat(y,sep='')
- imprime los elementosy
sin 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 elmethods
paquete, 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 yunlist
se 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.0
es elnul
personaje 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/3
asegura que su tercer argumento se unifique con su primer argumento, con todas las instancias del segundo argumento eliminadas de él.append/3
segú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/2
formatear 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 delmethods
paquete, 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 ERROR
si 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
.chars
y.join
para 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
String
aString
. 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
F
se inicializa aFALSE
o0
yutf8ToInt(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
-nR
o 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