Objectif
Le but de ce défi est: étant donné une chaîne en entrée, supprimez les paires de lettres en double, si le deuxième élément de la paire est de capitalisation opposée. (c'est-à-dire que les majuscules deviennent minuscules et vice-versa).
Les paires doivent être remplacées de gauche à droite. Par exemple, aAa
devrait devenir aa
et non aA
.
Entrées et sorties:
Input: Output:
bBaAdD bad
NniIcCeE Nice
Tt eE Ss tT T e S t
sS Ee tT s E t
1!1!1sStT! 1!1!1st!
nN00bB n00b
(eE.gG.) (e.g.)
Hh3lL|@! H3l|@!
Aaa Aa
aaaaa aaaaa
aaAaa aaaa
L'entrée se compose de symboles ASCII imprimables.
Vous ne devez pas supprimer les chiffres en double ou autres caractères non-lettre.
Reconnaissance
Ce défi est l'opposé du "Duplicate & switch case" de @nicael . Pouvez-vous l'inverser?
Merci à tous les contributeurs du bac à sable!
Catalogue
L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) comme une liste des solutions les plus courtes par langue et b) comme un classement général.
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
## Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
## Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 85509; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 36670; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "//api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "//api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(42), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
abB
:?abB
ouab
?abB
devrait sortirab
aa
;aA
;AA
, seule la paire du milieu correspond au motif et devienta
ainsiaa
;a
;AA
Réponses:
Gelée , 8 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
Rétine , 18 octets
Essayez-le en ligne!
Explication
Il s'agit d'une substitution unique (et assez simple) qui correspond aux paires pertinentes et les remplace uniquement par le premier caractère. Les paires sont appariées en activant l'insensibilité à la casse à mi-chemin du motif:
La substitution réécrit simplement le personnage que nous avons déjà capturé dans le groupe de
1
toute façon.la source
Brachylog , 44 octets
Brachylog n'a pas d'expressions régulières.
Explication
la source
C #,
8775 octetsAvec le puissant regex de Martin Ender. C # lambda où se trouvent l'entrée et la sortie
string
.12 octets enregistrés par Martin Ender et TùxCräftîñg.
C #,
141134 octetsC # lambda où se trouvent l'entrée et la sortie
string
. L'algorithme est naïf. C'est celui que j'utilise comme référence.Code:
7 octets grâce à Martin Ender!
Essayez-les en ligne!
la source
Perl,
4024 + 1 = 25 octetsUtilisez le même regex que Martin.
Utilisez le
-p
drapeauTestez-le sur ideone
la source
Python 3,
645958 octetsTestez-le sur Ideone .
la source
C, 66 octets
la source
Pyth,
2420 octets4 octets grâce à @Jakube.
Cela utilise toujours l'expression régulière, mais uniquement pour la tokenisation.
Suite de tests.
la source
JavaScript (ES6),
7168 octetsExplication:
Étant donné
c>'@'
, la seule façonparseInt(c+l,36)
d'être un multiple de 37 est pour les deuxc
etl
d'avoir la même valeur (ils ne peuvent pas avoir une valeur nulle parce que nous avons exclu l'espace et zéro, et s'ils n'ont pas de valeur, l'expression évaluera àNaN<1
laquelle correspond false) est pour eux d'être la même lettre. Cependant, nous savons qu'ils ne sont pas la même lettre sensible à la casse, donc ils doivent être identiques à la casse.Notez que cet algorithme ne fonctionne que si je vérifie chaque caractère; si j'essaye de le simplifier en faisant correspondre les lettres, cela échouera sur des choses comme
"a+A"
.Edit: sauvé 3 octets grâce à @ edc65.
la source
`
s si j'utilisereplace
. (Je les avais seulement avant pour essayer d'être cohérent, mais j'ai ensuite joué ma réponse en la modifiant pour la soumission et je suis redevenu incohérent.)C,
129127125107106105939290888578 bytesPort AC de ma réponse C # . Mon C peut être un peu mauvais. Je n'utilise plus beaucoup la langue. Toute aide est la bienvenue!
a!=b
=a^b
a&&b
=a*b
(c|32)==(d|32)
problème au niveau du bitCode:
Essayez-le en ligne!
la source
f(char*s){while(*s) {char c=*s,d=s+1;putchar(c);s+=isalpha(c)&&d&&((c|32)==(d|32)&&c!=d);}}
s+++1
pour++s
.c
etd
sera toujours ASCII imprimable, donc95
devrait fonctionner à la place de~32
. En outre, je pense quec;d;f(char*s){for(;*s;){putchar(c=*s);s+=isalpha(c)*(d=*(++s))&&(!((c^d)&95)&&c^d);}}
cela fonctionnerait (mais non testé).MATL , 21 octets
Essayez-le en ligne! . Ou vérifiez tous les cas de test .
Explication
Cela traite chaque caractère dans une boucle. Chaque itération compare le caractère actuel au caractère précédent. Ce dernier est stocké dans le presse-papiers K, qui est initialisé
4
par défaut.Le caractère actuel est comparé deux fois au précédent: d'abord sans tenir compte de la casse, puis en respectant la casse. Le caractère actuel doit être supprimé si et seulement si la première comparaison est vraie et la seconde est fausse. Notez que, puisque le presse-papiers K contient initialement 4, le premier caractère sera toujours conservé.
Si le caractère actuel est supprimé, le presse-papiers K doit être réinitialisé (le caractère suivant sera donc conservé); sinon, il doit être mis à jour avec le caractère actuel.
la source
Java 7, 66 octets
Utilisé l'expression régulière de Martin Ender de sa réponse Retina .
Code non testé et testé:
Essayez-le ici.
Sortie:
la source
JavaScript (ES6),
61 octets, 57 octetss=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
Merci à Neil d' avoir économisé 5 octets.
la source
s=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
"code".length
ne savais pas qu'il y avait une séquence d'échappement là-dedans. Merci(code).toString().length
.(code+"").length
JavaScript (ES6) 70
la source
===
?0==""
mais pas0===""
@NeilConvexe, 18 octets
Essayez-le en ligne!
Approche similaire à la réponse Pyth de @Leaky Nun . Il construit le tableau
["aA" "bB" ... "zZ" "Aa" "Bb" ... "Zz" '.]
, joint par le'|
caractère et teste l'entrée en fonction de cette expression régulière. Il faut ensuite le premier caractère de chaque match.la source