There's more than one way to do things PerlMonks

### Comment on

 Need Help??
Here goes, interesting little problem ... my solution is non-recursive, can handle loops and allows to write my @order = demangle(\%replace);.

Update After sleeping over it I've greatly simplified the algoritm, now I think it's elegant. You have to decide yourself if this algorithm is nicer than the rather elegant recursive solution.

```sub demangle {
my \$r = shift;
my %illegal;
@illegal{%\$r} = ();

my @chains;

LOOP:
while (my(\$k,\$v) = each %\$r) {
for my \$c (@chains) {
if (\$c->[-1] eq \$k) {   # append to end of chain
push @\$c, \$v;
next LOOP;
};
if (\$c->[0] eq \$v) {    # prepend to start of chain
unshift @\$c, \$k;
next LOOP;
}
}
push @chains, [\$k, \$v];     # create new chain
}

# fix circular replacements
for my \$c (@chains) {
if (\$c->[0] eq \$c->[-1]) {  # we have a circle
my \$new_key;
do {
\$new_key = join '', map { ('a'..'z')[rand 26] } 1..8;
} while exists \$illegal{\$new_key};
\$illegal{\$new_key}++;

unshift @\$c, \$new_key;
push @\$c, \$new_key;
}
}

my @order;

while (@chains) {
push @order, { map { \$_->[-2] => pop @\$_ } @chains };
@chains = grep @\$_ > 1, @chains;
}

return @order;
}

-- Hofmator

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":

• Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
• Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
• Read Where should I post X? if you're not absolutely sure you're posting in the right place.
• Posts may use any of the Perl Monks Approved HTML tags:
a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
• You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
 For: Use: & & < < > > [ [ ] ]
• Link using PerlMonks shortcuts! What shortcuts can I use for linking?

Create A New User
Chatterbox?
 [shmem]: ☕

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (7)
As of 2018-02-21 09:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
When it is dark outside I am happiest to see ...

Results (276 votes). Check out past polls.

Notices?