2008年9月アーカイブ

知らなかった


NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, listener);
もしくは、
WindowedApplication.addEventListener(InvokeEvent.INVOKE, listener);

とかしたら、

InvokeEvent#argmentsに引数がArray型で取得できる。


引数には、実行コードは含まず、インストール時に作成されたショートカットとかで起動した場合は、
lengthが0になってる。


ユーザに実行時引数をつけろとかいうのは大変だけど、ショートカットを右クリック -> プロパティでパスの最後に引数を追加すればokなので、管理者が管理モードで起動とかならいいかもね


引数は基本的には、スペースで区切られて、具体的には、

引数

配列

tick tock

{tick,tock}

tick "tick tock"

{tick,tick tock}

"tick" "tock"

{tick,tock}

\"tick\" \"tock\"

{"tick","tock"}


となるらしい。



<参考>
Adobe AIR * アプリケーションの起動および終了オプション
Adobe® Flex™ 3 リファレンスガイド


1000点問題始めて解けた。時間外だけどww


せっかくなので復習。


・250点問題
[問題文]
あなたは始めmyUnits人の兵士を持っており、各兵士は毎ターンやぐらに1のダメージを与える。相手は兵士を持っておらず、その代わり、ライフがhpTのやぐらをnumT持っている。各やぐらは、毎ターンattackT人の兵士を倒す。

戦闘の流れは、
1. あなたの兵士が、任意のやぐらに1pointずつダメージを与える。
2. 相手が、残っているやぐらの数*attackTの数のあなたの兵士倒す。

相手を倒すのに必要な最小のターン数を返しなさい。ただし、倒せない場合は-1を返す。


[定義]
Class: Towers
Method: attack
Parameters: int, int, int, int
Returns: int
Method signature: int attack(int myUnits, int hpT, int attackT, int numT)


[制約]
・myUnitは、1以上1000000以下
・hpT, attackT, numTは、1以上10000以下


[方針]
普通に片っ端からやぐらを倒していく。


[ソース]
public class Towers {
	
	public int attack(int myUnits, int hpT, int attackT, int numT) {
		// 現在のターン
		int turn = 0;
		// 攻撃中のtowerの残りhp
		int hp = hpT;
		
		while(numT > 0) {
			// 全滅したらゲームオーバー
			if(myUnits <= 0) return -1;
			turn++;

			// 自分のターン
			hp -= myUnits;
			while(hp <= 0) {
				hp += hpT;
				numT--;
			}
			
			// 相手のターン
			myUnits -= numT * attackT;
			
		}
		
		return turn;
	}
}


・500点問題
[問題文]
1からnまでの数字の中からm個の数字を選ぶ。同様に、ランダムに選ばれたm個の数字と少なくともk個が一致していればあなたの勝ちとする。
n, m, kが与えられたときあなたの勝つ確率をdouble型で返しなさい。


[定義]
Class: TwoLotteryGames
Method: getHigherChanceGame
Parameters: int, int, int
Returns: double
Method signature: double getHigherChanceGame(int n, int m, int k)


[制約]
・nは、2以上 8以下
・mは、1以上 n-1以下
・kは、1以上 m以下


[方針]
高校の確率でやる計算をプログラムでさせる。
ランダムとか一致とかはどうでもよくて、数A風に、
「(n-m)個の白玉とm個の赤玉があります。玉をm個取り出す時に少なくともk個が赤玉である確率を求めよ」と解釈。

少なくともk個一致すればいいのだから、
「1つも一致しない確率 + 1つ一致する確率 + ・・・ + (k-1)個一致する確率」の余事象でok

コンビネーションの求め方は再帰の方が良さげだけど、n, m, kがmax 8なので
これでもオーバーフローしなかった。

(変数名とかメソッド名がわやなのはスルーな方向で)


[ソース]
public class TwoLotteryGames {
	
	public double getHigherChanceGame(int n, int m, int k) {
		int bunshi = 0;
		int bunbo = 1;
		
		// 勝つ場合の数を求める
		for(int i=0; i<k; i++) {
			// i(<k)個一致する確率
			bunshi += getA(n, m, i);
		}
		
		// 全事象を求める
		for(int i=n; i>(n-m); i--) {
			bunbo *= i;
		}
		
		return 1-(double)bunshi/bunbo;
		
	}
	
