Вы также могли бы сделать это с помощью строки.
restart:
g := e->StringTools:-SubstituteAll(StringTools:-CharacterMap("ab","ta",e),"t","abb"):
g("a");
"abb"
g("b");
"a"
g("ab");
"abba"
([email protected]@2)("ab");
"abbaaabb"
subs(["a"=a,"b"=b],StringTools:-Explode(g("ab")));
[a, b, b, a]
f(a) := a,b,b;
f(a) := a, b, b
f(b) := a;
f(b) := a
map(f, [a, b]);
[a, b, b, a]
map(f, %);
[a, b, b, a, a, a, b, b]
F := e->map(f,e):
F([a, b]);
[a, b, b, a]
([email protected]@2)([a, b]);
[a, b, b, a, a, a, b, b]
evalb(subs(["a"=a,"b"=b],StringTools:-Explode(g("ab"))) = F([a, b]));
true
ans1 := CodeTools:-Usage(([email protected]@20)("ab")):
memory used=6.01MiB, alloc change=4.01MiB, cpu time=100.00ms, real time=102.00ms, gc time=0ns
ans1list := CodeTools:-Usage(subs(["a"=a,"b"=b],StringTools:-Explode(ans1))):
memory used=32.00MiB, alloc change=32.01MiB, cpu time=170.00ms, real time=175.00ms, gc time=0ns
ans2 := CodeTools:-Usage(([email protected]@20)([a, b])):
memory used=128.11MiB, alloc change=21.02MiB, cpu time=3.81s, real time=3.82s, gc time=3.46s
evalb(ans1list = ans2);
true
Кроме того, можно написать либо g
или F
жевать большие куски (длиной 2 или 4, и т.д.), и рекурсивно разделить аргумент, и т.д., и даже узнать такие узоры.
Большое спасибо за помощь! Его очень ценят. – Tonardo