Mr.Border [要素を区切る要素の存在]

スクリプト言語を使うプログラマーの私的日常。
多くの事に慣れられない不器用な人間が書く駄文集。

進数変換

2009-09-17 06:20:14 | Weblog
n進数をy進数に変換する際、一度10進数にするとJavaScriptの場合オーバーフローする場合がある。

だから、n進数→10進数→y進数と完璧に処理を区切ってしまうんじゃなく、任意の桁数ずつ変換してやり、10進数にした時の値が大きくなり過ぎてしまわないように注意しないといけない。

任意の桁数ずつとは具体的には何桁なのかと言うと、「n^x > y」が true になる時「x」桁。
n進数 を 0乗 から x乗 の桁まで読み込み、それを 10進数 を経由して y進数 に変換してやればいい。
10進数に変換した時の値が 基数y 以上ならば、10進数の値から y を引いた後の値を y進数 に変換し、y進数の次の桁に1を加えればいい。

分かってみれば超単純明快な話だった。
ていうかRangeCoderでも同様の事やってるし。


分かったけど……プログラム書く時間が無い。
凄い簡単な物だから10分あれば書けるかもしれんが……
今はまだ出来ない。仕事溜めすぎたな。。
まぁ、溜めるのも悪いんだけど、やらなきゃいかん仕事が増えるペースが速すぎるのも問題あると思う。いや、こりゃ言い訳だが。

基数変換プログラム

2009-09-12 13:34:17 | Weblog
我慢しきれなくて、資料作成の合間にちょこっと考えちゃったんだが、基数変換ってどうすればいいんだろう。

今まで思い描いてたイメージだと以下の流れで基数変換するつもりだった。

・文字列を先頭から終端まで一文字づつ調べながら、使用されている文字の種類と頻度をリストアップし、さらに文字をインデックス番号に変換した配列を作成。
・使用頻度の高い文字列が連続する部分の先頭位置を記憶して、そこから符号化を開始。そこより前の文字列は文字列の終端に移動させる。
・文字対インデックス番号の対応表を、出現頻度順に並べ替えて、出現頻度が高い文字ほど小さい番号が割り振られるように変換。
・最初の文字列走査時につけたインデックス番号と、頻度順に並べ替えた後のインデックス番号を変換する関数を作成
・インデックス番号が格納された配列の要素「length-1」から「0」まで順番にアクセスし、インデックス変換関数で各桁の数値を変更してから桁の重みとの積を求めて、10進数に変換していく
・10進数に変換したら、今度は64進数に変換する。
・出現頻度順に並べ替えた文字種リストと64進数、それから符号化を開始したインデックス番号を最終的な出力として、符号化終了


で、そんな事をするプログラムを書いてみて思った通りの動作をしてくれた。
ちなみに書いたのは今じゃない。2週間くらい前。趣味のプログラム書ける時間は今はない。

だがこの処理には問題があって、文字種が多くなると当たり前だが指数爆発が起きてあっと言う間にオーバーフローする。
文字種が少なくても文字列の長さが長ければやっぱりオーバーフローする。

ならば、また巨大整数演算用関数を使えば?って話になるんだが、処理効率の問題もあるので、10進数に変換する処理を省きたい。

例えば36進数からいきなり64進数とか、256進数とかに変換したい。
2,4,8,16,32進数なら中継なしの相互変換が可能だし加減算も簡単なんだけど、綺麗に桁が揃わない基数の組み合わせだと、どうやりゃいいのか……教えて偉い人。俺がヒマな時に。



……2,4,8,16,32進数なら中継なしの相互変換が出来るって思ってたけど、JavaScriptでやると結局文字列か10進数のどちらかの状態を中継しないと変換できない気がした。今。
だったら10進数を中継してもいいのかな……メンドクセ

病気?

2009-09-12 12:49:17 | Weblog
高校時代に「気がついたら学校に居た」という事が何回かあった。
普段なら、自宅で起床して朝食を食べて、身支度をして自転車に乗り学校に登校してクラスメートと喋りながら授業を受ける用意をして───と言う部分が思い出せるのに、思い出せない時───目が覚めてから学校に登校するまでの間の記憶がスッポリ消えちゃってる時があった。

それが再び起きたのだと思うんだが