	/** n個中m個が当たりで、それをm個引きi個当たる当て方を求める */
	private int getA(int n, int m, int i) {
		int result = 1;
		
		// はずれを(m-i)個ひく
		for(int j=(n-m); j>(n-m-m+i); j--) {
			result *= j;
		}
		
		// あたりをi個ひく
		for(int j=0; j<i; j++) {
			result *= (m-j);
		}
		
		// 何番目で当たりをひくかで、mCi通りあるのでそれを掛ける
		result *= combination(m,i);
		
		return result;
	}
	
	/** nCrで表記される組合せを返す。 */
	private int combination(int n, int r) {
		int i,p=1;
		
		for(i=1; i<=r; ++i) {
			p *= (n-i+1);
			p /= i;
		}
		
		return p;
	}
}




・1000点問題
[問題文]
あなたは始めmyUnits人の兵士を持っており、相手は、0人の兵士とライフがbarHpの兵舎を持っている。各兵士の攻撃力は1で、 ライフも1である。相手は始め兵士を持っていないがターン終了時に兵舎が倒されていなければ、兵舎unitsPerRound人の兵士が追加される。兵舎のライフはbarHpである。

戦闘の流れは、
1. あなたの兵士が、相手兵士か兵舎を任意に1pointずつダメージを与える。
2. 相手がの兵士が、その数だけあなたの兵士を倒す。
3. 相手の兵舎が倒されていなければ、相手にunitsPerRound人の兵士が追加される。

相手を倒すのに必要な最小のターン数を返しなさい。ただし、倒せない場合は-1を返す。


[定義]
Class: BarracksEasy
Method: attack
Parameters: int, int, int
Returns: int
Method signature: int attack(int myUnits, int barHp, int unitsPerRound)


[制約]
・myUnits, barHp, unitsPerRoundは1以上 50以下


[方針]
250と違って、兵士と兵舎のどっちを優先して攻撃するかが問題。
myUnitsは増えることはないので、基本的にはそれを減らさないように兵士を優先して倒し、兵士を全滅させたら余力で少しずつ兵舎のライフを削っていく感じ。

ただ、これだけだと、exampleは通るがSystemテストで落ちる。理由は、最小のターン数でなはいから。

例えば、
myUnits:22, barHp:48, unitsPerRound: 21の場合、

最初のターンで、兵舎に22のダメージを与えると、その後は1ずつしか減らせない。

初期:myUnits:22, barHp:48, numT:0
1. myUnits:22, barHp:26(-22), numT:21(+21)
2. myUnits:22, barHp:25(-1), numT:21(-21+21)
3. myUnits:22, barHp:24(-1), numT:21(-21+21)
4. myUnits:22, barHp:23(-1), numT:21(-21+21)
      ・
      ・
      ・
13. myUnits:22, barHp:14(-1), numT:21(-21+21)
最小のパターンはここで一斉攻撃
14. myUnits:9, barHp:0(-14), numT:13(-8)
15. myUnits:5, barHp:0, numT:4(-9)
16. myUnits:5, barHp:0, numT:-1(-5)

これを判定しなきゃだめっぽくて、

でも、このフラグは、barHpがmyUnits以下になった時(一斉攻撃すれば倒せる状況になった時)に、
兵舎を一斉攻撃し、numTがあまり減らせなくても全滅せずに倒せるかどうかを調べれば良いので、そういう処理をすればok


[ソース]
public class BarracksEasy {

	public int attack(int myUnits, int barHp, int unitsPerRound) {
		int turn = 0;
		int numT = 0;
		
		while(numT > 0 || barHp > 0) {
			if(myUnits <= 0) return -1;

			// 敵ソルジャーを先に攻撃
			if(unitsPerRound < myUnits && 
					!(
							// 全力でbarを攻撃すればこのターンを倒せる
							myUnits >= barHp
							// barを倒したは良いが、ソルジャーに攻撃されて全滅するということはない
							&& shuoldKillBar(myUnits - (numT-(myUnits-barHp)), numT-(myUnits-barHp))
					)
			) {

				// 敵ソルジャーを先に攻撃
				numT -= myUnits;
				if(numT < 0) {
					barHp += numT;
					numT = 0;
				}
			// barを先に攻撃
			} else {
				barHp -= myUnits;
				if(barHp<0) {
					numT += barHp;
					barHp = 0;
				}
			}
			
			// 相手のターン
			myUnits -= numT;
			
			if(barHp > 0) numT += unitsPerRound;
			turn++;
		}
		
		return turn;
	}
	
