Advent Calendar 2021
| Day 17 | Day 18 | Day 19 |
The gift is presented by Andrew Shitov. Today he is talking about his solution to “The Weekly Challenge - 092”. This is re-produced for Advent Calendar 2021 from the original post by Andrew Shitov
.
Task #1: Isomorphic Strings
You are given two strings $A
and $B
.
Write a script to check if the given strings are Isomorphic
. Print 1
if they are otherwise 0
.
OK, so if the two strings are isomorphic, their characters are mapped: for each character from the first string, the character at the same position in the second string is always the same.
In the stings abc
and def
, a
always corresponds to d
, b
to e
, and c
to f
. That’s a trivial case. But then for the string abca
, the corresponding string must be defd
.
The letters do not need to go sequentially, so the strings aeiou
and bcdfg
are isomorphic too, as well as aeiou
and gxypq
. But also aaeeiioouu
and bbccddffgg
, or the pair aeaieoiuo
and gxgyxpyqp
.
The definition also means that the number of different characters is equal in both strings. But it also means that if we make the pairs of corresponding letters, the number of unique pairs is also the same, right? If a
matches x
, there cannot be any other pair with the first letter a
.
Let’s exploit these observation:
sub is-isomorphic($a, $b) {
+(([==] ($a, $b)>>.chars) &&
([==] ($a.comb, $b.comb, ($a.comb Z~ $b.comb))>>.unique));
}
First of all, the strings must have the same length.
Then, the strings are split into characters, and the number of unique characters should also be equal. But the collection of the unique pairs from the corresponding letters from both strings should also be of the same size.
Test it:
use Test;
# . . .
is(is-isomorphic('abc', 'def'), 1);
is(is-isomorphic('abb', 'xyy'), 1);
is(is-isomorphic('sum', 'add'), 0);
is(is-isomorphic('ACAB', 'XCXY'), 1);
is(is-isomorphic('AAB', 'XYZ'), 0);
is(is-isomorphic('AAB', 'XXZ'), 1);
is(is-isomorphic('abc', 'abc'), 1);
is(is-isomorphic('abc', 'ab'), 0);
If you have any suggestion then please do share with us perlweeklychallenge@yahoo.com.