function rearrange(values, indexes) {
main_loop:
for (var start = 0, len = indexes.length; start < len; start++) {
var next = indexes[start];
for (; next != start; next = indexes[next])
if (next < start) continue main_loop;
next = start;
var prev = start;
var tmp = values[start];
do {
prev = next;
next = indexes[next];
tmp = [values[next], values[next] = tmp][0]; // swap
} while (next != start);
}
return values;
}
var vs = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
var is = [17,4,8,9,11,19,25,3,10,24,0,6,1,12,7,15,18,22,13,23,2,14,5,16,20,21];
print(rearrange(vs, is))
ZnVuY3Rpb24gcmVhcnJhbmdlKHZhbHVlcywgaW5kZXhlcykgewogICAgbWFpbl9sb29wOgogICAgZm9yICh2YXIgc3RhcnQgPSAwLCBsZW4gPSBpbmRleGVzLmxlbmd0aDsgc3RhcnQgPCBsZW47IHN0YXJ0KyspIHsKICAgICAgICB2YXIgbmV4dCA9IGluZGV4ZXNbc3RhcnRdOwogICAgICAgIGZvciAoOyBuZXh0ICE9IHN0YXJ0OyBuZXh0ID0gaW5kZXhlc1tuZXh0XSkKICAgICAgICAgICAgaWYgKG5leHQgPCBzdGFydCkgY29udGludWUgbWFpbl9sb29wOwoKICAgICAgICBuZXh0ID0gc3RhcnQ7CiAgICAgICAgdmFyIHByZXYgPSBzdGFydDsKICAgICAgICB2YXIgdG1wID0gdmFsdWVzW3N0YXJ0XTsKICAgICAgICBkbyB7CiAgICAgICAgICAgIHByZXYgPSBuZXh0OwogICAgICAgICAgICBuZXh0ID0gaW5kZXhlc1tuZXh0XTsKICAgICAgICAgICAgdG1wID0gW3ZhbHVlc1tuZXh0XSwgdmFsdWVzW25leHRdID0gdG1wXVswXTsgLy8gc3dhcAogICAgICAgIH0gd2hpbGUgKG5leHQgIT0gc3RhcnQpOwogICAgfQogICAgcmV0dXJuIHZhbHVlczsKfQoKdmFyIHZzID0gWyJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiJdOwp2YXIgaXMgPSBbMTcsNCw4LDksMTEsMTksMjUsMywxMCwyNCwwLDYsMSwxMiw3LDE1LDE4LDIyLDEzLDIzLDIsMTQsNSwxNiwyMCwyMV07CgpwcmludChyZWFycmFuZ2UodnMsIGlzKSk=