ANA国内線【PR】

カテゴリ:日常生活

  • 書けるうちに
    [ 2012-05-14 23:45 ]
  • 仕事後に渋谷TODへ。
    [ 2012-05-13 23:51 ]
  • 慌ただしい一日
    [ 2012-05-12 23:58 ]
  • 久しぶりにポップン
    [ 2012-05-11 23:59 ]
  • 説明会とかゲーセンとか
    [ 2012-05-08 23:52 ]
  • GWなんてなかった。マルチスレッドのお勉強。
    [ 2012-05-07 23:09 ]
  • Google Code Jam 2012 Round1 突破!
    [ 2012-05-06 23:04 ]
  • TODやったりプログラミングしたり
    [ 2012-05-05 23:15 ]
  • 仕事後ゲーセン。
    [ 2012-05-02 23:49 ]
  • 最近は後ゲーセンが多い。
    [ 2012-05-01 23:54 ]

 

書けるうちに

今日は昼ごろからタイピングゲームの開発に。
Timerクラスを使って実装してみたものの、
途中で間隔を変化させることがどうやらできなさそうなので断念。
マルチスレッドを使った場合と、CPU使用率とメモリ使用率が大して変わらないのと、
19ワードほど同時表示してみても使用率が20%いくかどうかといった感じなので、
取り敢えずはこのままいくことにしました。

実装途中に飲んでいたモンスター。


問題は音声かな。もっと快適な感じの打鍵音にしたいかもしれない。
何かいいものがあれば。

そして最近はJavaの根本的な構造の見直しということで、
Effective Javaとデザインパターン入門の本を読んでいます。

デザインパターンを先にやっています。ここまできて漸く理解が進むようになってきた感じ。
1章 Iterator
2章 Adaptor
3章 Template Method まで。

19時ごろに帰宅し始め、21時にゲーセン。


サイハテの感覚が少しずつつかめてきた。

BEMANIも2クレ。1回目はreunionを74%。2回目は100%でクリア。

  by ddrer-yossi | 2012-05-14 23:45 | 日常生活 | Trackback | Comments(0)

仕事後に渋谷TODへ。

今日は朝っぱらから仕事。といっても新しいジャンル。
XAMPPを導入し、phpMyAdminを使ったり、redmineを使ったり、
Codeigniterとdx_authを使ったりと。
まず最初にぶち当たった問題としては、apacheが起動しないという問題。

原因はSkypeでした。音声着信に80番ポートを利用しているため、
apacheで使えなくなってしまうと。
Skypeのほうでポート番号を設定することが、楽で、
もちろんapache側のほうからでも設定は可能。


お昼はマグロ漬け丼のセットです。

4時に切り上げて渋谷のTODへ。
2章と3章で助けないことによるルート変化を楽しみました。
スコアが6章だけ反映されると知って、
無謀にも8体ノーミスを全力で挑戦してみたものの、1ワードしか取れず。
3プレー中、1回目はなんと1コインできずに終了してしまった。

ぱとらっしゅぼくはもうつかれたよ

結局3クレやって終了。地元ゲーセンへ。
ここでは、diva1クレ、ビーマニ1クレ、ミュージックガンガン2 1クレ、バスケもどき1クレをプレー。
特に目ぼしい更新はなかった。

帰宅後は、非常に強い眠気に襲われて、21:30-23:30ぐらいまで寝ました。

ちなみに TOD 攻略と書くとテイルズのほうが出ますし、
TOD 攻略 分岐 とかでも一緒です。

  by ddrer-yossi | 2012-05-13 23:51 | 日常生活 | Trackback | Comments(0)

慌ただしい一日

今日は午前中は少し日記を書きました。3日分が重いせいで、9,10,11日を書くだけで終了。
お昼は某所で食事会に参加しました。



料理はとても多かったですね。あんまり食べられませんでしたし、時間もありませんでした。
15時ごろに切り上げて、2時間かけて都内某所へ。

