Objetivo
O objetivo desse desafio é: dada uma sequência como entrada, remova pares de letras duplicados, se o segundo item do par for de capitalização oposta. (ou seja, maiúsculas se tornam minúsculas e vice-versa).
Os pares devem ser substituídos da esquerda para a direita. Por exemplo, aAa
deve se tornar aa
e não aA
.
Entradas saídas:
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
A entrada consiste em símbolos ASCII imprimíveis.
Você não deve remover dígitos duplicados ou outros caracteres que não sejam letras.
Reconhecimento
Esse desafio é o oposto do "Duplicate & switch case" de @nicael . Você pode reverter isso?
Obrigado por todos os colaboradores da sandbox!
Catálogo
O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](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
deve produzirab
aa
;aA
;AA
, apenas o par do meio corresponde ao padrão e se tornaa
, entãoaa
;a
;AA
Respostas:
Geléia , 8 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Retina , 18 bytes
Experimente online!
Explicação
Essa é uma substituição única (e bastante simples) que combina os pares relevantes e os substitui apenas pelo primeiro caractere. Os pares são correspondidos ativando a distinção entre maiúsculas e minúsculas na metade do padrão:
A substituição simplesmente devolve o personagem que já capturamos em grupo
1
.fonte
Braquilog , 44 bytes
Brachylog não tem expressões regulares.
Explicação
fonte
C #,
8775 bytesCom o poderoso regex de Martin Ender. C # lambda onde estão a entrada e a saída
string
.12 bytes salvos por Martin Ender e TùxCräftîñg.
C #,
141134 bytesC # lambda onde estão a entrada e a saída
string
. O algoritmo é ingênuo. Este é o que eu uso como referência.Código:
7 bytes graças a Martin Ender!
Experimente-os online!
fonte
Perl,
4024 + 1 = 25 bytesUse o mesmo regex que Martin.
Use a
-p
bandeiraTeste em ideone
fonte
Python 3,
645958 bytesTeste em Ideone .
fonte
C, 66 bytes
fonte
Pitão,
2420 bytes4 bytes graças a @Jakube.
Isso ainda usa regex, mas apenas para tokenização.
Suíte de teste.
fonte
JavaScript (ES6),
7168 bytesExplicação:
Dado
c>'@'
, a única maneira deparseInt(c+l,36)
ser um múltiplo de 37 é para ambosc
el
ter o mesmo valor (eles não podem ter valor zero porque excluímos espaço e zero, e se eles não tiverem valor, a expressão avaliaráNaN<1
qual é false) é que eles tenham a mesma letra. No entanto, sabemos que eles não são a mesma letra com distinção entre maiúsculas e minúsculas, portanto devem ser a mesma sem distinção entre maiúsculas e minúsculas.Observe que esse algoritmo só funciona se eu verificar todos os caracteres; se eu tentar simplificá-lo combinando letras, falhará em coisas como
"a+A"
.Editar: salvou 3 bytes graças a @ edc65.
fonte
`
s se usarreplace
. (Eu só tive-los antes de tentar ser consistente, mas então eu golfed minha resposta durante a edição lo para a apresentação e se tornou inconsistente novamente Suspiro ....)C,
129127125107106105939290888578 bytesPorta CA da minha resposta C # . Meu C pode estar um pouco ruim. Eu não uso muito o idioma. Qualquer ajuda é bem vinda!
a!=b
=a^b
a&&b
=a*b
(c|32)==(d|32)
problema bit a bitCódigo:
Experimente online!
fonte
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
para++s
.c
ed
sempre será ASCII imprimível, portanto,95
deve funcionar no lugar de~32
. Além disso, achoc;d;f(char*s){for(;*s;){putchar(c=*s);s+=isalpha(c)*(d=*(++s))&&(!((c^d)&95)&&c^d);}}
que funcionaria (mas não foi testado).MATL , 21 bytes
Experimente online! . Ou verifique todos os casos de teste .
Explicação
Isso processa cada caractere em um loop. Cada iteração compara o caractere atual com o caractere anterior. O último é armazenado na área de transferência K, que é inicializada
4
por padrão.O caractere atual é comparado com o anterior duas vezes: primeiro sem diferenciação de maiúsculas e minúsculas e depois sensível a maiúsculas e minúsculas. O caractere atual deve ser excluído se e somente se a primeira comparação for verdadeira e a segunda for falsa. Observe que, como a área de transferência K contém inicialmente 4, o primeiro caractere sempre será mantido.
Se o caractere atual for excluído, a área de transferência K deve ser redefinida (para que o próximo caractere seja mantido); caso contrário, deve ser atualizado com o caractere atual.
fonte
Java 7, 66 bytes
Utilizou a expressão regular de Martin Ender em sua resposta da Retina .
Ungolfed & código de teste:
Experimente aqui.
Saída:
fonte
JavaScript (ES6),
61 bytes, 57 bytess=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
Agradecimentos a Neil por salvar 5 bytes.
fonte
s=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
"code".length
, não percebi que havia uma sequência de fuga lá. Graças(code).toString().length
.(code+"").length
JavaScript (ES6) 70
fonte
===
?0==""
mas não0===""
@NeilConvexo, 18 bytes
Experimente online!
Abordagem semelhante à resposta Pyth de @Leaky Nun . Ele constrói a matriz
["aA" "bB" ... "zZ" "Aa" "Bb" ... "Zz" '.]
, une-se pelo'|
caractere e testa a entrada com base nesse regex. Depois é preciso o primeiro caractere de cada partida.fonte