	/** Barを一斉攻撃して倒した場合、その後全滅させられないか */
	private boolean shuoldKillBar(int myUnits, int numT) {
		while(numT > 0) {
			numT -= myUnits;
			if(numT <= 0) return true;

			myUnits -= numT;
			if(myUnits <= 0) return false;
		}
		
		return false;
	}
}


DataGridにはないけど、AdvancedDataGridには、ヘッダ部分にソート順を表す数値を示すスペースがある。

でもこのスペースと縦棒、sortableColumns=falseの時は、空気を読んで消えて欲しい。




んで、たまたま「あわせて読みたい」に載ってるサイト見てたら解決法が載ってるではないか!!


id:kkanda さんによると、sortExpertModeをtrueにすればいいとのこと。


さっそく試してみたところ


ホントだー!!!しかも動的にも変えれるんだーってことがわかりました。
月曜日会社に行ったら直しとこ♪

以下、サンプル(ソースは 右クリック -> ソースの表示)






<参考>
[flex][as3] AdvancedDataGridのヘッダに表示される縦線を消す方法

ずっと「未公開(原稿)」になってたのに気づかなかった(´・ε・`)


まずは、ActionScript3でのXMLの操作について、

例えば、次のようなXMLがあって




そのインスタンスとして、employees:XMLがあるとしたら、

・値を取り出す。

・属性を取り出す。

・XMLListを取り出す。(表示される結果は、XMLListオブジェクトのtoString()の結果)

・深さを指定せずに、子・孫など全ての子孫の特定の値、属性を対象に取り出す。

・"*"を使用し、全ての子孫を取り出す。 

・変数を使って動的に値を取り出す。 

・XMLListから拡張for文で値を取り出す。




で、ここまではAPIリファレンスにも載ってる基本で、

ここからが問題


AS3ではこういう風に、簡単にXMLを扱えるんだけど、XMLにxmlns属性がついていると、ちょっと気をつけなければいけない。

例えば、上記のXMLが以下のようになっていたら、



今まで通りの方法では値を取り出すことが出来ず、さっきまでemployeeって書いていたところが、http://employees.com::employeeみたいな書き方をしなければならないらしい。

こんな方法はめんどくさいので、xmlnsが指定してある場合は、



みたいにしてやると今まで通りの書き方をすれば大丈夫!!



<参考>
Adobe® Flex™ 3 リファレンスガイド
kanesi.jp » Blog Archive » 【ActionScript3】XML名前空間でハマった!の巻


<あわせて読みたい、後で読む>
akihiro kamijo: XML 要素の操作
XML の扱い方いろいろ|_level0.CUPPY





twitterのidが抜けるのは前から知られてるけど、hatenaもとれるみたいだね。
まぁ抜けるからなんだよって話だけど(笑)

はてなダイアリーって、コメント欄に最初から名前とか画像とかが出ていてコメントが書きやすいって誰かが言ってたけど、MovableTypeとかWordPressでも、CookieからはてなIDとれるんなら同じことできるね。
OpenIDとか認証とかコメントする側にはわずらわしいだけだし

ただ、JavaScriptをこれ以上頑張る気力がないのでやりませんがwww


とりあえず、はてなの中の人に報告しておこう。何日で修正されるかな。



ぁ、仕組みとしては、はてなスターの仕組みを利用しています。
なので、副作用としてはてなスターが1度付けられます。付けれるんで消すことも出来るんですが、せっかくなので記念にみんなからスター貰おうと思います(笑)


あと、取得したIDとかは、サーバーに送信したりしてません。(一応書いとく)


(追記)
やばい、これなんて足あと機能??

(追記2)
スターの画像を足あとっぽいアイコンにしてみました。

フリー素材を公開しているHimawari Gardenさんに感謝感激


(追記3)
id:satoru_netさんのところで解説がされてます。
 HatenaのIDが抜ける件の分析@2ステップで抜ける!

iKnow

あわせて読みたいブログパーツ
Firefox meter