2008年10月アーカイブ

[Topcoder] SRM 422 DIV2

| コメント(0) | トラックバック(0)
書くの忘れてた!!

日曜日にあったSRM 422 DIV2でやっとrateが4桁になりました。

ピクチャ 1.png



250点問題(MultiNumber)
1236とか与えられたら、それを前・後ろに2つに分割して(123, 6)、
それぞれについて、1桁ずつかけ算した結果(1*2*3, 6)が、前半後半で等しければ"YES"、違えば"NO"と返すだけの簡単なお仕事。


・500点問題(PrimeSoccer)
5分間にチームAが得点する確率をskillOfTeamAパーセント。Bチームが得点するか確率をskillOfTeamBパーセント。それぞれは互いに独立。
90分間の試合で、少なくとも1チームの得点結果が素数になる確率を求める。

最初問題文読んでて、prime numberが素数と分からず。重要な数字になればいいのはわかったけど重要な数字っていくつだよ!!とか思ってた笑

id:nishiohirokazuさんのiVocaで「TopCoderに出てくる英単語」を学習できるようにしました
に載ってる単語は読めるようにしとこう。

フツーに各チームずつ素数の点を取る確率を計算すればいいんだけど、
最初、チームAが素数点を取る確率とチームBが素数点を取る確率を単純に足してて、
少なくともだから、素数にならないの余事象をとらなきゃいけないのをド忘れしてたりした。

いつもにくらべれば簡単だった気がするー。


public class PrimeSoccer {
	final int[] PRIMES = {2, 3, 5, 7, 11, 13, 17};
	
	public double getProbability(int skillOfTeamA, int skillOfTeamB) {
		double probA = 0.0;
		double probB = 0.0;
		double prob = 0.0;
		
		for(int i=0; i%lt;PRIMES.length; i++) {
			probA += getProb(skillOfTeamA, PRIMES[i]);
		}
		for(int i=0; i%lt;PRIMES.length; i++) {
			probB += getProb(skillOfTeamB, PRIMES[i]);
		}
		
		prob = 1-(1-probA)*(1-probB);
		
		return prob;
	}
	
	/** skill%の確率で得点するとき、point点とる確率を返す */
	private double getProb(int skill, int point) {
		double skillPercent = skill/100.0;
		double rskillPrcent = (100-skill)/100.0;
		double a = 1;
		int i;

		for(i=0; i<point; i++) {
			a*=skillPercent;
		}
		for( ; i<18; i++) {
			a*=rskillPrcent;
		}
		return a*combination(18, point);
	}
	