そこで、仕事要件について少々お話をして、結局これが長くなって20時ぐらいまで。
渋谷TODに立ち寄って、2クレ。うん、最近立ち寄り過ぎだわ・・・。
これからたまに立ち寄ることになりそうなので、TODタグたちあげてみます。
Tags:# 

  by ddrer-yossi | 2012-05-12 23:58 | 日常生活 | Trackback | Comments(0)

久しぶりにポップン

日記は10日分溜まる前に消化しておきたいのが本音ですが、
なかなか時間が取れず、今も早足で書いているところです(5/12 10:00)

今日は仕事。お昼はすき家で高菜マヨの並盛。

夜21時近くまで仕事をして、それからゲーセンへ。
内訳は DDR 1クレ、jubeat 1クレ、pop'n 2クレ でした。
DDRはSigSigのDifficultを粘着する。



5度目の正直といった感じ。

jubeatは難易度10を色々と更新。1クレで人が増えたのでやめる。
その後はpop'n、38を1曲クリアという収穫だけに終わった。久しぶりなので許容範囲か。

更に地元ゲーセンではdivaを1クレ。特に更新事項なし。

帰宅後はDDR。WAKA LAKAまでフルコンペースだったのに、
油断したら一気に3ミスして撃沈した構図。


その後はWii Fitで30分ほどジョギング。
体重が太り気味から標準になりました。BMI25を切ったのは久しぶりに快挙です。
体重も90→87まで減少しました。いい調子です。
初め二週間ぐらいは運動を続けてもなかなか体重が減らなかったのですが、
その後一気に減りました。

タイピングゲームに関して少し語りましょう。
音を鳴らす側のスレッドは、常時while(true)で回すのではなく、
回しつつ、wait()で待機して、音を鳴らす時にnotifyさせるようにしました。
これにより、CPUの使用率が4コアで30%前後だったものを、
10%前後に低減することに成功しました。
アニメーション側はしょうがないので、問題ごとに生成して、repaint処理をさせるようにしました。
ちなみにスレッドの生成方法は、大きくわけて3つあります。
・Threadクラスを継承する
・Runnableクラスを実装する
・内部クラスを使う

内部クラスを使うことで、run()内の記述を別々に作ることが出来ます。便利便利。

Thread th1 = new Thread(){
public void run(){
//処理
  }
};

  by ddrer-yossi | 2012-05-11 23:59 | 日常生活 | Trackback | Comments(0)

説明会とかゲーセンとか

今日は午前中は聴講、午後はとある何かの説明会に参加していました。
終わったのは18時過ぎ、この後友人とゲーセンへ向かいました。
その前にラーメンをということで。



腹ごしらえをしてゲーセンへ。
DDRは高校生が占拠していてなんかアレでしたが、他の音ゲーも相当こんでいたので、
まずはDDRをしました。予想以上に疲れました。
その後はビーマニ2クレ、リフレク1クレの合計4クレで終了。
混んでいてあまりできませんでした。

reunionがクリアできなかったなどと・・・。
Tags:# 

  by ddrer-yossi | 2012-05-08 23:52 | 日常生活 | Trackback | Comments(0)

GWなんてなかった。マルチスレッドのお勉強。

終わりましたねー/(^o^)\
今日は夕方頃からタイピングゲームの作りこみに。
音を導入しようと思い、AudioClipだかなんかを使ってみたが、
これはループ再生などが効かない感じだったので、
Java Sound APIを使う必要性に駆られました。

どうやら結構導入には手間がかかるらしく、調べてみると、
簡単に再生、停止ができるライブラリを作った人がいらっしゃったので、
それを流用することにしました。助かります。

これに停止用のメソッドを追加して一安心。
導入してみると・・・。
音に処理が奪われて、文字が消えて行くのが音が鳴り終わった後に一気に消えていく・・・!
ということで、爽快なタイピングを実現できそうにない感じでした。

思い当たる節としては、シングルスレッドで回すことにより、処理を乗っ取られるということでしょうか。
ということで急遽マルチスレッドの勉強をする必要があると感じ、Javaスレッド完全制覇 (標準プログラマーライブラリ) をお借りして帰りました。

