数字にノイズを混ぜる

昨日と一昨日やった事。

  • "0123456789"→"7609825431"とかに並び替える
  • 上記並び替えパターン(10*9*8*7*6*5*4*3*2*1=3628800通り)を数値指定する

そんな感じの処理の実装。
流石に全並び替えパターンを網羅する変換テーブル用意するのは非現実的なので、単純に昇順に並べて連番化しました。

"0123456789"……0番目
"0123456798"……1番目
"0123456879"……2番目
"0123456897"……3番目
"0123456978"……4番目
"0123456987"……5番目
"0123457689"……6番目
"0123457698"……7番目
"0123457869"……8番目
"0123457896"……9番目
〜略〜
"9876543201"……3628800-2番目
"9876543210"……3628800-1番目

他の"ABCDEFG"といった文字列相手でも、各"何文字目"を各""とみなし、各桁において"元の文字列の何文字目"を数値と見なして並び替えます。

実際にコード化してみたら、出来上がりが短すぎて拍子抜けしました。
典型的な再帰処理なので、何処かに同じ処理してるコードがあるかもしれませんね。(←つまり車輪の再発明してる可能性有り)

で、使い道は

int n = 589;
int v;
v = n;
System.out.println(v);
int d1[] = { 0, 2, 3, 4, 5, 6, 1, 7, 8, 9 };
int d2[] = { 4, 5, 6, 0, 1, 2, 3, 9, 8, 7 };
int d3[] = { 3, 7, 9, 1, 4, 2, 5, 8, 0, 6 };
int d4[] = { 4, 3, 5, 8, 0, 2, 6, 7, 9, 1 };
v = d4[n % 10000 / 1000] * 1000 + d3[n % 1000 / 100] * 100
		+ d2[n % 100 / 10] * 10 + d1[n % 10 / 1] * 1;
System.out.println(v);

↑みたいな数値変換とかです。
配列の中をアクセスする添え字に上記変換をかけてやって読み込み順をゴチャゴチャさせる用途に使います。