Remove duplicated & switched case
Jelly, 8 bytes
ṛŒsḟḟȧµ\
Try it online! or verify all test cases.
How it works
ṛŒsḟḟȧµ\ Main link. Argument: s (string)
µ Convert all links to the left into a chain (unknown arity) and begin a
new chain.
\ Do a cumulative reduce by the chain to the left.
Left argument: r (previous result or first character)
Right argument: c (next character)
ṛ Set the return value to c.
Œs Swap c's case.
ḟ Remove c from r (if present).
This yields an empty string if c and r are identical (repeated letter
with the same case or non-letter) and r otherwise.
Note that r will be empty if the previous character has been removed.
ḟ Remove the resulting characters (if any) from c with swapped case.
This yields c with swapped case if the result to the right does not
contain c; otherwise, it yields the empty string.
ȧ Flat logical AND with c.
Replace swapped case c with c; do not modify an empty string.
Retina, 18 bytes
(.)(?!\1)(?i)\1
$1
Try it online!
Explanation
This a single (and fairly simple) substitution which matches the relevant pairs and replaces them with only the first character. The pairs are matched by activating case-insensitivity halfway through the pattern:
(.) # Match a character and capture it into group 1.
(?!\1) # Use a negative lookahead to ensure that the next character *isn't* the same
# as the character we just captured. This doesn't advance the position of the
# regex engine's "cursor".
(?i) # Now activate case-insensitivity for the remainder of the pattern.
\1 # Match the second character with a backreference to the first. With the i
# modifier activated, this will match if the two characters only differ
# by case.
The substitution simply writes back the character we already captured in group 1
anyway.
C#, 87 75 bytes
s=>System.Text.RegularExpressions.Regex.Replace(s,@"(.)(?!\1)(?i)\1","$1");
With the mighty regex from Martin Ender. C# lambda where the input and the output are string
.
12 bytes saved by Martin Ender and TùxCräftîñg.
C#, 141 134 bytes
s=>{var r="";for(int i=0,l=s.Length;i<l;i++){var c=s[i];r+=c;if(char.IsLetter(c)&i+1<l&&(c|32)==(s[i+1]|32)&c!=s[i+1])i++;}return r;};
C# lambda where the input and the output are string
. The algorithm is naive. This is the one I use as reference.
Code:
s=>{
var r = "";
for(int i = 0; i < s.Length; i++)
{
r+=s[i];
if (char.IsLetter(s[i]) & i+1 < s.Length)
if (char.ToLower(s[i])==char.ToLower(s[i+1])
& char.IsLower(s[i])!=char.IsLower(s[i+1]))
i += 1;
}
return r;
};
7 bytes thanks to Martin Ender!
Try them online!