「成分解析」解析結果

 今2ちゃんねるで「成分解析」というソフトがはやってるみたいですね.絶好の解析練習対象なので,やっちゃいました.

 なお,解析結果が正しいとは限りません.結果は自己責任で使ってください(使う人って居るの?w

 (04/04追記)Javaに移植しました.

 (04/06追記)CでCGIにも移植しました.

 (04/15追記)魔界の仮面弁士さんが各種移植版をまとめてくれました!感謝.

 この結果を使った場合,ぜひ私に教えてください.あと情報提供元も明記してくれるとうれしいなとか思ったり.商用利用のときは必ず連絡してください.(しないと思うけどなw)

文字列の変換

まずは,文字列を合成することからはじめる.

長い文字列(Shift-JIS形式)を,4バイトの数値へ変換する.


返したい数値をcodeとする.

また,N=0とする.

  1. 与えられた文字列のNバイト目を取得する.これをstrとする.
  2. strを((N and 3) << 3)だけ左シフトする.
  3. codeに上の結果を足す.
  4. Nに1を足す
  5. 1に戻る

こうして,4バイトの数codeを得る.


種類とパーセンテージの取り出し

種類とパーセンテージを取りだす関数を用いる.この関数をランダム関数と呼ぶことにする.

ランダム関数は後に示す.


[残りのパーセンテージ]に100を代入する

  1. 種類の決定
    1. ランダム関数を用いて得た結果を100で割って余りを求める
    2. その余りが種類である.品物リストは最後に示す.
    3. 今までに得た品物リストと比較し,同じであったらループの最初へ戻る
  2. パーセンテージの決定
    1. ランダム関数を再度用いて得られた結果を[残りのパーセンテージ]で割った余りを求める
    2. それに1を足したものがパーセンテージである.
    3. [残りのパーセンテージ]から上で得た結果を引く.
  3. [残りのパーセンテージ]が0になったら抜ける.でなければ最初に戻る.

なお,残りのパーセンテージが50%の時は,「~の半分は~」になり,残りの種類も50%の時は「~のもう半分は~」になります.100%のときは「~はすべて~」になりますのでご注意ください.


ランダム関数

言葉での説明が辛いので擬似コードで書く.

引数には前回の結果を使う.

初回の引数は「文字列の変換」で得られた数値である.

unsigined int seed = 0; //グローバル変数.
		//初期化には,文字列から変換した数値を使う
unsigned int random(){
	int result;
	seed *= 214013;
	seed += 2531011; // ->次に呼び出されたときのseedに使う
	result = seed;
	result = result >> 0x10;
	result &= 0x7fff;
	return result;
}

ソート関数

結果を得た後,パーセンテージでソートする必要がある.これがそのソート用の関数である.

    public void sort(Element[] elt) {
        for (int i = elt.length - 1; i > 0; i--) {
            int prev = 0;
            for (int j = 1; j <= i; j++) {
                if (!(elt[prev].Parcentage <= elt[j].Parcentage)) {
                    prev = j;
                }
            }
            /*iとprevについて入れ替える*/
            swap(elt, i, prev);
        }
    }

 Javaで書くとこのような感じになる.基本的にバブルソートである.すいませんセレクションソートって言うらしいです.


感想

この解析に二時間以上かかってます.ダメっすよね,うん.

でもまあ,最後まで解析できたということで60点くらいはあげてもいいかなぁ.

ちなみに,

ψ(プサイ)の成分解析結果 : 
ψ(プサイ)の43%は食塩で出来ています。
ψ(プサイ)の36%は血で出来ています。
ψ(プサイ)の18%は厳しさで出来ています。
ψ(プサイ)の2%は真空で出来ています。
ψ(プサイ)の1%は鉄の意志で出来ています。

どうみてもしょっぱすぎです.本当にありがとうございました(何


品物リスト

0x00:下心
0x01:微妙さ
0x02:優雅さ
0x03:華麗さ
0x04:かわいさ
0x05:やさしさ
0x06:やましさ
0x07:やらしさ
0x08:むなしさ
0x09:ツンデレ
0x0a:厳しさ
0x0b:世の無常さ
0x0c:ハッタリ
0x0d:ビタミン
0x0e:努力
0x0f:気合
0x10:根性
0x11:砂糖
0x12:食塩
0x13:愛
0x14:電波
0x15:毒電波
0x16:元気玉
0x17:怨念
0x18:大阪のおいしい水
0x19:明太子
0x1a:勇気
0x1b:運
0x1c:電力
0x1d:小麦粉
0x1e:汗と涙(化合物)
0x1f:覚悟
0x20:大人の都合
0x21:見栄
0x22:欲望
0x23:嘘
0x24:真空
0x25:呪詛
0x26:信念
0x27:夢
0x28:記憶
0x29:鉄の意志
0x2a:カルシウム
0x2b:魔法
0x2c:希望
0x2d:不思議
0x2e:勢い
0x2f:度胸
0x30:乙女心
0x31:罠
0x32:花崗岩
0x33:宇宙の意思
0x34:犠牲
0x35:毒物
0x36:鉛
0x37:海水
0x38:蛇の抜け殻
0x39:波動
0x3a:純金
0x3b:情報
0x3c:知識
0x3e:知恵
0x3e:魂の炎
0x3f:媚び
0x40:保存料
0x41:着色料
0x42:税金
0x43:歌
0x44:苦労
0x45:柳の樹皮
0x46:睡眠薬
0x47:スライム
0x48:アルコール
0x49:時間
0x4a:果物
0x4b:玉露
0x4c:利益
0x4d:赤い何か
0x4e:白い何か
0x4f:鍛錬
0x50:月の光
0x51:回路
0x52:野望
0x53:陰謀
0x54:雪の結晶
0x55:株
0x56:黒インク
0x57:白インク
0x58:カテキン
0x59:祝福
0x5a:気の迷い
0x5b:マイナスイオン
0x5c:濃硫酸
0x5d:ミスリル
0x5e:お菓子
0x5f:言葉
0x60:心の壁
0x61:成功の鍵
0x62:理論
0x63:血

VBSに移植したい

 という質問があったので,以下に回答を載せて起きます.

 合ってるかどうかは分からないので,間違ってたら教えてください(最上位ビットのあたりとかアヤシス)

ψ(プサイ)さんすごいっす
実はうちの会社でも流行ってまして、ASP+VBSで実現
しようと思っています
ψ(プサイ)さんの解析Blogみてチャrネジしているのですがまったく実現できません。
「strを{(n and 3)*8}だけ左シフトする. 」を
VBでどう実現すればとか・・・・結構つまずいてます
何かよきアドバイスとかしてもらえるとうれしいです。

 ありがとうございます.


VBSはよく分からないんですが,Cで書くと

 code += str << ((n & 3) << 3);

って感じです.VBSにはシフトが無いみたいなので,2の累乗を計算するルーチンは必須だと思います.


 あと,VBSには符号なし整数の型が無いっぽいので,(Javaにも無いです^^;)基本的には数値は全部longで持っていて,計算を行うごとに0xffffffff(fが8コ)をandしてそれを使ってください.

 符号アリでやってると掛け算の結果,最上位ビットが1になってマイナスになっちゃう時が(たぶん)あるので,それを防ぐためです.

 が,Javaでやった時,なぜか9ケタ目が残っちゃったんで,32回左シフトして32回右シフトする事によって4バイト分取り出せたんですが,VBSで掛け算でシフトしたら結果がマイナスになる事もありそうな気がします.

 あとstrを取得するときに,Byteをそのまま使っちゃダメです.0より小さいときは128を足して,long型に代入して使ってください.

トラックバック(3)

トラックバックURL: http://ledyba.ddo.jp/mt/<DELETE THIS>mt-trackbacks.fcgi/83

脳内観測 - コトバノチカラ - 成分解析もどき for W-ZERO3 (2006年4月20日 17:01)

最近有名な成分解析を強引にW-ZERO3でDelphiで移植? ちなみにあくまで『もどき』ですので、よろしく。 原作?制作者のClock氏に敬意をはらいま... 続きを読む

つらいこととわからないことのはきだめ - [programing] 成分解析をパクってみた (2006年5月 1日 00:30)

[http://tekipaki.jp/~clock/software/:title=成分解析]がはやっているのは知っていたが, それを[http://... 続きを読む

「成分解析」研究室に、 ドラクエ8モンスター度チェックを掲載していただきました。 「成分解析」研究室では、成分解析系プログラムのリンク集やロジック... 続きを読む

コメント(45)

掲示板から飛んできました。

すばらしい!と思いました。よくここまで解析したなぁ。と。
成分のリストについてはEXEファイル直接開けばわかりそうなものですが、乱数の生成ルーチンを算出してるのが凄いと思います。

ちなみに、私はヘタレなのでVC++のsrand()関数使ってますけど(苦笑

 ありがとうございます.
ランダム関数は,srand使ってたんですね.気づきませんでした.
 これ以上複雑だったら,多分挫折していたような気が・・・^^;

ということでこちらに書き込みました
ちなみに掲載してくれた内容で確認があります

「strを{(n and 3)*8}だけ左シフトする. 」
をCでかくと
code += str << ((n & 3) << 3);
となっていますが、最後の「3」は「8」ではないのでしょうか?

たびたびすいません
AspだとJavaScriptも使えるので
まずはこっちの方が実現しやすいかなと思いましてこちらで作成しているところです。
が最初の
>まずは,文字列を合成することからはじめる.
>長い文字列を,4バイトの数値へ変換する.
からさっそくつまずいています。
私がかいたコードですがうまくいきません。
まったく違っているような気が「length」で値がとれないのと「substr」がないといわれてしまいます。
なんか基本的な質問ですいません。
まったくやり方が違う等何かありましたらコメントをお願いします。
for(n=0;n<=str.length-1;n++)
{
buf = str.substr(0,n);

code += buf << ((n & 3) << 8);
}

> 「strを{(n and 3)*8}だけ左シフトする.
> をCでかくと
> code += str となっていますが、最後の「3」は「8」ではないのでしょうか?

code += str AspだとJavaScriptも使えるので
> まずはこっちの方が実現しやすいかなと思いましてこちらで作成しているところです。

JavaScriptは型のサイズが分からない(そもそもそういう概念が無い)みたいなので,こちら32回左シフト,また32回右シフトで下4バイトを取り出すことは・・・多分無理ですね.と思っていたら,単に0x100000000で割った余りを使えば簡単に取り出せました(苦笑


> 私がかいたコードですがうまくいきません。
> まったく違っているような気が「length」で値がとれないのと「substr」がないといわれてしまいます。

ASPってサーバサイドですよね?
インタプリタの設定を見直してください.

> なんか基本的な質問ですいません。
> まったくやり方が違う等何かありましたらコメントをお願いします。

こうですね.
for(n=0;n<=str.length-1;n++)
{
buf = str.charCodeAt(n);

code += buf << ((n & 3) << 3);
}
code %= 0x100000000;
一文字だけ取り出すのと,あとはシフトの問題です.
http://www.tohoho-web.com/js/string.htm#charCodeAt
これで文字を数値に変換しています.
なお,2バイト文字を1文字と数える処理系でしたら,コードが0x100以上なら2つに分けたりとか,ちょっと面倒になります・・・.
 あと,上のコードでは書いてないんですが,0未満だったら128を足す処理も必要です.

> AspだとJavaScriptも使えるので

JavaScript ではなく、JScript ですよね。


> まずはこっちの方が実現しやすいかなと思いまして

どちらでも実装可能ですが、個人的には、VBScript の方が簡単でした。
VBScript なら、Asc 関数で Shift_JIS のコードを得られるのですが、JScript の
String.charCodeAt() は Unicode を返すため、まず、コード変換の処理が必要に
なってしまうからです。(私は、ADODB.Stream でコード変換させました)

 あ,charCodeAt()はUNICODEでしたか・・・確かめずに適当に書いてすいません・・・.
http://www2.wbs.ne.jp/~kanegon/doc/code.txt
こんなのもあったので参考にしてください>Xさん

>どちらでも実装可能ですが、個人的には、VBScript の方が簡単でした。
>VBScript なら、Asc 関数で Shift_JIS のコードを得られるのですが、JScript の
>String.charCodeAt() は Unicode を返すため、まず、コード変換の処理が必要に
>なってしまうからです。(私は、ADODB.Stream でコード変換させました)
個人的には VBScript の方が簡単でしたってψ(プサイ)は、VBScriptでも成分解析作られたのですか?
オレは、プログラム歴短いのでまったく進まなかったのでJscriptにしました。
でもJscriptでも一向に完成できずにいますorz

魔界の仮面弁士さんありがとうございます
参考にさせていただきます

ψ(プサイ)さんお疲れ様です。
魔界の仮面弁士さんにサンプルソースを公開していだきそれで実現することができました。
そのソースをみさせていただくとわからないことが結構あって、このサイトだけを参考にして自力で作るのは無理でした
魔界の仮面弁士さんには感謝感謝です。
ψ(プサイ)さんにもいろいろご教授いただきありがとうございましたm(_ _)m

http://www.vb-user.net/junk/analyze/JScript/analyze.asp
こちらですか.
どんどん他環境に移植されてるみたいですね.プログラミング練習用として一般化したら面白そうw
/*
ソースコード付きですか・・・.
私にはソースコードを公開なんてできっこない(目に毒w)ですよ・・・orz
*/

Ψさん、はじめまして。
Palmなお部屋のmizuno-amiと言います。
「成分解析」のPalm版を作ろうと思い、Clockさんにお問い合わせしたところ、こちらの解析結果を紹介していただきました。

NS Basic/Palmの制約の中、悪戦苦闘しながら、何とか動く物が完成しましたので、ご報告に参りました。
近いうちに公開したいと思います。

解析結果、とても参考になりました。ありがとうございました。

ご報告ありがとうございます.
Palm版までついにできてしまいましたか!(笑
ソートに関しても解析したので,もしも同じパーセンテージの時に並びが少し違うようでしたら試してみてください.

#今度移植版をすべてまとめてみる予定です(w

> ソートに関しても解析
おぉっ、流石!

でもこれって bubble sort では無く、selection sort ですよね。

bubble だとしたら、同順の場合の順番は変化しないはずですし。

> #今度移植版をすべてまとめてみる予定です(w
あ、同じ事考えてました。(^^;
他にも幾つかの言語に移植したので、ソート結果を反映させたら公開します。

Ruby版探してたのですが、見つかんなかったので書いて見ました。

解析情報がなかったら書く気は出てこなかったと思います。
ありがとうございました。

>魔界の仮面弁士さん
すいませんよく分かんないのに「バブルソート」とか適当に言ってました_| ̄|○
直しておきました.

>とみんたさん
ご報告ありがとうございます.
拝見させていただきました.
ソートに関しても解析したので試してみてください.
#あえて順番をオリジナルと変えて,自分のプログラムを使ったと分かる様にするというのもアリかもしれませんがw

掲載が遅れてすいません.
まとめ乙です.
結構あるもんですねぇ.

はじめまして、そら。と言います。

私もここの解析結果を参考にPerlで作ってみました。

ここにUPしてあります。
http://www23.tok2.com/home/freespace/

いくつか解析を試して、オリジナルと同じ結果になっていると思います。

ψ(プサイ)さん、よく解析しましたね。
凄いです。

えー、CGI版の他に、Mac OSX10.4ダッシュボードのWidget版を作ってみました。(解析部分は同じ物です)

どなたか試してもらえるとうれしいです(^^ゞ

Widget版も探したのですが、ありそうでないもんですね。

みなさん乙です.
>>そら。さん
どうもご報告ありがとうございます.
そういえば今までPerlCGI版が無かったのが不思議ですねw
>>とみんたさん
これでMacOS専用版も出来た訳ですね!
すいませんが私は試せません^^;

現在PocketPC版を作ってます。

Pascalコードになるかなぁ?

http://blog.goo.ne.jp/marts_ishikawa/e/0c08809e2578393fd1c9fa3836bb65fc

はじめまして。
仲間内で遊ぶために、成分の項目を入れ替えたいなあと思い、調べているうちにここにたどり着きました。

素晴らしいプログラム解析結果ですね。

参考にして、早速Pythonでも書いてみました。

http://swan.hobby-site.com/neta/seibun/seibun.cgi

同率の場合のソート順が違ったり(比率+文字コードになってしまっている)しますが、ほぼ同じ結果を得られました。

ありがとうございました。

ψ(プサイ)さん、はじめまして。成分の多段解析を行う
「成分解析-Z」というページを作っていますCKと申します。
http://c-kom.homeip.net/cgi-bin/megaton/seibunz.cgi
ψ(プサイ)さんの解析情報を知り、本日からこちらと同じルーチンを使うように
変更させて頂きました。本当に素晴らしい情報をありがとうございます。m(_ _)m

P.S. パーセンテージの決定の部分でかなり頭を悩ませてしまいました・・・。
「[残りのパーセンテージ]で割る」のところは「余り」を求めるのですね。

>>まささん
>>カトーさん
皆さん報告ありがとうございます.
>>CKさん
あ,そうですよね.
間違いです.直しておきます・・・.

なぜかわからないんですが、「魑魅魍魎」を分析すると私の書いたPocketPC版が結果がおかしくなります。現在格闘中。

返信が遅れてすいません.
>>まささん
今試したら,文字列変換後の数値は
0x568065d2
みたいです.参考にしてください.

C#で何となくWindows Applicationを作ってみました。

一応、難読化処理はしてみましたが、コードの醜さがモロバレですね(笑)

報告ありがとうございます.
自分もJava版の難読化処理した方が良いですね.Javaって恐ろしく逆コンパイルが容易ですから・・・.

ψ(プサイ)さん、はじめまして。saiki と申します。

このページの内容を参考に「成分解析」を Mac OS X に移植させていただきました。

N=1 から始まるブロックで、((n and 3) << 3) の n が小文字なのと、文字コードが分からなかったのが躓きましたが、他は丁寧な解説のおかげでスムーズに作業できました。ありがとうございました。

報告ありがとうございます.
分かりづらいところを修正しておきました.

ψ(プサイ)さんの情報を元にPukiWikiのPlug-in版を作成してみました。

成分解析の解析情報のおかげで有意義なひととき(というかPHPとの戦い)をさせて頂きました。

貴重な情報の整理と解説ありがとうございました。

初めまして, Kif と申します.

今回, この解析結果を読んで, JavaScript にて移植させていただきました.文字コード関係の扱い等, 色々, 楽しめました. JavaScript なので, ある程度, 難読化処理は行っておきましたが, これで公開しても良いか多少不安です.

ψ(プサイ)さん, 解析ご苦労様です. おかげで, 手元で動くかす, また違った感動を手に入れました. 情報提供元は友人からということで報告しておきます.

# 公開先はトラックバックを送らせて頂きました.

私のCloneは同率成分の出力結果が非互換でした。焦りました(^_^;

早速、ソートを修正して完全互換にしました。

ついでに成分解析の部分をDLL化しました(笑)

 みなさん報告ありがとうございます.
 PHPやJavaScriptといったインタプリタ言語でも難読化って出来るんですね・・・.知りませんでした.
> Takuchanさん
 日常言語の「N番目」って,配列だと[N-1]に格納されてるんですよね^^;
> Kifさん
 やっぱり動いたときの嬉しさは格別ですよね.
 難読化(多分暗号化?)をしても,復号を行うソースが入ってるので戻そうと思えば戻せますが,そんな事をする人間ならオリジナル版をすでに解析してると思うので大丈夫だと思います(笑
/*
っていうかなんで難読化処理が必要なんですかね.
アルゴリズムは割れてるのに.
*/
> Alanisさん
 完全互換乙です.

 DLLw
 うちのJava版もうまくすると解析部のクラスだけ別プログラムに流用できたりします(笑

> また,N=1とする.
あれ。「n = N - 1」だと思っていました。(汗)

配列が0ベースか1ベースかは別にしても、
> strを((n and 3)<<3)だけ左シフトする.
については、開始点は n=0だと認識していたので。


> っていうかなんで難読化処理が必要なんですかね.
元々は難読化が必要なのではなく、ソース"全文"の公開が駄目というだけでした。

ただ、ClockさんはJavaや.NET、あるいはスクリプト言語の事に付いては
言及されなかったので、難読化もすべきかな、と私が勝手に定めた次第です。


> アルゴリズムは割れてるのに.
Clockさん自身も、それはごもっともな意見だと認識されているようで。^^;

それでも全文公開に難色を示された理由は……私の口から述べるわけには
いかないのですが(すみません)、現時点では、Clockさんに迷惑をかけないための
処置だと御理解頂ければ幸いです。


# ところで、誰か秀丸マクロの難読化ソフト知りませんか?(汗

久々にのぞいてみたら・・saikiさんに先を越された事を知ってしまいました。

実は、OSX10.3(ダッシュボード搭載前)でも使えるように、GUIのフロントエンド作ってました。

出来たと報告に来たつもりだったのに・・。

せっかく出来たので公開しちゃいます。saikiさんとかぶってしまうなぁ・・

携帯メール版成分解析:
http://blog.niwango.jp/article/17297568.html

これの解析結果ページをよく見ると、一番下に
『(C)Clock』という表記がありますね。

# 解析アルゴリズムは異なるのかな?

『765』を解析した時の並び順が違っているような気がします…。

# 解析結果の一覧表、全面改訂しないとまずいかな。(汗

>とみんたさん
どうも報告ありがとうございます.

> 魔界の仮面弁士さん
あ,確かにn=N-1としないと,逆に結果が違いますね^^;
直しておきます・・・.
#0番目の文字って言ったら先頭の文字って思いますよね,多分・・・.
ソースに関しては了解です.何か事情があるようですね.

>765の解析結果
あれ?確かに違いますね^^;
数日以内に調べてみますーー;
どうもすいません・・・.
#実はソート中にほかにも色々コードがあったんですけど関係ないと思って飛ばしてました(ぁ

>ソート
Clockさんに聞いたら、qsort関数一発なんだそうで。
…という事は、クイックソート?

でも、JScriptのArray.Sort()では異なる結果になった気がするのだけれど。はてさて。

情報ありがとうございます.
http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/quick-sort.html
これですか.今ちょっとコードを眺めてきましたが,たしかにこれっぽいですね.
セレクションソートと組み合わせてるみたいですけど.

#標準ライブラリって解析しちゃっていいのかなぁ^^;

初めまして。
解析結果、すばらしいですね。
携帯用としてとりあえず CGI (perl only) 版を組んでみました。ソートに関しては qsort をそのまま使ってますので完全互換ではございません。
http://www.morich.info/m/buffalin/

初めて?の perl で CGI プログラムでしたが、教材?として最高に楽しませていただきました。

[ソースの件]
契約交渉が完了して、ソースコードの公開が自由化されたとのことです。

なので、難読化等はしなくても良くなった、という報告を Clock さんより受けました。


[ソートの件]
qsort使っても同じ結果にならない…。
悔しいなぁ。

はじめまして。keikyuと申します。
現在成分解析 まとめWikiを作成しているのですが、このサイトをリンクしていいでしょうか?

コメントする

月別 アーカイブ

2009年
2008年
2007年
2006年

最近のコメント

Powered by Movable Type 4.23-ja