後は朗報です。体重がなんと87.85kgまで減少しました。
WiiFitで2kg以上の差がありますが続けますか?と出るぐらいで、
あちゃー、GW中に太ったかーと思いましたが、そんなことはなかったようです。

  by ddrer-yossi | 2012-05-07 23:09 | 日常生活 | Trackback | Comments(0)

Google Code Jam 2012 Round1 突破!

今日はコーディングづくしの日でした。Round1 Bに関しては、同日1時に行われましたが、
これは5/5に書きます。

ということで後がなくなった朝から夕方にかけては、タイピングゲームの開発を続行しました。
昨日直しきれなかった部分です。この日は非常に暑かったので、リビングで作業しました。

室内は30度オーバー。
更に、Tabキーでのワードの切り替え、Escキーでのカーソル解除、
また、複数ワードがある場合、入力したい先頭のワードを判別する仕組みを導入しました。
苦労したところとしましては、枠を作るところでしょうか。
座標を正確に作らないといけないのが苦しいです。

夕方には天気が一時的に急激に悪化して、ひょうが降って来ました。
つくばに関していえば、竜巻が発生し、甚大な被害をもたらしたようです。

さて、リリース直後に、入力の柔軟性が反映されていない、nullになるなどのバグがありましたが、
18時にGoogle Code Jamを控えているので、後ほど訂正といったところで。

まず、問題を見通す。うーん、A問題はsmallの得点が高くて難しそうだけど、
largeの得点も一緒だから、ここからやるのがよさそうかなー?

ということでAから見る。どうやらダイヤモンドインヘリタンスという関係があって、
AからBへ向かうまでの経路が複数あれば、ダイヤモンドインヘリタンスというらしい。
んで、このダイヤモンドインヘリタンスが有るかどうかに関して判別するという問題でした。
最初はこれ、再帰使わないと無理じゃない・・・。と思い、絶望していました。
そして、その後にこれ、Queue使えばいけるんじゃないかと思いたち、
昔の記憶をたどってプログラミングする。
つまり、スタートの状態をpushして、ゴールに行くまでに、
既に通った(フラグをtrue)にした経路があればYesを返せば良いということ。
これで組んでみたらなんとかできました。
と思い、提出してみるとwrong answer。
なぜだー!と思い、問題文を確認。別にスタートが1からというふうに決まっているわけではなく、
これはただのCase:#1からですよということだったので、
全てに関してpushして判定してみればいいんじゃないかということで、for文増やす。
無事correctして、歓喜。Largeは時間大丈夫かなーという不安もありましたが、
まー1000ノードぐらいなら実験やったことあるしなんとでもなるでしょうという自信があったので、
そのまま実行。これがうまくいって、提出終了。

import java.util.*;
import java.io.*;

public class Test {

public static void main(String args[]) throws Exception{
Scanner input = new Scanner(new FileReader("./iothings/A-small-attempt1.in"));
PrintWriter pw = new PrintWriter(new FileWriter("./iothings/output.txt"));
int n = input.nextInt();
for(int i = 0 ; i < n ; i++){
int n2 = input.nextInt();
boolean[][] con = new boolean[n2][n2];
for(int j = 0 ; j < n2 ; j++){
int r = input.nextInt();
for(int k = 0 ; k < r ; k++){
int l = input.nextInt();
con[j][l-1] = true;
}
}
pw.println("Case #"+(i+1)+": "+num(n2,con));
}
input.close();
pw.flush();
pw.close();
}

public static String num(int n2,boolean[][] con){
Queue q = new PriorityQueue();
for(int k = 0 ; k < con.length ; k++){
q.add(k);
boolean[] isok = new boolean[n2];
isok[k] = true;
while(!q.isEmpty()){
int st = q.poll();
for(int i = 0 ; i < con[st].length ; i++){
if(con[st][i] == true){
if(isok[i] == true){
return "Yes";
}
q.add(i);
isok[i] = true;
}
}
}
}
return "No";
}
}