4時頃までPCの前で眠い目こすりながら、会社で使う資料を作成していた俺は、


9時に目が覚めた時にはベッドの上に居た。


ベッドに移動した記憶がまるで無いんだが……。
PC使ってて寝落ちしちゃう時っていつも机に突っ伏して眠ってるんだけど、今日はどうやら無意識のうちにベッドに移動したようだ。

俺のベッドって下部を収納スペースにするために結構高くなってるんだが、ベッドに乗る時に使えるような踏み台は無いので、ジャンプして乗らざるを得ないんだが、これがちょっとバランス感覚を要する作業で、失敗すれば乗り損ねて転げ落ちる危険があるんだが……それすら無意識のうちにやったのか、ちゃんと意識がある状態でやったけど忘れたのか、思い出せない。

休止中

2009-09-12 02:08:31 | Weblog
本当は趣味のプログラム書きまくりたいんだけど、会社で左遷の危機に直面してるので帰宅後も翌日以降の仕事の予定立てたり会社で必要になった資料の骨組みを作っておいてあとは会社にあるデータをインプットするだけの状態にしたり、業務用のプログラム書いたり……俺この一週間でかなりExcelVBAの知識ついちゃったぞ。不本意ながら。てか、ちゃんと使えばExcelVBAってメチャクチャ処理速いんですね;;VBの文法に抵抗があって使うのがイヤだったけど、とにかく仕事をサッサと終わらす手段が欲しくて一応ググってみたらExcelVBAって結構使えるらしい、と言う事を知った。駄目だったのは俺の腕。

しかしExcelVBAで高速処理プログラムを書いても溜めに溜めた仕事は全然片付かないという;;

本当はブログも書いてる場合じゃないんだが、こういう風に文章にして現状を振り返ってみると見えなかった問題点が見えてきたりして、それが全体の解決に繋がったりする事が今までにあった……ような気がする。具体例は思い出せないが;;



