Gol
El objetivo de este desafío es: dada una cadena como entrada, eliminar pares de letras duplicados, si el segundo elemento del par es de mayúsculas opuestas. (es decir, mayúsculas se convierte en minúsculas y viceversa).
Los pares deben reemplazarse de izquierda a derecha. Por ejemplo, aAa
debería convertirse aa
y no aA
.
Salidas, entradas:
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
La entrada consta de símbolos ASCII imprimibles.
No debe eliminar dígitos duplicados u otros caracteres que no sean letras.
Reconocimiento
Este desafío es lo contrario de "Duplicate & switch case" de @nicael . ¿Puedes revertirlo?
¡Gracias por todos los contribuyentes de la caja de arena!
Catalogar
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](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
oab
?abB
debería salirab
aa
;aA
;AA
, solo el par medio coincide con el patrón y se conviertea
, entoncesaa
;a
;AA
Respuestas:
Jalea , 8 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Retina , 18 bytes
Pruébalo en línea!
Explicación
Esta es una sustitución simple (y bastante simple) que coincide con los pares relevantes y los reemplaza solo con el primer carácter. Los pares se combinan activando la insensibilidad de mayúsculas y minúsculas a la mitad del patrón:
La sustitución simplemente reescribe el personaje que ya capturamos en el grupo de
1
todos modos.fuente
Brachylog , 44 bytes
Brachylog no tiene expresiones regulares.
Explicación
fuente
C #,
8775 bytesCon la poderosa expresión regular de Martin Ender. C # lambda donde están la entrada y la salida
string
.12 bytes guardados por Martin Ender y TùxCräftîñg.
C #,
141134 bytesC # lambda donde están la entrada y la salida
string
. El algoritmo es ingenuo. Este es el que uso como referencia.Código:
¡7 bytes gracias a Martin Ender!
¡Pruébalos en línea!
fuente
Perl,
4024 + 1 = 25 bytesUsa la misma expresión regular que Martin.
Usa la
-p
banderaPruébalo en ideone
fuente
Python 3,
645958 bytesPruébalo en Ideone .
fuente
C, 66 bytes
fuente
Pyth,
2420 bytes4 bytes gracias a @Jakube.
Esto todavía usa expresiones regulares, pero solo para tokenizar.
Banco de pruebas.
fuente
JavaScript (ES6),
7168 bytesExplicación:
Dado
c>'@'
, la única forma deparseInt(c+l,36)
ser un múltiplo de 37 es para ambosc
yl
tener el mismo valor (no pueden tener valor cero porque excluimos el espacio y el cero, y si no tienen valor, la expresión evaluaráNaN<1
cuál es falso) es para ellos ser la misma letra. Sin embargo, sabemos que no son la misma letra entre mayúsculas y minúsculas, por lo que deben ser iguales entre mayúsculas y minúsculas.Tenga en cuenta que este algoritmo solo funciona si verifico todos los caracteres; si trato de simplificarlo haciendo coincidir las letras, fallará en cosas como
"a+A"
.Editar: Guardado 3 bytes gracias a @ edc65.
fuente
`
s si la usoreplace
. (Solo los tenía antes para tratar de ser coherente, pero luego jugué mi respuesta mientras la editaba para presentarla y volví a ser inconsistente. Suspiro ...)C,
129127125107106105939290888578 bytesPuerto de CA de mi respuesta C # . Mi C puede ser un poco mala. Ya no uso mucho el idioma. Cualquier ayuda es bienvenida!
a!=b
=a^b
a&&b
=a*b
(c|32)==(d|32)
problema bit a bitCódigo:
Pruébalo en línea!
fuente
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
a++s
.c
yd
siempre será ASCII imprimible, por lo que95
debería funcionar en lugar de~32
. Además, creoc;d;f(char*s){for(;*s;){putchar(c=*s);s+=isalpha(c)*(d=*(++s))&&(!((c^d)&95)&&c^d);}}
que funcionaría (pero no probado).MATL , 21 bytes
Pruébalo en línea! . O verificar todos los casos de prueba .
Explicación
Esto procesa cada personaje en un bucle. Cada iteración compara el carácter actual con el carácter anterior. Este último se almacena en el portapapeles K, que se inicializa
4
de forma predeterminada.El carácter actual se compara con el anterior dos veces: primero sin distinción entre mayúsculas y minúsculas y luego con mayúsculas y minúsculas. El carácter actual debe eliminarse si y solo si la primera comparación fue verdadera y la segunda fue falsa. Tenga en cuenta que, dado que el portapapeles K contiene inicialmente 4, el primer carácter siempre se mantendrá.
Si se elimina el carácter actual, el portapapeles K debe restablecerse (de modo que se mantendrá el siguiente carácter); de lo contrario, debe actualizarse con el carácter actual.
fuente
Java 7, 66 bytes
Usó la expresión regular de Martin Ender de su respuesta Retina .
Ungolfed y código de prueba:
Pruébalo aquí
Salida:
fuente
JavaScript (ES6),
61 bytes, 57 bytess=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
Gracias a Neil por guardar 5 bytes.
fuente
s=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
"code".length
, no me di cuenta de que había una secuencia de escape allí. Gracias(code).toString().length
.(code+"").length
JavaScript (ES6) 70
fuente
===
?0==""
pero no0===""
@NeilConvexo, 18 bytes
Pruébalo en línea!
Enfoque similar a la respuesta Pyth de @Leaky Nun . Construye la matriz
["aA" "bB" ... "zZ" "Aa" "Bb" ... "Zz" '.]
, se une por el'|
carácter y prueba la entrada en función de esa expresión regular. Luego toma el primer personaje de cada partido.fuente