これは結構綺麗に書けたなーと自分でも思っています。

次にB問題を見る。文章長いし、なんか物理系の問題そう・・・。
だるい、無理!ということでC問題に移動。

C問題は、箱が数種類あって、順番に連続で何個か流れる。
商品が数種類あって、順番に連続で何個か流れる。

使える操作は以下のとおり
・箱を捨てる
・商品を捨てる
・箱と商品の番号が一致したときにのみ格納できる

格納できる最大数を求めよ

という問題。ちなみにsmallはかなり条件が緩く、流れてくるものは最大でも3区分だけです。
これはどうやって解けばいいんだろうと、相当悩みました。
そして何度もwronganswerを出しました。
時間が刻々と過ぎていき、順位は1200位後半。もうだめか・・・と思っていたが、
smallは全探索でも十分いけそうということで、すべての状態に関してQueueを使って
網羅していった。結果、correctし、700位代へ。後25分といったところ。

import java.util.*;
import java.io.*;

public class Test {

public static void main(String args[]) throws Exception{
Scanner input = new Scanner(new FileReader("./iothings/C-small-attempt2.in"));
PrintWriter pw = new PrintWriter(new FileWriter("./iothings/output.txt"));
int n = input.nextInt();
for(int i = 0 ; i < n ; i++){
int n2 = input.nextInt();
int m = input.nextInt();
long a[] = new long[n2];
int A[] = new int[n2];
long b[] = new long[m];
int B[] = new int[m];
for(int j = 0 ; j < n2 ; j++){
a[j] = input.nextLong();
A[j] = input.nextInt();
}
for(int j = 0 ; j < m ; j++){
b[j] = input.nextLong();
B[j] = input.nextInt();
}
pw.println("Case #"+(i+1)+": "+num(n2,m,a,A,b,B));
}
input.close();
pw.flush();
pw.close();
}

public static long num(int n2,int m,long[] a,int[] A,long[] b,int[] B){
long max = 0;
Queue q = new PriorityQueue();
q.add(0+","+0+","+0+","+a[0]+","+b[0]);
while(!q.isEmpty()){
String[] sl = q.poll().split(",");
int aindex = Integer.parseInt(sl[0]);
int bindex = Integer.parseInt(sl[1]);
long sum = Long.parseLong(sl[2]);
long rest = Long.parseLong(sl[3]);
long restb = Long.parseLong(sl[4]);
if(aindex == a.length || bindex == b.length){
max = Math.max(max,sum);
}else{
if(A[aindex] == B[bindex]){
if(rest > restb){
if(bindex+1 != b.length){
q.add(aindex+","+(bindex+1)+","+(sum+restb)+","+(rest-restb)+","+b[bindex+1]);
}else{
q.add(aindex+","+(bindex+1)+","+(sum+restb)+","+(rest-restb)+","+0);
}
}else{
if(aindex+1 != a.length){
q.add((aindex+1)+","+bindex+","+(sum+rest)+","+a[aindex+1]+","+(restb-rest));
}else{
q.add((aindex+1)+","+bindex+","+(sum+rest)+","+0+","+(restb-rest));
}
}
}else{
if(aindex+1 != a.length){
q.add((aindex+1)+","+bindex+","+sum+","+a[aindex+1]+","+restb);
}else{
q.add((aindex+1)+","+bindex+","+sum+","+0+","+restb);
}
if(bindex+1 != b.length){
q.add(aindex+","+(bindex+1)+","+sum+","+rest+","+b[bindex+1]);
}else{
q.add(aindex+","+(bindex+1)+","+sum+","+rest+","+0);
}
}
}
}
return max;

}
}

Largeもダメ元でやってみましたが、さすがに状態数が多すぎて、とてもじゃないですが
8分内に終わることはありませんでした。時間切れ。(Time Expired)
これを通したことで、相当満足してしまったのと、疲れきってしまったので、
B問題はほとんど読む気力がありませんでした。