	/** 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点問題(BirthdayCake)
intだと桁が足りないのでlongを多用するんだけど、キャスト忘れがひどかった。
doubleを使う時は例えば
  double a = 3/2;
とかってやると、 int/intは小数点以下切り捨てでintになるから、aには1が入っちゃうから、どっちかを事前にキャストして、
  double a = (double)3/2;
とかにするんだけど、

longを使うのは久々だったから完全に忘れてた。
50桁のビットフラグを使いたいから、1をシフトさせてってやるんだけど、
1はint型だから、1シフトさせた数(1 << 50)もint型になっちゃう。

正しくするには、1L << 50とかってしなきゃダメ!!

javaでは、
1, 2, 3 → int型
1.2 3.14 → float型
1.0d 5.4d → double型
1L 1000L → long型
になる。


んで、ループの仕方で、最初はフルーツの全ての組合せについて調べてたら、
Exampleでtimeアウトになってしまい、問題文の、
fruiteは最大50個、friendは最大20人ってあるので、

調べなきゃいけないフルーツの組合せは、最大50C25 > 10^14で、
全ての人の組合せは、2^20 > 10^6で
明らかに後者の方が少なくって、

実際にプログラム書いてみたら、後者の方は最大10^6だけど、実際は途中でbreakしたりreturnしたりでフツーにtimeoutにならなかった!!


combinationはよく使うかもだからもっと高速化した方がいいかも。
昔課題でやった気がする。

あと、順番に調べていくやつで、6個中3個とる場合だと、
000111 -> 001011 -> 010011 -> 100011 -> 001101 -> 010101 -> 100101みたいな感じで調べて行ったんだけど、もっといい方法あるのかな??

あんま探索けいは得意じゃないんだよね汗


import java.util.HashMap;

public class BirthdayCake {

	public int howManyFriends(String[] availableFruits, String[] friendsDislikings, int K) {
		// その人が食べれるものを1としたlong型のビットフラグzの配列
		long[] availableTable = new long[friendsDislikings.length];

		// 全部1で初期化
		long allAvaiable = (1L << availableFruits.length) - 1;
		for(int i=0; i<availableTable.length; i++) {
			availableTable[i] = allAvaiable;
		}

		// フルーツ名(String)と桁(int)の対応を設定
		HashMap<String, Integer> fruitsMap = new HashMap<String, Integer>();
		for(int i=0; i<availableFruits.length; i++) {
			fruitsMap.put(availableFruits[i], i);
		}

		// 食べれないものを0にしていく
		for(int i=0; i<friendsDislikings.length; i++) {
			String[] dislikes = friendsDislikings[i].split(" ");
			for(int j=0; j<dislikes.length; j++) {
				if(!fruitsMap.containsKey(dislikes[j])) continue;
				int index = fruitsMap.get(dislikes[j]);
				availableTable[i] -= 1L << index;
			}
		}

		
		int max = 0;

		// 最大の人数を返せばよく、1人から順に調べる。
		for(int n=1; n<=friendsDislikings.length; n++) {
			int[] choice = new int[n];
			for(int i=0; i<choice.length; i++) {
				choice[i] = i;
			}
			
			int loop = combination(availableTable.length, n);
			for(int count=0; count<loop; count++) {

				// n人の食べれるものをANDを使って取得。
				long temp = availableTable[choice[0]];
				for(int i=1; i<choice.length; i++) {
					temp = temp & availableTable[choice[i]];
				}
				
				// K個以上食べれればok
				if(Long.bitCount(temp) >= K) {
					max=n;
					// n人はokと分かったのでbreakしてn+1人を調べる。
					break;
				}
					
	
				if(count==loop) {
					// n人でダメなのでn+1がokなはずがなく、ここで終了。
					return max;
				}
				
				// n人の取り方を設定する。
				if(choice[choice.length-1] == friendsDislikings.length-1) {
					int cnt;
					for(cnt=1; cnt<choice.length; cnt++) {
						if(choice[choice.length-1-cnt] != friendsDislikings.length-1-cnt) {
							choice[choice.length-1-cnt]++;
							break;
						}
					}
					for(int j=choice.length-1-cnt; j<choice.length-1; j++) {
						choice[j+1] = choice[j]+1;
					}
	
				} else {
					choice[choice.length-1]++;
				}
					
			}
		}
		return max;		
	}

	private int combination(int n, int r) {
		int i;int p=1;
		
		for(i=1; i<=r; ++i) {
			p *= (n-i+1);
			p /= i;
		}
		
		return p;
	}
}

11月1日(土) 岡山県立大学の学園祭にて、
セキュリティ&プログラミングキャンプ キャラバン -岡山-があるよー。

講師は、id:sonodamid:wakatonoid:hyoshiokid:amachang の超豪華講メンバー


た だ し 、

・その日は、岡山大学でも学園祭じゃがん!!

・岡山大学は岡山駅から歩いて行けるけど、県立大学はまさかの総社。

・場所うんぬん以前に、フツーの岡山人は岡大の方に行く・・・。

・岡山は勉強会とかカンファレンスとかあんまない岡山で、彼らはそういうのに行く習慣ねんじゃね??

・つーかそもそも彼らは、このイベント知っとん??


こ れ は ま ず い


セキュリティ&プログラミングキャンプは倍率5倍以上なのに、わざわざ岡山に来てくださるのに参加者少なかったらダメじゃん!!
って思って、岡山県立大の情報系に進学した友達に電話したところ、なんと学祭実行委員!!


実行員なので、もちらんそのイベントの存在は知ってたケド、学祭の中のイベントの1つみたいな認識っぽくて、
クラスのやつとか呼べや!!!ってか岡山にある情報系の学科全部にアナウンスせーや!!!
岡山でこんなイベントとかそうそうないんじゃけん!!

みたいなことを言っときましたwww


ってことで、情報系に興味ありそうな友達が岡山にいる人は、このイベントのことを教えてあげてください。行く行かないは本人の自由だけど、「知らなくて行けなかった。」は残念なことので。


会場の8206教室はこの大学で一番大きい教室らしく、当日はこの教室が満員になることを期待しつつ、作業にもどる。


P.S.
このイベントに参加しようとしたら、
金曜日のバイト後、夜行で岡山へ帰って、
土曜の朝岡山到着。そのまま県立大に行って、
日曜日の早稲田祭に行くためにその日の夜行で東京戻ると・・・


あれ??0泊3日??

岡山に家あるのに0泊でつか??笑


<Link>
[セキュリティ]セキュリティ&プログラミングキャンプキャラバン岡山
岡山行くよ
キャラバン-岡山-|セキュリティ&プログラミングキャンプ・キャラバン2008



無線LANで、WEPキーで暗号化すれば大丈夫と思ってWEPを使ってる人とか結構いるけど、


WEPキーって一瞬でクラックできるらしいね。



ソースは、GIGAZINE

一瞬にして無線LANのWEPを解読する方法がついに登場、まもなく解読プログラムを公開予定


まだ、WPAに設定してない人はお早めに。



つまり、WEPしか対応していないニンテンドーDS Liteなんか捨てていいから、

ニンテンドーDSiを買えということですね。わかります。
あるクラスにアクセスした時に最初の1回だけstaticな変数などの初期化処理を行いたい。staticじゃないやつはコンストラクタで出来るのに・・・


静的初期化子を使えばいいそうです。具体的には、
 staticな変数の初期化(1行でかけない場合)
 styleの初期化
があるみたい。もっとあると思うけどすぐ出てこない。


styleの初期化っていうのは例えば、スタイルシートには
.hogeって書くクラスセレクタと
Hogeってかくタイプセレクタがあって、

このタイプセレクタの初期化ってのがクラスに最初にアクセスが起ったタイミングでやりたいので、
静的初期化子を使えということ。

スタイルについては後でまとめます。今回は静的初期化子の話。


javaとかだと
static {

}
とかで出来るんだけど(実際やってるの見たことないけどww)


ActionScriptではそういうのがないから、




とかってやればいいらしい。

ちなみに、constな定数は、宣言時じゃないと初期化できないみたい。

初期化に複数行かかる場合は、同じやり方でその処理メソッドにして宣言時にその戻り値を入れるようにすればok

[Topcoder] SRM 421 DIV 2

| コメント(0) | トラックバック(0)
・500点問題
1直線上に質量の与えられた物質がN個置かれていて、さらにもう1つ置く時に、万有引力的につり合う位置はdoubleでN-1個返せって問題。

高校の物理とかで、問題が言ってることは理解できるんだけど、
フツーにやったら高次方程式になりそうで、プログラムで解き方が分からなくて断念。

→2分探索で解けるよと教えてもらったのでやってみた。



まず、x[n]とx[n+1]の間に一個あるんだから、とりあえず真ん中をとって計算してみて、
左の方が大きければ求めたい点は右半分にあり・・・ってなって、
それを再帰でぐるぐるまわして行くと、範囲が半分の半分の半分の・・・ってなって最終的に誤差が1e-9になれば良くって、
誤差が1e-9ってめっちゃ精度高いように見えるけど、2^30が10^9くらいだから30回くらいやれば答えは出て、1回のループが意外と思い計算じゃないのでタイムアウトにもならないみたい。


・1000点問題
コンテスト終了力後に解き終わって、あとでシステムテストしてみたら通ってた涙

問題は、
	"###...#.###.###.#.#.###.###.###.###.###",
	"#.#...#...#...#.#.#.#...#.....#.#.#.#.#",
	"#.#...#.###.###.###.###.###...#.###.###",
	"#.#...#.#.....#...#...#.#.#...#.#.#...#",
	"###...#.###.###...#.###.###...#.###.###"
みたいな感じでデジタル表示で数字を表していて、いくつか電球が切れた(?)ものが与えられて、もともと表示していた可能性のある数字の平均を返す問題。




とりあえず方針として、
String配列はややこしいので、1桁ずつのデジタル数字に直す。
切れた電球に何かを加えるともとの表示になるので、つまり、今すでに光っている部分を光らせない数字の補集合をとれば良い。
簡単にするのに光ってるのを1、消えてるのを0にして、
事前に用意した1とか2とかのとANDをとって、変化がなければおkってこと。


Windowsのデフォルトの電卓の関数電卓モードよりすげー

ピクチャ 1.png
なんだこれ!!

バイナリ表示のトコとかクリックすると0と1が反転するのか!!!!

しかもXORとか補数とかまでついてるし


ASCII文字も表示してくれるとか、
ADOBEだとうまく、ASCIIがなかったから、ADOBE0にしてみたよ!!!

E0はaに`がついたような文字らしい




これがあれば16進とか2進とかの変換をするのにいちいち

trace(Number(123).toString(16));

とか

System.out.println(Integer.toString(123, 16));


とかコード書かかなくてもいいってことですね笑
tipsっていうほどのもんじゃないけど、単純に検索のテンプレをメモしときたいからメモ

20をいろいろ変換してみたよ。残念なことに192.168.0.1みたいなIPアドレスは変換してくれないらしい


・16進 ⇔ 10進
http://www.google.co.jp/search?q=0x14+in+decimal

・16進 ⇔ 8進
http://www.google.co.jp/search?q=0x14+in+octal

・16進 ⇔ 2進
http://www.google.co.jp/search?q=0x14+in+binary



・10進 ⇔ 16進
http://www.google.co.jp/search?q=20+in+hexadecimal

・10進 ⇔ 8進
http://www.google.co.jp/search?q=20+in+octal

・10進 ⇔ 2進
http://www.google.co.jp/search?q=20+in+binary



・8進 ⇔ 16進
http://www.google.co.jp/search?q=0o24+in+hexadecimal

・8進 ⇔ 10進
http://www.google.co.jp/search?q=0o24+in+decimal

・8進 ⇔ 2進
http://www.google.co.jp/search?q=0o24+in+binary



・2進 ⇔ 16進
http://www.google.co.jp/search?q=0b10100+in+hexadecimal

・2進 ⇔ 10進
http://www.google.co.jp/search?q=0b10100+in+decimal

・2進 ⇔ 8進
http://www.google.co.jp/search?q=0b10100+in+octal



おまけ
・10進 ⇔ ローマ数字
http://www.google.co.jp/search?q=20+in+roman

・10進 ⇔ 英語
http://www.google.co.jp/search?q=20+in+english


以前、Eventクラス系とかあんまり詳しくなかった頃、

[Air] 動的にリサイズを可能にしたり不可能にしたりする


「もっといい方法があれば教えてください」

って書いてたら、次の日くらいに現実世界で「イベントキャンセルすればいいじゃん」って教えてもらってたんだけど、当時は、

イベントを・・・キャンセルする???どうやって????
まぁ今ちゃんと制御できてるからいいや

っていうレべルで汗
保守的にあのやり方はまずいのを最近実感してたところで、通りすがりの方からコメントがあったので


ちゃんとしたコードを書きます。


Event#preventDefault()でcancelable=trueなデフォルトのイベントをキャンセルできるみたいです


このアーカイブについて

このページには、2008年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年9月です。

次のアーカイブは2008年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 5.0