Étant donné une ligne composée uniquement de lettres, procédez comme suit:
- Vous conservez une chaîne vide au début.
- Si le caractère d'entrée suivant se trouve dans la chaîne, supprimez-le de la chaîne.
- Si le caractère d'entrée suivant n'est pas dans la chaîne, ajoutez-le à la chaîne.
Affiche l'état final de la chaîne.
Vous pouvez supposer en toute sécurité que l'entrée comprend au moins un caractère (c'est-à-dire non vide), mais rien ne garantit que la sortie n'est pas vide.
Pseudocode (n'hésitez pas à jouer au 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
L'entrée correspond à l'expression régulière ^[A-Za-z]+$
.
Exemples de cas de test:
ABCDBCCBE -> ADCBE
ABCXYZCABXAYZ -> A
aAABBbAbbB -> aAbB
GG -> (empty)
L'entrée peut être donnée de n'importe quelle manière applicable, mais elle doit être traitée comme une chaîne, et la même chose pour la sortie. Le programme ne doit pas quitter avec une erreur.
Le programme le plus court dans chaque langue gagne!
Extra (Facultatif): Veuillez expliquer comment fonctionne votre programme. Je vous remercie.
Réponses:
Haskell ,
4442 octetsEssayez-le en ligne! Edit: -2 octets grâce à Zgarb!
Explication:
La deuxième ligne définit une fonction
(#)
qui prend une chaînes
et un caractèrex
et effectue la suppression ou l'ajout. Ceci est réalisé enfilter
ing sur chaque occurrence dex
ins
, résultant en la chaînez
. Six
ne se produit pas danss
, alorsz
est égal às
etz++[x|z==s]
renvoie la chaîne d'origine avec enx
annexe. Sinon,[x|z==s]
renvoie la chaîne vide et seule la chaîne filtrée est renvoyée.foldl(#)""
est une fonction anonyme qui prend une chaîne et ajoute un caractère après l'autre la chaîne initialement vide""
avec la fonction(#)
.la source
Gelée , 3 octets
Essayez-le en ligne!
Programme complet.
la source
œ^/
ne suffit pas?the input is never empty
Eh bien, maintenant ça marche.J ,
2119 octetsComment ça fonctionne:
=/~
- fait un tableau d'égalité des caractères dans la chaîne:1#.
- somme de chaque ligne par conversion en base 1 (combien de fois la lettre apparaît)~:&.|
- inverser, puis appliquer nub tamis (est le caractère unique) et inverser à nouveau. Ainsi je retrouve les dernières occurrences des caractères de la chaîne:*
- multiplie le compte par 1 pour la dernière position du caractère dans la chaîne, par 0 sinon, calculé par ce qui précède~:&.|
2|
- modulo 2 (met à 0 les positions des caractères qui ont même compté):#~
- copier l'argument de droite, l'argument de gauche. fois (~ inverse les endroits des args)]f # a A
Essayez-le en ligne!
la source
Brainfuck, 95 octets
Essayez-le en ligne
Comment ça fonctionne
la source
Haskell , 47 octets
Un autre dégage la poussière grâce à Bruce Forte.
Essayez-le en ligne!
Prend une liste de chaînes.
La différence symétrique est ennuyeuse ...
la source
++
enregistre 2 octets de plusunion
avec cette méthode.Rétine , 16 octets
Essayez-le en ligne!
la source
R ,
928477 octetsEssayez-le en ligne!
-15 octets grâce à djhurio
Explication
djhurio a fourni une excellente réponse R en évitant une
for
boucle - comme le font instinctivement les programmeurs R (moi y compris). Voici une réponse R qui utilise unefor
boucle (et économise quelques octets dans le processus).x=scan(,'');
- affecter l'entrée dans la variablex
y='';
- créer une chaîne vide dans une variable appeléey
for(i in el(strsplit(x,'')))
- pour chaque caractèrei
dansx
y=c(y[y!=i],if(!i%in%y)i)
- attribuer ày
chaque élément de cey
qui n'est pas égal ài
, en ajoutanti
sii
n'était pas déjà dansy
cat(y,sep='')
- imprimer les éléments dey
sans espace entre euxRemarque
Si vous cliquez sur le lien TIO ci-dessus, vous le trouverez dans l'en-tête
library(methods)
; c'est pour faire face à l'erreur que djhurio a connue concernant lael()
fonction - la fonction est fournie par lemethods
package, qui, dans n'importe quelle version de R que j'ai utilisée, est chargé par défaut, mais pour une raison quelconque, il ne l'est pas par TIO. Silibrary(methods)
est supprimé de l'en-tête etunlist
est remplacé parel
, je gagne quatre octets, mais il en serait de même pour djhurio , en plaçant nos nombres d' octets à9688 et 99 respectivement.la source
for(i in el(strsplit(scan(,y<-''),y)))y=c(y[y!=i],if(!i%in%y)i);cat(y,sep='')
....[[1]]
est plus longel(...)
mais plus court queunlist(...)
, à condition qu'il...
s'agisse d'une liste de longueur 1.0
c'est lenul
caractère et est converti en chaîne vide.MATL , 6 octets
Ne fonctionne pas dans l'environnement TIO, mais fonctionne bien sur l'implémentation MATLAB, et grâce à un nouveau patch, vous pouvez l'essayer sur MATL Online
X~
égalsetxor
ou différence symétrique, qui fait exactement ce que le défi demande. Le reste fait simplement une boucle sur l'entréei"@
et commence avec une chaîne vide en concaténant la pile entière qui est vide au début (merci Luis Mendo).la source
Python 2 , 56 octets
-2 octets grâce à xnor. -3 octets grâce aux ovs.
Essayez-le en ligne!
Je viens de jouer au pseudocode. : P
la source
s=(s+c).replace(c,c[c in s:])
.s=s.replace(c,'')+c[c in s:]
JavaScript (ES6), 60 octets
Cas de test
Afficher l'extrait de code
la source
q , 38 octets
la source
APL + WIN, 19 octets
Logique similaire à la solution J de Galen.
la source
Wolfram Language (Mathematica) , 36 octets
Essayez-le en ligne!
Prend l'entrée et la sortie sous forme de liste de caractères.
Comment ça fonctionne
Utilise
//.
(aliasReplaceRepeated
) pour rechercher deux caractères répétés et supprimer les deux, jusqu'à ce qu'il n'y ait plus de caractères répétés. Si le caractère apparaît plus de deux fois, Mathematica supprimera toujours les deux premières occurrences. Donc, si un personnage se produit un nombre impair de fois, sa dernière instance sera toujours celle qui survivra.la source
Prolog 81 octets
Version non obscurcie:
delete/3
s'assure que son troisième argument s'unifie avec son premier argument, avec toutes les instances du deuxième argument supprimées.append/3
selon son nom, ajoute un élément à la liste.[]
(liste vide), moment auquel le résultat intermédiaire s'unifiera avec le résultat souhaité.Tester:
Certains Prologs traitent les chaînes entre guillemets doubles comme des listes, SWI peut être configuré pour faire de même, mais pour des raisons de simplicité, j'ai utilisé
string_codes/2
pour formater la sortie correctement.la source
Perl 5, 28 + 2 (-pF) = 30 octets
Essayez-le en ligne
la source
R , 84 octets
Essayez-le en ligne!
Une autre solution, mais il y a de meilleures réponses R ici.
R , 88 octets
Essayez-le en ligne!
Merci à Giuseppe pour -7 octets!
Il y a une réponse plus courte de duckmayr .
scan(,"")
lire l'entrée de stdin.y<-el(strsplit(scan(,""),""))
diviser l'entrée par caractères et l'enregistrer sousy
.z=table(y<-el(strsplit(scan(,""),"")))
calculer les fréquences de chaque caractère et enregistrer la table résultante sousz
;unique(y,,T)
prenez des personnages uniques du côté droit.names(z[!z%%2])
sélectionner uniquement les nombres pairs et extraire les noms.setdiff(unique(y,,T),names(z[!z%%2]))
supprimer des caractères avec un nombre pair.cat(setdiff(unique(y,,T),names(z[!z%%2])),sep="")
imprimer la sortie.la source
el()
vient dumethods
paquet, qui, bien que généralement chargé par défaut, ne l'est pas par TIO (discuté dans ma réponse ci-dessous)rev(unique(rev(y)))
? Ne fonctionnerait pas simplementunique(y)
? ooohhh attends je vois, tu veux les personnages uniques de droite à gauche. Dans ce casunique(y,,T)
(le réglagefromLast=T
) sera de 88 octets .Alice , 9 octets
Essayez-le en ligne!
Explication
Fondamentalement, un port de la réponse d' Erik . Mis à part un peu de redirection IP, le code est vraiment juste:
qui fait:
la source
APL (Dyalog) , 16 octets
Essayez-le en ligne!
Si des erreurs avaient été autorisées, cela aurait été de 9 octets:
la source
DOMAIN ERROR
si la chaîne est vide, car(,⍨~∩)
n'a pas d'élément d'identité prédéfini.Pyth , 15 octets
Essayez-le en ligne!
la source
Rubis , 53 octets
Essayez-le en ligne!
L'entrée et la sortie sont toutes deux un tableau de caractères. Testez les appels de code
.chars
et.join
pour plus de commodité.Explication
Utilise le fait que les lettres de la chaîne résultante apparaissent un nombre impair de fois et dans l'ordre de droite à gauche.
la source
Pyth, 13 octets
Prend en entrée la liste des caractères. Testez-le!
la source
Röda , 34 octets
Essayez-le en ligne!
Il s'agit d'une traduction directe du pseudocode. Il traite l'entrée et la sortie comme des flux de caractères.
Explication:
la source
Python 3 , 73 octets
Pas le plus court, mais j'aime cette approche.
Essayez-le en ligne!
Boucle dans la chaîne, en ne gardant que les caractères où:
(s.count(c)%2) == 0
- Le personnage apparaît un nombre pair de fois.(i==s.rfind(c))
- L'index actuel est la dernière apparition du personnage en question.la source
REXX , 102 octets
Essayez-le en ligne!
Comment cela fonctionne: Prenez la lettre la plus à droite, voyez si le nombre d'occurrences est pair ou impair (qui se double également d'une valeur de vérité) et s'il est impair, ajoutez-le à la chaîne de sortie. Supprimez ensuite toutes les occurrences de la lettre de la chaîne d'entrée. Répétez jusqu'à ce que l'entrée soit épuisée.
la source
Perl 5 , 22 + 1 (
-p
) = 23 octetsEssayez-le en ligne!
la source
Java 8, 93 octets
Un lambda de
String
àString
. Juste une implémentation du pseudocode dans la question.Essayez-le en ligne
Java 8, 182 octets
Voici un autre lambda du même type qui utilise des flux! C'est probablement plus efficace.
Essayez-le en ligne
Non golfé
la source
R , 70 octets
Essayez-le en ligne!
J'ai été encouragé par djhurio à publier cette solution; La réponse de djhurio peut être trouvée ici .
Cela utilise la même idée que la réponse de duckmayr , mais il exploite une approche numérique en convertissant la chaîne en ses points de code plutôt que de la diviser en caractères, et est une fonction plutôt qu'un programme complet afin qu'il puisse retourner la nouvelle chaîne plutôt que d'imprimer sur stdout .
Une observation importante est celle qui
F
est initialisée àFALSE
ou0
etutf8ToInt(0)==""
, donc cela réussira pour la chaîne vide ainsi que pour réduire correctement les points de code.la source
PHP, 71 + 1 octets
Exécuter en tant que pipe avec
-nR
ou l' essayer en ligne .la source
Python 3.6 , 69 octets
Essayez-le en ligne!
L'ordre d'insertion des dictés est conservé dans Python 3.6.
la source
SNOBOL4 (CSNOBOL4) ,
9795 octetsEssayez-le en ligne!
la source