それよりかは、順位をきにし始め、どこまで落ちるか、1000位以内に入ってくれ・・・と願うばかり。
結局残り0分のときには945位でした。
その後、状態を確認したところ、AのLargeが通っていました!
結構な人数が落ちていて、最終的に821位でした。

Google Code Jam Round 1突破!
これは、世界上位3000人に残ったことを意味します。嬉しすぎる。
次回R2で1000位以内を取ると、Tシャツをゲットとなります。
500位以上で予選通過です(かなり厳しい)

Google Code Jam 2012についておさらい
Qualification Round 15193/17802 日本人610/696
Round 1 3000/15193 日本人 208/610

倍率3倍を通過した気分です。この日は非常に満足したため、
もはや夜は遊んでいました。(バグは修正した上で。)


中華急行 hard のフルコンとか。

  by ddrer-yossi | 2012-05-06 23:04 | 日常生活 | Trackback | Comments(0)

TODやったりプログラミングしたり

朝は、自分の作っているタイピングゲームの
根本的な構成の見直しを行いました。
何かといいますと、複数ワードに対応するようにするにあたって、今の構成だと問題が起こるということです。

今までの構成



つまり、ワードの情報をすべてキー判別クラスに持たせていました。
この調子だと、複数ワードが出現した際に、それぞれの入力情報をもたせるのは厳しいです。
あくまでも、キー判別クラスは、そのキー判別だけを行うようにして、
ワードごとの情報は別のクラスで管理することが望ましいと。
後は問題生成クラスを作り、問題の生成過程や、個々にアニメーションで動かすことも考えてもよさそうです。ということで、下のような構成を考えました。



つまり、問題生成アルゴリズム用のクラスを作り、
その問題の状態を管理するクラスを作り、
機能の分離をはかりました。
パネルで今入力しているワードがどれなのかを判別し、
問題の状態をキー判別クラスに投げて、判定させるといった具合です。

これにより、自分のやりたいことの実現に近くなって来ました。

お昼は渋谷で話題の350円ピザ、ナポリスに行きました。
350円のピザではなく、650円の頼みましたけどね!
窯焼きピザが割と本格的でびっくりしました。
手軽に食べられるファストフード店といった具合です。



その後は偶然にも渋谷TODで対戦を申し込まれたので、挑みました。(2P側)


久しぶり過ぎて、ワード慣れが全然ダメでした。
土星語にしちゃったり、クイズで太陽にほえろ!シリーズが全然わからなかったりと。

その後は渋谷をふらふら。しかし暑いので
DDRをしようと思ったものの、渋谷会館に行くことは諦める。
ヒカリエが途中にありましたが、かなり大きいですね。


甘いモノが食べたかったのでお近くのドトールで休憩。
セットで600円だったかと思います。

その後は再びTODへ突撃。1位を取りに行こうということで。

1回目、太陽にほえろ!で撃沈。1クレ失敗(コンティニューせず)
2回目


3回目



8000いかずに1位です。

その他もろもろ






帰宅後は、Google Code Jam Round1 Bに備えて若干眠る。

そして1B構成をみる。これは、C問題が一番簡単に実装できるのかなー、やってみようと。
問題内容はこんな感じ。
・整数の配列が与えられている
・配列の要素を足した和を考える。
・足した和が同じ値になる組み合わせがあれば出力せよ
・smallは20個、largeは500個の配列とする。

smallに関しては、全部調べてもいけそうということで全部調べる。
しかし、結構書き方に手間取ってしまった。
2進数でフラグ管理するかなーという方法をとったことで、結構面倒な事に。
当然全探索なのでLarge解は投げられるはずもなく。(そもそも提出していない)

import java.util.*;
import java.io.*;