全然マッタク関係無いけど友人のブログを読んでいて久しぶりに吹いた。
普段の文章が面白くないってわけじゃない。面白いので毎日読んでるんだが俺はどうやら言葉の記憶違いがけっこうツボに入るらしい。「ふいんき」とか。
だが友人の性格を考えると素じゃなくネタでやってる可能性が高いのでウッカリ指摘すると「釣られてやんの (*´艸`)ププー」とか言われかねない。
だから間違っても「アンニョイってw」とかコメントしてはいけない、いけない………と思ってもこうしてブログで書いてしまう。
面白かったです。久しぶりに笑えた気がする。釣りでもいいのでもっとやr(





他人が言葉を覚え間違えていて、堂々と「あらかさまにおかしいだろw」と言ったりするのを聞くと「あらかさまって!wおかしいのはどっちだよ」と言いたくなるんだが、かくいう俺もサンホラのMoiraのCDを探す時に「モイラ」って発音したクチだったり。
後で「ミラ」って読むのが正しいって知った時は思わず掛け布団をかぶって顔隠して転げまわりながらエレフばりに「Ahhhh!!!!」と叫んだりした。自分でもどうしたかったのかよく分からないがとりあえず恥ずかしかったのは確か。





……とりあえず、月曜までに作らなきゃいけない資料が昼間だけじゃ出来なさそうだから、今夜は徹夜です。早く終わらせて圧縮プログラム書きたい。。

腹が破れそう

2009-09-04 15:58:56 | Weblog
相変わらず圧縮プログラムと格闘してるカモです。こんにちは。
カモって名乗るの凄く久しぶりな気がする。それはさておき


食べ物のせいか、会社で生じたストレスのせいか、腹がメチャクチャ痛い。
ストレスと言えば、いつまでたっても出来上がらないし原理も理解できない圧縮プログラムもストレスになりそうだが、それは多分関係無いと思う。


会社で生じたストレスは……自業自得という感じ。
上司から厳重注意を受けた。
その衝撃があまりにもデカ過ぎるせいか、今はまだその衝撃で生じたダメージをうまく認識できない。防衛機能が働いて「厳重注意された事も、その原因も、記憶の上で”無かった事”にする」って言う処理を実行しようとしている気がする。
結局それは問題を放置して悪化させるって事で、全然解決になってないんだけど、とりあえず自分がペシャンコに潰れるのは避けられる。

てか、そういう行為をする事について注意を受けた。
それだけじゃないが、その問題も「改善できなきゃお前は俺の職場には残さない」と言う風な事を言われた。




左遷の危機。
どうなる俺。






そんな状況で、俺は、数時間前まで、やっぱり圧縮プログラムを書いていた。
ある意味現実逃避のための行為なのかもしれないと思い始めてる。
RangeCoderを実装するのはとりあえず先延ばしにする事にした。
結局翻訳も出来なかった。やっぱ原理を考えるとナゾな部分が多すぎてうまくプログラム書けない。
別のエントロピー符号化方法のハフマン符号化プログラムを書いた。
ハフマンも……単純な基礎レベルの処理は出来ても実用的な処理が出来なかった。
解説サイトは多数あるけど、重要な部分が全然解説されてない気がするのは俺だけだろうか。

RC、HCを書いてみて「圧縮解凍って、基数変換すればそれでOKなんじゃね?」と思った。
RCは範囲がどうたらこうたら、ACは1から0の間がどうたらこうたら、HCも出現頻度に応じてキャラクタに番号を割り当ててどうたらこうたら。どれも最終的に出力するコードは一つの数値で、それは例えば

使用している文字の種類:2種類
使用している文字:A,B
文字「A」の使用回数:2
文字「B」の使用回数:1

上記条件で成立する文字列は以下の通り

AAB
ABA
BAA

符号化対象文字列は「BAA」であり、上記表の上から3行目と同じなので
符号語は「3」と言う出力を返す。


……みたいな事じゃないだろうか。ざっくり言ってしまえば。

と、考えて、文字列圧縮用の基数変換プログラムを書いている。
そのプログラムを書く上で「nのp乗ループする関数」が必要になって、書いた。
単純な関数なんだけど最初は頭こんがらがってて上手く書けなかった。
こんがらがった頭を整理するためにログを出力させながら関数を修整したらこんな(↓)ログが出た。


n:0, p:0, cnt:1, key:
n:0, p:1, cnt:0, key:
n:0, p:2, cnt:0, key:
n:0, p:3, cnt:0, key:
n:0, p:4, cnt:0, key:
n:0, p:5, cnt:0, key:
n:1, p:0, cnt:1, key:
n:1, p:1, cnt:1, key:,0
n:1, p:2, cnt:1, key:,0,0
n:1, p:3, cnt:1, key:,0,0,0
n:1, p:4, cnt:1, key:,0,0,0,0
n:1, p:5, cnt:1, key:,0,0,0,0,0
n:2, p:0, cnt:1, key:
n:2, p:1, cnt:2, key:,1
n:2, p:2, cnt:4, key:,1,1
n:2, p:3, cnt:8, key:,1,1,1
n:2, p:4, cnt:16, key:,1,1,1,1
n:2, p:5, cnt:32, key:,1,1,1,1,1
n:3, p:0, cnt:1, key:
n:3, p:1, cnt:3, key:,2
n:3, p:2, cnt:9, key:,2,2
n:3, p:3, cnt:27, key:,2,2,2
n:3, p:4, cnt:81, key:,2,2,2,2
n:3, p:5, cnt:243, key:,2,2,2,2,2
n:4, p:0, cnt:1, key:
n:4, p:1, cnt:4, key:,3
n:4, p:2, cnt:16, key:,3,3
n:4, p:3, cnt:64, key:,3,3,3
n:4, p:4, cnt:256, key:,3,3,3,3
n:4, p:5, cnt:1024, key:,3,3,3,3,3
n:5, p:0, cnt:1, key:
n:5, p:1, cnt:5, key:,4
n:5, p:2, cnt:25, key:,4,4
n:5, p:3, cnt:125, key:,4,4,4
n:5, p:4, cnt:625, key:,4,4,4,4
n:5, p:5, cnt:3125, key:,4,4,4,4,4
n:0, p:0, cnt:0, key:
cnt:1, key:

n:0, p:0, cnt:0, key:
cnt:0, key:

n:0, p:0, cnt:0, key:
cnt:0, key:

n:0, p:0, cnt:0, key:
cnt:0, key:

n:0, p:0, cnt:0, key:
cnt:0, key:

n:0, p:0, cnt:0, key:
cnt:0, key:

n:1, p:1, cnt:0, key:
cnt:1, key:

n:1, p:1, cnt:0, key:
cnt:1, key:,0

n:1, p:1, cnt:0, key:
n:1, p:1, cnt:0, key:,,0
cnt:1, key:,0,0

n:1, p:1, cnt:0, key:
n:1, p:1, cnt:0, key:,,,0
n:1, p:1, cnt:0, key:,,0,0
cnt:1, key:,0,0,0

n:1, p:1, cnt:0, key:
n:1, p:1, cnt:0, key:,,,,0
n:1, p:1, cnt:0, key:,,,0,0
n:1, p:1, cnt:0, key:,,0,0,0
cnt:1, key:,0,0,0,0

n:1, p:1, cnt:0, key:
n:1, p:1, cnt:0, key:,,,,,0
n:1, p:1, cnt:0, key:,,,,0,0
n:1, p:1, cnt:0, key:,,,0,0,0
n:1, p:1, cnt:0, key:,,0,0,0,0
cnt:1, key:,0,0,0,0,0

n:2, p:2, cnt:0, key:
cnt:1, key:

n:2, p:2, cnt:0, key:
cnt:2, key:,1

n:2, p:2, cnt:0, key:
n:2, p:2, cnt:0, key:,,0
n:2, p:2, cnt:2, key:,1,1
cnt:4, key:,1,1

n:2, p:2, cnt:0, key:
n:2, p:2, cnt:0, key:,,,0
n:2, p:2, cnt:0, key:,,0,0
n:2, p:2, cnt:2, key:,1,1,0
n:2, p:2, cnt:4, key:,1,1,1
n:2, p:2, cnt:4, key:,1,0,1
n:2, p:2, cnt:6, key:,1,1,1
cnt:8, key:,1,1,1

n:2, p:2, cnt:0, key:
n:2, p:2, cnt:0, key:,,,,0
n:2, p:2, cnt:0, key:,,,0,0
n:2, p:2, cnt:0, key:,,0,0,0
n:2, p:2, cnt:2, key:,1,1,0,0
n:2, p:2, cnt:4, key:,1,1,1,0
n:2, p:2, cnt:4, key:,1,0,1,0
n:2, p:2, cnt:6, key:,1,1,1,0
n:2, p:2, cnt:8, key:,1,1,1,1
n:2, p:2, cnt:8, key:,1,1,0,1
n:2, p:2, cnt:8, key:,1,0,0,1
n:2, p:2, cnt:10, key:,1,1,0,1
n:2, p:2, cnt:12, key:,1,1,1,1
n:2, p:2, cnt:12, key:,1,0,1,1
n:2, p:2, cnt:14, key:,1,1,1,1
cnt:16, key:,1,1,1,1

n:2, p:2, cnt:0, key:
n:2, p:2, cnt:0, key:,,,,,0
n:2, p:2, cnt:0, key:,,,,0,0
n:2, p:2, cnt:0, key:,,,0,0,0
n:2, p:2, cnt:0, key:,,0,0,0,0
n:2, p:2, cnt:2, key:,1,1,0,0,0
n:2, p:2, cnt:4, key:,1,1,1,0,0
n:2, p:2, cnt:4, key:,1,0,1,0,0
n:2, p:2, cnt:6, key:,1,1,1,0,0
n:2, p:2, cnt:8, key:,1,1,1,1,0
n:2, p:2, cnt:8, key:,1,1,0,1,0
n:2, p:2, cnt:8, key:,1,0,0,1,0
n:2, p:2, cnt:10, key:,1,1,0,1,0
n:2, p:2, cnt:12, key:,1,1,1,1,0
n:2, p:2, cnt:12, key:,1,0,1,1,0
n:2, p:2, cnt:14, key:,1,1,1,1,0
n:2, p:2, cnt:16, key:,1,1,1,1,1
n:2, p:2, cnt:16, key:,1,1,1,0,1
n:2, p:2, cnt:16, key:,1,1,0,0,1
n:2, p:2, cnt:16, key:,1,0,0,0,1
n:2, p:2, cnt:18, key:,1,1,0,0,1
n:2, p:2, cnt:20, key:,1,1,1,0,1
n:2, p:2, cnt:20, key:,1,0,1,0,1
n:2, p:2, cnt:22, key:,1,1,1,0,1
n:2, p:2, cnt:24, key:,1,1,1,1,1
n:2, p:2, cnt:24, key:,1,1,0,1,1
n:2, p:2, cnt:24, key:,1,0,0,1,1
n:2, p:2, cnt:26, key:,1,1,0,1,1
n:2, p:2, cnt:28, key:,1,1,1,1,1
n:2, p:2, cnt:28, key:,1,0,1,1,1
n:2, p:2, cnt:30, key:,1,1,1,1,1
cnt:32, key:,1,1,1,1,1

n:3, p:3, cnt:0, key:
cnt:1, key:

n:3, p:3, cnt:0, key:
cnt:3, key:,2

n:3, p:3, cnt:0, key:
n:3, p:3, cnt:0, key:,,0
n:3, p:3, cnt:3, key:,2,1
n:3, p:3, cnt:6, key:,2,2
cnt:9, key:,2,2

n:3, p:3, cnt:0, key:
n:3, p:3, cnt:0, key:,,,0
n:3, p:3, cnt:0, key:,,0,0
n:3, p:3, cnt:3, key:,2,1,0
n:3, p:3, cnt:6, key:,2,2,0
n:3, p:3, cnt:9, key:,2,2,1
n:3, p:3, cnt:9, key:,2,0,1
n:3, p:3, cnt:12, key:,2,1,1
n:3, p:3, cnt:15, key:,2,2,1
n:3, p:3, cnt:18, key:,2,2,2
n:3, p:3, cnt:18, key:,2,0,2
n:3, p:3, cnt:21, key:,2,1,2
n:3, p:3, cnt:24, key:,2,2,2
cnt:27, key:,2,2,2

n:3, p:3, cnt:0, key:
n:3, p:3, cnt:0, key:,,,,0
n:3, p:3, cnt:0, key:,,,0,0
n:3, p:3, cnt:0, key:,,0,0,0
n:3, p:3, cnt:3, key:,2,1,0,0
n:3, p:3, cnt:6, key:,2,2,0,0
n:3, p:3, cnt:9, key:,2,2,1,0
n:3, p:3, cnt:9, key:,2,0,1,0
n:3, p:3, cnt:12, key:,2,1,1,0
n:3, p:3, cnt:15, key:,2,2,1,0
n:3, p:3, cnt:18, key:,2,2,2,0
n:3, p:3, cnt:18, key:,2,0,2,0
n:3, p:3, cnt:21, key:,2,1,2,0
n:3, p:3, cnt:24, key:,2,2,2,0
n:3, p:3, cnt:27, key:,2,2,2,1
n:3, p:3, cnt:27, key:,2,2,0,1
n:3, p:3, cnt:27, key:,2,0,0,1
n:3, p:3, cnt:30, key:,2,1,0,1
n:3, p:3, cnt:33, key:,2,2,0,1
n:3, p:3, cnt:36, key:,2,2,1,1
n:3, p:3, cnt:36, key:,2,0,1,1
n:3, p:3, cnt:39, key:,2,1,1,1
n:3, p:3, cnt:42, key:,2,2,1,1
n:3, p:3, cnt:45, key:,2,2,2,1
n:3, p:3, cnt:45, key:,2,0,2,1
n:3, p:3, cnt:48, key:,2,1,2,1
n:3, p:3, cnt:51, key:,2,2,2,1
n:3, p:3, cnt:54, key:,2,2,2,2
n:3, p:3, cnt:54, key:,2,2,0,2
n:3, p:3, cnt:54, key:,2,0,0,2
n:3, p:3, cnt:57, key:,2,1,0,2
n:3, p:3, cnt:60, key:,2,2,0,2
n:3, p:3, cnt:63, key:,2,2,1,2
n:3, p:3, cnt:63, key:,2,0,1,2
n:3, p:3, cnt:66, key:,2,1,1,2
n:3, p:3, cnt:69, key:,2,2,1,2
n:3, p:3, cnt:72, key:,2,2,2,2
n:3, p:3, cnt:72, key:,2,0,2,2
n:3, p:3, cnt:75, key:,2,1,2,2
n:3, p:3, cnt:78, key:,2,2,2,2
cnt:81, key:,2,2,2,2

 ・
 ・
 ・


これ見て何故か幸福感を得た。
こんな英数字に癒されるような状態の俺って……