ZRCola/bin/CanoPerm.wsf
Simon Rozman 47d3884af3 Update Copyright and build year
Signed-off-by: Simon Rozman <simon@rozman.si>
2022-01-07 11:38:32 +01:00

94 lines
2.7 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!--
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2017-2022 Amebis
-->
<package>
<job id="CanoPerm">
<runtime>
<description>Generates character index permutations - Amebis, Copyright © 2017-2022</description>
<unnamed name="&lt;Pattern&gt;" required="true" helpstring="Cannonical form (X=unmoveable character; 0-9=moveable character, characters of the same number must preserve global order of appearance; maximum 10 characters)"/>
<example>
Example:
CanoPerm.wsf &quot;X01112&quot;
</example>
</runtime>
<script language="JScript"><![CDATA[
if (WScript.Arguments.Unnamed.Length < 1) {
WScript.Arguments.ShowUsage();
WScript.Quit(1);
}
var
pattern_src = WScript.Arguments.Unnamed(0),
pattern = new Array();
// Parse pattern.
for (var i = 0, n = pattern_src.length; i < n; i++) {
switch (pattern_src.charAt(i).toUpperCase()) {
case 'X': pattern.push(new Character(-1, i)); break;
case '0': pattern.push(new Character( 0, i)); break;
case '1': pattern.push(new Character( 1, i)); break;
case '2': pattern.push(new Character( 2, i)); break;
case '3': pattern.push(new Character( 3, i)); break;
case '4': pattern.push(new Character( 4, i)); break;
case '5': pattern.push(new Character( 5, i)); break;
case '6': pattern.push(new Character( 6, i)); break;
case '7': pattern.push(new Character( 7, i)); break;
case '8': pattern.push(new Character( 8, i)); break;
case '9': pattern.push(new Character( 9, i)); break;
default:
throw new Error("Character '" + pattern_src.charAt(i) + "' is not a valid pattern character. Only 0-9 and X are allowed.");
}
}
var output = "";
Permutate(pattern, "");
WScript.Echo(output);
function Character(grp, idx)
{
this.group = grp;
this.index = idx;
return this;
}
function Permutate(pattern, prefix)
{
var n = pattern.length;
if (n) {
if (pattern[0].group < 0) {
// Unmoveable character.
var c = pattern.shift();
Permutate(pattern, prefix + c.index);
} else {
var found = new Array();
for (var i = 0; i < n; i++) {
var c = pattern[i];
if (c.group < 0) {
// Unmoveable character.
break;
} else {
if (!(c.group in found)) {
var p = pattern.slice(0);
p.splice(i, 1);
Permutate(p, prefix + c.index);
found[c.group] = true;
}
}
}
}
} else {
// This is the end.
output += (output.length ? "," : "") + prefix;
}
}
WScript.Quit(0);
]]></script>
</job>
</package>