public class Test {

public static void main(String args[]) throws Exception{
Scanner input = new Scanner(new FileReader("./iothings/C-small-attempt.in"));
PrintWriter pw = new PrintWriter(new FileWriter("./iothings/output.txt"));
int n = input.nextInt();
for(int i = 0 ; i < n ; i++){
int n2 = input.nextInt();
int[] number = new int[n2];
for(int j = 0 ; j < number.length ; j++){
number[j] = input.nextInt();
}
pw.println("Case #"+(i+1)+":");
num(n2,number,pw);
}
input.close();
pw.flush();
pw.close();
}

public static void num(int n,int[] number,PrintWriter pw){
int num = 1;
ArrayList list = new ArrayList();
while(!Integer.toBinaryString(num).equals("100000000000000000000")){
String s = Integer.toBinaryString(num);
if(s.length() != 20){
int zerolen = 20-s.length();
String zero = "";
for(int i = 0 ; i < zerolen ; i++){
zero += "0";
}
s = zero+s;
}
//System.out.println(s);
int sum = 0;
ArrayList prelist = new ArrayList();
for(int i = 0 ; i < s.length(); i++){
if(s.charAt(i) == '1'){
sum+=number[i];
prelist.add(number[i]);
//System.out.println(sum+"sum"+i);
}
}
if(!list.contains(sum)){
list.add(sum);
}else{
for(int i = 0 ; i < list.size(); i++){
if(list.get(i) == sum){
String nums = Integer.toBinaryString(i+1);
if(nums.length() != 20){
int zerolen = 20-nums.length();
String zero = "";
for(int j = 0 ; j < zerolen ; j++){
zero += "0";
}
nums = zero+nums;
}
ArrayList kakolist = new ArrayList();
for(int j = 0 ; j < nums.length() ; j++){
if(nums.charAt(j) == '1'){
kakolist.add(number[j]);
}
}
for(int j = 0 ; j < prelist.size(); j++){
if(j != prelist.size()-1){
pw.print(prelist.get(j)+" ");
}else{
pw.println(prelist.get(j));
}
}
for(int j = 0 ; j < kakolist.size(); j++){
if(j != kakolist.size()-1){
pw.print(kakolist.get(j)+" ");
}else{
pw.println(kakolist.get(j));
}
}
break;
}
}
break;
}
num++;
}
}
}

40分ほどかかりました。

次にA問題をみる。
・演者ごとに得点があたえられている
・その得点の合計の数%を演者に加える
・最低点の人が落ちる
・最低点の人が複数入れば全員落ちない
・全員落ちないとき、パーセンテージの振り分け方を求めよ(全体100%)

これはいろいろ試行錯誤しましたが、解けませんでした。結果は6点で2834位。
いよいよRound1Cが最後のチャンスとなってしまいました。
去年と同じ末路を辿らないためにも、1Cで予選通過を目指します。

  by ddrer-yossi | 2012-05-05 23:15 | 日常生活 | Trackback | Comments(0)

仕事後ゲーセン。

今日は仕事に行きました。
お昼は白髪ネギ並。最近は全部並です。


夜は友人とゲーセンへ。
まずはダーツ。
701できっちり勝利、スタンダードクリケットできっちり勝利、次の701で敗北、
最後の701は勝利といった感じ。調子はあんまり。たまに2回連続bullになる程度。

その後はjubeat中心にプレー。




終了後は地元ゲーセンでdiva。




残念ながらAtCoderには参加できませんでした。また機会があるときにでも。

  by ddrer-yossi | 2012-05-02 23:49 | 日常生活 | Trackback | Comments(0)

最近は後ゲーセンが多い。

今日は16時ぐらいまで講義、その後は少しジャグリングの練習に行きました。
戻ってきてから飯を食べようということでとんこつラーメンのお店へ。
割とこの味お気に入りかもしれません。



その後はゲーセン。混み混みでした。
自分はDDRに並び、DDRを1クレでばてばて。
というかパネル間に微妙に隙間があって踏みづらいです。うーん。
その後はポップンをプレーし、後はリフレクとユビートを1クレずつ。
リフレクは友人のほうが強く、勝てる気がしなかったです。
iPadで復習せなあかんなあー。

  by ddrer-yossi | 2012-05-01 23:54 | 日常生活 | Trackback | Comments(0)

SEM SKIN - DESIGN by SEM EXE