スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

1F任意Gametime多項式計測

一般に広く知られているGametime式ステート抜け貫通砲では
(大半は2次式までだけど)次数nに対してn+1Fの値取得が必要になります

で、眺めてて思ったんだけど
こんなややこしい事しなくても1つの仮定の元に1Fで多項式の値を取得できます
簡単の為、Gametime=xとする


仮定:
求める多項式f(x)の係数はそれぞれxより小さいとする



※補足

この仮定は係数をxより大きく設定してる方は少ないと
想定されるのでほとんど一般性を失いません。

f(x)-定数項はxの倍数であることが自明ですから
f(x)%xは定数項がxより小さいことから、一意に定まります
f(x)%x=aとします、f(x)-aから次数1の項を減じたものは
x^2の倍数であることが自明ですから
(f(x)-a)%x^2は次数1の項となります


以上の作業を繰り返すことで任意のGametime多項式の式導出が可能です

次数がわからないから停止タイミングがわからない?
心配しなくても仮定より、次数nの変数xの多項式f(x,n)に対して

x^(n+1) > f(x,n)

が保証されるので逐次この不等式を使えば次数を導出できます

で、これを使うとどんないい事があるのかっていうと


・変数のリソースを少なくできる
・処理速度が次数nに対してn+1倍になる


等があります


デメリットは

・係数にGametimeより大きいものがあった場合計測に失敗する

です

が、しかしGametimeを法として回転させることである程度はカバーできるでしょう





スポンサーサイト

キャラの本質的な撃破クラスと汎用殺傷力

神キャラ殺傷力大会のターゲットキャラは大別すると以下の撃破難易度クラスに分類されます


1.安定有限時間汎用撃破可能のクラス

概要:
任意の手順(手順を間違った際の論外化などの手順、或いは
Stateno要求(邪眼キラー条件等)が存在しない)
で「安定して」有限時間で撃破できるクラス

定義:
撃破のためのアルゴリズム(手順内でキャラを倒すために必要十分なアルゴリズム)
の最短実行時間と最長実行時間が有限時間であるもの



2.不安定有限時間汎用撃破可能のクラス
(準汎用のクラス)


概要:
任意の手順で「安定しないが」有限時間で撃破できるクラス

例: 乱数制御等

定義:
撃破のためのアルゴリズムの最短実行時間が有限時間かつ
最長実行時間が無限時間であるもの



3."安定"有限時間汎用撃破不可能のクラス
(安定専用クラス)


概要:
任意の手順で撃破できないが、専用のアルゴリズムで安定して撃破できるクラス

例: 一定条件下の論外化、敵へのStateno要求等

定義:
専用のアルゴリズムの最短実行時間と最長実行時間が有限時間であるもの




4."不安定"有限時間汎用撃破不可能のクラス
(不安定専用クラス)


概要:
任意の手順で撃破できない上に、専用のアルゴリズムで安定して撃破できないクラス

例: 上の条件に乱数制御が付随している等

定義:
専用のアルゴリズムの最短実行時間が有限時間かつ
最長実行時間が無限時間であるもの


「汎用殺傷力」とは、「撃破難易度クラス1に対するキャラ群へのキルスコア」で定義されるべきで
クラス3,4を汎用で撃破できることは、本質的には「汎用殺傷力」とは切り離されるべきです
何故なら、当たり前ですが「任意の手順」によって撃破できないからです
クラス3,4を汎用撃破できることは、「任意の手順」という汎用性を保証しません
2は「汎用撃破」することが簡単なものと難しいもので(確率的な問題で)別れますが
難しいものは明らかに「汎用性を保証しません」から
クラス2も汎用殺傷力のキルスコアに含めないべきです

注意:

邪眼キラー条件要求が汎用のクラスにないのは
全領域汎用邪眼キラー以外は、仮にも「汎用技術」とは言えないからです
また、現状これは非常に読み込みが重いと想定されます。
よって、邪眼キラーを汎用技術と認めるのは
汎用殺傷力の邪魔であり排斥されるべきであると考えます。


追記:

ステートを用意するプログラムを外部で利用すれば全領域汎用邪眼キラーを実装できると思いますが、
私の預かり知るところではないのですぽよ。




変数圧縮!その2(*´ω`*)

前回の続きです。

前回の方法だと、
末尾のパーティションは、法sと代入可能フラグ(情報量1)が代入されます
末端のパーティションの空き容量は法以下なはずですから
(2147483647は素数なので)
そのままでは、フラグの空き容量がなく、何らかの手段で法を圧縮する必要があります

ここで、高々扱う法の数は有限ですから
扱う法を予め配列化してしまったものを処理で渡しましょう

ここで、(自明ですが)配列添数には以下の条件が要請されます
[x]を床関数、配列の添数をrとして

([log(s,2136484747)]<r-1)∧(s>r)

見ての通り、小さい数が扱えませんが
「固定法で変数内完結する圧縮」はこれが限界になります
法が固定でないものは「管理変数(圧縮変数)」(別の変数の代用を使ってもいいけど)を
圧縮する整数変数範囲をuとすれば、
ceil(u/ceil(log(r,2147483648)))個用意する必要があります。

というか、管理変数以外は固定圧縮じゃない方がいいですし、
管理変数のためにこの話したようなものなのです。








変数圧縮!その1(*´ω`*)

