Dada uma linha que consiste apenas em letras, processe da seguinte maneira:
- Você mantém uma string vazia no começo.
- Se o próximo caractere de entrada estiver na sequência, remova-o da sequência.
- Se o próximo caractere de entrada não estiver na sequência, anexe-o à sequência.
Saída o estado final da string.
Você pode assumir com segurança que a entrada consiste em pelo menos um caractere (ou seja, não vazio), mas não há garantia de que a saída não esteja vazia.
Pseudocódigo (sinta-se à vontade para jogar isso):
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
A entrada corresponde à expressão regular ^[A-Za-z]+$
.
Casos de teste de amostra:
ABCDBCCBE -> ADCBE
ABCXYZCABXAYZ -> A
aAABBbAbbB -> aAbB
GG -> (empty)
A entrada pode ser fornecida de qualquer maneira aplicável, mas deve ser tratada como uma sequência e o mesmo para saída. O programa não deve sair com um erro.
O programa mais curto em cada idioma vence!
Extra (opcional): explique como o seu programa funciona. Obrigado.
Respostas:
Haskell ,
4442 bytesExperimente online! Edit: -2 bytes graças ao Zgarb!
Explicação:
A segunda linha define uma função
(#)
que pega uma strings
e um caracterex
e executa a remoção ou o acréscimo. Isso é obtido através dafilter
ingestão de todas as ocorrências dex
ins
, resultando na stringz
. Sex
não ocorrers
,z
será igual as
ez++[x|z==s]
produzirá a sequência original comx
anexado. Caso contrário,[x|z==s]
gera a cadeia vazia e somente a cadeia filtrada é retornada.foldl(#)""
é uma função anônima que pega uma string e adiciona um caracter após o outro a string inicialmente vazia""
com a função(#)
.fonte
Geléia , 3 bytes
Experimente online!
Programa completo.
fonte
œ^/
não basta?the input is never empty
Bem, agora funciona.J ,
2119 bytesComo funciona:
=/~
- cria uma tabela de igualdade dos caracteres na string:1#.
- soma de cada linha pela conversão de base 1 (quantas vezes a letra ocorre)~:&.|
- inverta e aplique a peneira nub (é o caractere exclusivo) e inverta novamente. Portanto, encontro as últimas ocorrências dos caracteres na string:*
- multiplica a contagem por 1 para a última posição do caractere no anel, por 0 caso contrário, calculado pela acima~:&.|
2|
- módulo 2 (define como 0 as posições dos caracteres que contam mesmo):#~
- copie o argumento da direita, à esquerda, arg. times (~ inverte os lugares dos argumentos)]f # a A
Experimente online!
fonte
Brainfuck, 95 bytes
Experimente Online
Como funciona
fonte
Haskell , 47 bytes
Outro bytes a poeira, graças a Bruce Forte.
Experimente online!
Leva uma lista de seqüências de caracteres.
A diferença simétrica é irritante ...
fonte
++
economiza 2 bytesunion
com este método.Retina , 16 bytes
Experimente online!
fonte
R ,
928477 bytesExperimente online!
-15 bytes graças a djhurio
Explicação
O djhurio forneceu uma excelente resposta R, evitando um
for
loop - como programadores R instintivamente fazem como regra (inclusive eu). Aqui está uma resposta R que utiliza umfor
loop (e salva alguns bytes no processo).x=scan(,'');
- atribua a entrada na variávelx
y='';
- crie uma string vazia em uma variável chamaday
for(i in el(strsplit(x,'')))
- para cada personagemi
emx
y=c(y[y!=i],if(!i%in%y)i)
- atribuir ay
cada elementoy
que não seja igual ai
, acrescentandoi
sei
ainda não estiver emy
cat(y,sep='')
- imprima os elementosy
sem espaço entre elesNota
Se você clicar no link TIO acima, encontrará no cabeçalho
library(methods)
; isso é para lidar com o erro que o djhurio experimentou em relação àel()
função - a função é fornecida pelomethods
pacote, que em qualquer versão do R que eu usei, é carregado por padrão, mas por qualquer motivo não é do TIO. Selibrary(methods)
for removido do cabeçalho eunlist
substituídoel
, eu ganho quatro bytes, mas djhurio também , colocando nossa contagem de bytes em9688 e 99, respectivamente.fonte
for(i in el(strsplit(scan(,y<-''),y)))y=c(y[y!=i],if(!i%in%y)i);cat(y,sep='')
....[[1]]
é maior que,el(...)
mas menor queunlist(...)
, desde que...
seja uma lista de comprimento 1.0
é onul
personagem e é convertido para a string vazia.MATL , 6 bytes
Não funciona no ambiente TIO, mas funciona bem na implementação do MATLAB e, graças a um novo patch, você pode experimentá-lo no MATL Online
X~
igualsetxor
ou diferença simétrica, que faz exatamente o que o desafio pede. O resto está apenas repetindo a entradai"@
e começando com uma string vazia, concatenando toda a pilha que está vazia no início (obrigado Luis Mendo).fonte
Python 2 , 56 bytes
-2 bytes graças ao xnor. -3 bytes graças a ovs.
Experimente online!
Literalmente, apenas jogou o pseudocódigo. : P
fonte
s=(s+c).replace(c,c[c in s:])
.s=s.replace(c,'')+c[c in s:]
JavaScript (ES6), 60 bytes
Casos de teste
Mostrar snippet de código
fonte
q , 38 bytes
fonte
APL + WIN, 19 bytes
Lógica semelhante à solução J de Galen.
fonte
Wolfram Language (Mathematica) , 36 bytes
Experimente online!
Toma entrada e saída como uma lista de caracteres.
Como funciona
Usa
//.
(aliasReplaceRepeated
) para encontrar dois caracteres repetidos e excluir os dois, até que não exista mais caracteres repetidos. Se o caractere ocorrer mais de duas vezes, o Mathematica sempre excluirá as duas primeiras ocorrências. Portanto, se um personagem ocorrer um número ímpar de vezes, sua última instância será sempre a única a sobreviver.fonte
Prolog 81 byte
Versão não ofuscada:
delete/3
garante que seu terceiro argumento seja unificado ao primeiro, com todas as instâncias do segundo argumento removidas.append/3
conforme seu nome, acrescenta um elemento à lista.[]
(lista vazia), momento em que o resultado intermediário será unificado com o resultado desejado.Teste:
Alguns Prologs tratam seqüências de caracteres entre aspas duplas como listas, o SWI pode ser configurado para fazer o mesmo, mas por uma questão de simplicidade, eu costumava
string_codes/2
formatar bem a saída.fonte
Perl 5, 28 + 2 (-pF) = 30 bytes
Experimente online
fonte
R , 84 bytes
Experimente online!
Outra solução, mas há melhores R respostas aqui.
R , 88 bytes
Experimente online!
Obrigado a Giuseppe por -7 bytes!
Há uma resposta mais curta de duckmayr .
scan(,"")
leia a entrada do stdin.y<-el(strsplit(scan(,""),""))
divida a entrada por caracteres e salve comoy
.z=table(y<-el(strsplit(scan(,""),"")))
calcular frequências de cada caractere e salvar a tabela resultante comoz
;unique(y,,T)
pegue caracteres únicos do lado direito.names(z[!z%%2])
selecione apenas contagens pares e extraia nomes.setdiff(unique(y,,T),names(z[!z%%2]))
remover caracteres com contagem uniforme.cat(setdiff(unique(y,,T),names(z[!z%%2])),sep="")
imprima a saída.fonte
el()
vem domethods
pacote, que embora normalmente seja carregado por padrão, não é do TIO (discutido na minha resposta abaixo)rev(unique(rev(y)))
? Nãounique(y)
funcionaria apenas ? ooohhh espera eu vejo, você quer os caracteres únicos da direita para a esquerda. Nesse casounique(y,,T)
(configuraçãofromLast=T
) será 88 bytes .Alice , 9 bytes
Experimente online!
Explicação
Basicamente, um porto da resposta de Erik . Além de um pouco de redirecionamento de IP, o código é realmente apenas:
que faz:
fonte
APL (Dyalog) , 16 bytes
Experimente online!
Se erros fossem permitidos, isso teria sido 9 bytes:
fonte
DOMAIN ERROR
se a string estiver vazia, pois(,⍨~∩)
não possui um elemento de identidade predefinido.Pitão , 15 bytes
Experimente online!
fonte
Ruby , 53 bytes
Experimente online!
Entrada e saída são uma matriz de caracteres. Chamadas de código de teste
.chars
e.join
por conveniência.Explicação
Usa o fato de que as letras na sequência resultante aparecem um número ímpar de vezes e na ordem da direita para a esquerda.
fonte
Pitão, 13 bytes
Recebe entrada como lista de caracteres. Teste!
fonte
Röda , 34 bytes
Experimente online!
Esta é uma tradução direta do pseudocódigo. Trata a entrada e a saída como fluxos de caracteres.
Explicação:
fonte
Python 3 , 73 bytes
Não é o mais curto, mas eu gosto dessa abordagem.
Experimente online!
Faz um loop na string, mantendo apenas os caracteres em que:
(s.count(c)%2) == 0
- O personagem aparece um número par de vezes.(i==s.rfind(c))
- O índice atual é a última aparição do personagem em questão.fonte
REXX , 102 bytes
Experimente online!
Como funciona: Pegue a letra mais à direita, veja se o número de ocorrências é par ou ímpar (que também funciona como um valor verdadeiro) e, se ímpar, adicione-o à string de saída. Em seguida, remova todas as ocorrências da letra da sequência de entrada. Repita até que a entrada se esgote.
fonte
Perl 5 , 22 + 1 (
-p
) = 23 bytesExperimente online!
fonte
Java 8, 93 bytes
Um lambda de
String
paraString
. Apenas uma implementação do pseudocódigo na questão.Experimente Online
Java 8, 182 bytes
Aqui está outro lambda do mesmo tipo que usa fluxos! Provavelmente é mais eficiente.
Experimente Online
Ungolfed
fonte
R , 70 bytes
Experimente online!
Fui encorajado por djhurio a postar esta solução; A resposta de djhurio pode ser encontrada aqui .
Isso usa a mesma idéia que a resposta de duckmayr , mas utiliza uma abordagem numérica convertendo a string em seus pontos de código, em vez de dividi-la em caracteres, e é uma função e não um programa completo para que ela possa retornar a nova string em vez de imprimir em stdout .
Uma observação importante é que ela
F
é inicializada comoFALSE
ou0
eutf8ToInt(0)==""
, portanto, isso será bem-sucedido para a sequência vazia, além de recolher corretamente os pontos de código.fonte
PHP, 71 + 1 bytes
Execute como pipe
-nR
ou experimente online .fonte
Python 3.6 , 69 bytes
Experimente online!
A ordem de inserção do dict é preservada no Python 3.6.
fonte
SNOBOL4 (CSNOBOL4) ,
9795 bytesExperimente online!
fonte