Labyrinth, 31 bytes
Not as short and neat as Sp3000's solution, but I thought I'd post this anyway as a different approach:
"" @
,, :{"
) { $;
*"})";.
""
Explanation
The first loop is implysimply
""
,,
which reads in two characters at a time (the "
are no-ops). After EOF, ,
will return -1
, but only check for EOF at every second character. That means in any case the top of the stack will then be -1
and the value below is either -1
or some character code that we don't care about, because it's an unpaired coin toss.
Then )*
turns the -1
and the value below into a single 0
which we need a) to get rid of those two values and b) to enter the next loop correctly. That next loop is simply
"}
""
Which shifts all the values over to the auxiliary stack. This is necessary because we want to start processing the pairs that we read first. Now the final loop:
:{"
{ $;
)";.
The )
just increments some dummy value to ensure that it's positive and the instruction pointer turns north. {
pulls over the first digit of the next pair and :
duplicates it. Now when we're done processing, this will have been a 0
from the bottom of the auxiliary stack. Otherwise it's either 48
or 49
. In case of a zero, we exit the loop and terminate on @
, otherwise, the IP turns east.
{
pulls over the other digit of the current pair. $
takes the XOR between them. If that is 0, i.e. the two are equal, the IP just continues moving south, ;
discards the zero, and the IP turns west into the next iteration. If the XOR was 1
, i.e. they were different, the IP turns west, discards the 1
with ;
and prints the first digit with .
.