基本的な固定法圧縮


論理演算によるフラグ管理がわかればイメージしやすいのです
任意の法s(圧縮するために分割する値,一般的なフラグでは2、処理上2^xを法とすることが望ましい)を定める
var(x)に代入される値a(n)は常に自然数であるとする。(nは配列添数)


まず、a(0)が渡されたとき、var(x)にa(0)を加算する
次に渡された値a(1)が,a(1)a(1)≧sの場合は圧縮不可能値として、別の変数に渡します

以上の操作を繰り返し

a(n)が渡されたとき、a(n)<sならば、s^n*a(n)を加算する。
a(n)≧sの場合は、圧縮不可能値として別の変数に渡す。

ここで、変数に空きがあるかどうか判別できなければなりませんし
また、法はこの変数内に保存されているほうが、望ましいです
末尾に法と代入可能フラグを入れるとすれば、末尾の区画は空きでなくてはなりませんから
圧縮変数の代入に用いる法は
s^n<(2147483647/s)でなくてはなりません。

まとめると、この方法では、
末尾区画には法s、代入可能フラグを最小限入れておく必要があります。



また、この末尾区画の空きを使って、より高度な変数圧縮が可能なのですけども、
(というか後の拡張のためにこのような圧縮法をしているんだけども)
それはそのうち話しますです!ではでは〜。

Alive偽装と符号付き整数

Alive偽装の際、「Aliveを-1にするには、どう記述すればいいのか」という、符号付き整数を理解していない質問をよく見かけます。


コンピューターが2進数をよく使うのは、「2つの状態を表現できる」からです。
電圧の高低を0,1の2つの数に割り当てることでマシンで演算を行うことができます。


Alive値は553~556に格納される各々が1byteの16進数4byte数です。(1byte=2bit)
これはMugenで扱える整数型が32bitであることに由来します。
2^32=4294967296である為、
Mugenで利用できる整数の範囲は[-2147483648,2147483647]です。
簡易的な表記を使えば[-2^31,2^31-1]となります。(0を含めて表現できる数値の個数は2^32)

ここで最上位のbit(つまり553の1bit目)はAliveの符号を表します。
数学では符号「-」をつけて記述すればいいですが、
マシンは[0,1]の2種類の数しか扱えないため、負の数という概念を人間と同じように把握できません。
ですが、任意の整数が取る符号はプラス或いはマイナスですから、0,1に割り当てることができます。
(ただし、0についてはプラスとして扱います。2147483647が正の最大数であることにこれが現れています。)
これが「符号付き整数」です

次に妥当な-1の表現を考えます。(4byteでの議論と同値であるから簡単のために1byteとする。)
まず、0の1byte表現は、当然 00000000となります。
ここから1を引くと、最上位bitよりも上に常に1となるbitがあると仮定すれば形式上は

(1)00000000
- 1
--------------
  (0)11111111

と計算できます。(詳しくははCarry flagで検索してね♥)


10000001じゃダメなのか?と思った方もいるでしょう。
落ち着いて考えてください。00000000から1引いて10000001になる。というこの、
数字列の変化を単純な論理演算で作るのは面倒です。
直感的には「11111111は00000000をすべて反転」させればいいですが、
「10000001は00000000の最上位bitと最下位bitを反転」
させなければなりませんから、複雑性が高いことがわかるでしょう。


先の議論で-1の2byte符号付き整数での表現は、
11111111が妥当であると考えられますし、
負の数を表現するには最上位bitが1である方が都合のいいことがわかります。
現にMugenでもこのように-1が表現されます。
1bitには、16進数で1つの1桁値が入力されますから、
1つのアドレス(553~556の1つずつ)には、0から255(16^2-1)までの値を書き込むことができます。

以上のことをまとめると、Alive -1への偽装は以下のように記述されます。

[state 553]
type = changestate
trigger1 = alive = -256 ;(-2^8)
value = stateno
ignorehitpause = 1
persistent = 255

[state 554]
type = changestate
trigger1 = alive = -65536 ;(-2^16)
value = stateno
ignorehitpause = 1
persistent = 255

[state 555]
type = changestate
trigger1 = alive = -16777216 :(-2^24)
value = stateno
ignorehitpause = 1
persistent = 255

[state 556]
type = changestate
trigger1 = alive = 0
value = stateno
ignorehitpause = 1
persistent = 255

ここで上のようなtrigger条件になるのは、
格納値が255(11111111)になった後もう一回通過して書き込むと、
255+1=0(11111111+00000001=00000000)でオーバーフローし、0に戻ってしまうからです。

あとはpersistentやtriggerを工夫すれば任意のタイミングに任意の値にAlive偽装が可能でしょう。
ヒント:2の補数




プロフィール

へびいちご

Author:へびいちご
いちごの妖精ぽよ〜
あ、リンクフリーだから勝手にどうぞなのだよ!!

かうんたー
最新記事
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。