将棋ウォーズで3級になった

f:id:w_shunn:20151017182536j:plain

10月17日に将棋ウォーズで3級になりました(成績は68勝87敗)。

他の人の役に立ちそうにはありませんが、せっかくなので3級昇級までにした自分のやった勉強や所感などを記録しておきます。 もし「ここはこうしたほうがいいよ」などのご意見があったら是非コメントをつけてください。

前書き

小学生くらいのときにルールを覚えましたが、指せる人が身近に居なかったのでほとんど指すことはありませんでした。

それからしばらく経った今年5月に知人から「ハチワンダイバー」を勧められ読んだところ、「将棋ってこんなに面白いゲームだったのか!!」と衝撃を受け、その勢いで本格的に将棋を始めました。

棋風はやや長考・攻め好き・さばき重視の振り飛車党で、好きな戦法は角交換振り飛車、好きな囲いは高美濃囲いです。 指しているのは将棋ウォーズの10分切れが多く、ときどき将棋クエストでも指しています。

好きな棋士藤井猛九段で、勉強も藤井九段の著書を中心に行っています。

やった勉強と所感

最初に読んだのは浦野真彦八段の「初段になるための将棋勉強法」で、そのあとは本の中で紹介されていた紹介されていた本を読んでいきました。

通学時間中に勉強する都合で盤を使いにくいことと一問一答形式が好きなことから、「次の一手」形式の勉強が中心になっています。

いま中心に進めているのは「角交換四間飛車を指しこなす本」「相振り飛車を指しこなす本(第2巻)」「寄せの手筋200」です。

定跡書(戦法書)

とくに効果が高かったのは「羽生善治のみるみる強くなる将棋入門」「藤井猛の攻めの基本戦略」「木村一基の初心者でもわかる受けの基本」でした。あとは「将棋・序盤完全ガイド入門」も観戦の役に立って良かったです。

  • 羽生善治のみるみる強くなる将棋入門:序盤編・終盤編を1回通読。

  • 将棋・序盤完全ガイド入門:振り飛車編・相居飛車編を2回通読。

  • 藤井猛の攻めの基本戦略:1回通読。

  • 木村一基の初心者でもわかる受けの基本:1回通読。
  • 鈴木大介振り飛車のススメ:対穴熊編まで読了。角交換四間飛車を指すことが多くなったため中断。

  • 四間飛車を指しこなす本(全3巻):第1巻の斜め棒銀編まで読了。角交換四間飛車を指すことが多くなったため中断。

  • 振り飛車を指しこなす本(全4巻):金無双VS金無双編を読了。実戦では対美濃囲いが多いので第1巻を飛ばして第2巻を勉強中。
  • 角交換四間飛車を指しこなす本:3週目。

  • 将棋の教科書 現代振り飛車:序盤編を読了。角交換四間飛車の勉強を優先して中断。

  • 将棋の教科書 対振り急戦:序盤編を読了。対振り飛車の戦法を相振り飛車に絞ったので中断。
  • 将棋の教科書 横歩取り:難易度が高かったため中断。

次の一手

他の勉強を優先して中断。必至の勉強が終わったら取り組む予定。

  • ひと目の手筋:駒別の手筋編まで終わって中断。
  • ひと目の端攻め:数問解いて中断。
  • ひと目のさばき:数問解いて中断。

詰将棋

他の勉強を優先して中断。とりあえずは3手詰で十分?

  • 3手詰ハンドブック:1周半して中断。だいたい一瞬で解けるが時々間違える。
  • 5手詰ハンドブック:数問解いて中断。時間は掛かるが半分くらいは解ける。

必至

効率的に詰めろを掛けることができるようになると、相手の頓死を誘ったり詰めろと駒取りの2択を仕掛けることができるので攻めがうまく行きやすく、また寄せの失敗の反動で敗勢になることも少なくなるので費用対効果が高いと感じています。

  • 寄せの手筋200:退路封鎖編まで読了。
  • 羽生善治の終盤術:難易度が高いと判断して中断。

棋譜並べ

未経験なのでノーコメント。

観戦

将棋の勉強を始めた直後に叡王戦が始まったのが幸便でした。他の棋戦もニコニコ生放送で放送があればほぼ見ています。他にも日本将棋連盟ライブ中継で棋譜中継を見ることも多いです。

ただ見ているだけで将棋への意欲が上がりますし、ほかにも「味の良い手」や「さばき」のような言語化されにくい指し回しが感覚的に理解できる気がします。

対局

自動マッチングと戦績ログがある将棋ウォーズか将棋クエストでの対局が中心です。総対局数は10月17日時点で約300戦くらい。 道場は未経験。

指導対局

未経験なのでノーコメント。

戦法別の所感

戦績は全て10/17時点・将棋ウォーズのです。また角交換振り飛車は角交換のタイミングが早いとき*1や相手から角交換されたとき*2、相振り飛車はこちらが先に飛車を振ったときは記録されないのでその分は考慮していません*3

角交換振り飛車:13勝8敗

角交換で角がさばけること、ポイントを稼いでこちらの優位を主張しやすいこと、こちら側から仕掛けることができること、などが楽しくて先手番・後手番問わずエース戦法として活躍中。

戦い方は基本的な四間飛車→向かい飛車からの飛車先逆襲。囲いは美濃囲いと片美濃囲いを適宜使い分け。

飛車のさばきと玉形の差が重要という印象で、とくに相手の飛車を一方的にいじめたり美濃囲いの堅さが生きる展開になるととても指しがいがあります。

ただ序盤で危険なキズが生じやすく、特に角打ちで飛車を攻められる展開になると勝ちにくい印象です。また相手が角桂を持ち駒にしやすいため上からの美濃囲い崩しの手筋が怖いです。

四間飛車:60勝68敗

始めた頃からずっと使っている戦法ですが、最近は角交換できないとき*4のみ採用しています。

囲い別の戦績は以下のとおりです(他の戦法の場合もありますが、大半は四間飛車のものです)。

  • 片美濃囲い:25勝37敗
  • 美濃囲い:38勝48敗
  • 高美濃囲い:19勝26敗
  • 銀冠:6勝11敗
  • ダイヤモンド美濃:0勝1敗 ※囲いを発展させると途中の囲いも含めて全て記録されるので数が大きいです。

振り飛車:4勝15敗

先手向かい飛車・後手三間飛車で金無双に囲うようにしています。四間飛車にしたあとに相振りになったときは向かい飛車に振り直すこともあります。

とにかく勉強不足で、攻撃陣や構想の悪さを咎められる展開で負ける場合が多いです。

現在は美濃囲いと△3三角戦法を勉強中。

  • 金無双:10勝19敗
  • 右矢倉:1勝3敗
  • 美濃囲い:不明
  • 穴熊:なし

今後

とりあえずウォーズで初段になりたい。

手拍子で指して失敗するケース、とくに序盤の駒組みや中盤の攻め合いでのミスが非常に多いので修正していきたいです。

戦法は石田流や中飛車も指したいと思っていますが、手番が限定されることと角交換振り飛車との相性が悪そう*5なので迷っています。とりあえずは角交換振り飛車を磨きたいと思っています。あとは横歩取りと相掛かりを指せるようになりたい。特に横歩取りはめちゃくちゃ面白そう。

*1:飛車を振る前に角交換すると一手損角換わりなどになる

*2:ただの四間飛車になる

*3:向かい飛車・三間飛車・早石田などになる

*4:角道を止められている・相手が振り飛車模様などの理由で角交換が純粋な手損になりそう・原始棒銀などの超急戦を挑んできているときなど

*5:石田流から中飛車から角交換振り飛車から変化するのは難しそうなので、石田流や中飛車を採用すると角交換振り飛車が指しにくくなる

AOJ 0021 Parallelism

平行判定 | Aizu Online Judge
はいはい傾きを比較すればいいのねと思って(y2-y1)(x4-x3) == (y4-y3)(x2-x1)で判定したらWA*1
なんでじゃと思って通った人のコード見て色々試したけど結局WA。しかも通ってるコードすらWAになる。
なんでじゃーってキレてたらどうやらテストケース変わってたらしい…、ということで解法自体変えてACした。


参考

*1:ちなみにダメだったのは誤差死だったらしい。誤差考慮してないコードがACしてた(ように見えた)から気づかなかった…(;´Д`)

2015年度目標

一年の計は元旦にあり、煽ってください。
実績風に難易度で色付した。適宜追加修正していくかも。
最低でも⚫︎を全て達成できるように頑張ります*1

大学

進級と奨学金が危ない。
⚫︎春学期に言語分野で8単位取得する*2
⚫︎年末までに体育に累計30回出席する*3
⚫︎週平均欠席コマ数を1以下にする*4
⚫︎春学期に20単位取る*5
⚫︎春学期の評定を4.4以上にする*6

競技プログラミング

要は1軍昇格とその後の色変化、定期的な出場が目標。
⚫︎はできる気がしないけど次の目標として。
TopCoder Member Profile
w_shunn - Codeforces
いむはた - practice contest | AtCoder

⚫︎SRMでR1200に到達する*7
⚫︎MMでR1200に到達する*8
⚫︎CodeforcesでR1700に到達する*9
⚫︎SRM&CF&ARCに48回出場する
⚫︎MMに6回出場する
⚫︎SRMでR1700に到達する
⚫︎MMでR1700に到達する
⚫︎CodeforcesでR1900に到達する
⚫︎SRM&CF&ARCに72回出場する
⚫︎MMに12回出場する

その他

「いむはた」のプロフィール [pixiv]
DanceDanceRevolution | eAMUSEMENT
⚫︎Pixivに投稿する*10
⚫︎DDR SPで足龍になる*11
⚫︎DDR DPで足龍になる*12
⚫︎SRPGを作る*13

*1:⚫︎とかできる気がしない

*2:3年への進級に必要

*3:4年への進級に必要

*4:履修放棄した科目は考慮しない

*5:自由科目は含まない

*6:奨学金の成績基準として(Aの単位数*5+Bの単位数*3+Cの単位数*1)/(Aの単位数+Bの単位数+Cの単位数)が用いられる(Dは評価に使われない)

*7:1/1現在、R953

*8:1/1現在、R700

*9:1/1現在、R1105

*10:画力向上のため

*11:1/1現在、STR:11 CHA:0 VOL:3 FRE:14 AIR:5

*12:1/1現在、STR:46 CHA:70 VOL:16 FRE:100 AIR:51

*13:FEとかTSBSみたいなのを作りたい

SRM619 ChooseTheBestOne

一時間かかってもバグが取れなかったためカンニングしました

http://d.hatena.ne.jp/torus711/20140505/1399309269

SRM100問解こう(4/100) SRM404 Div1 250 RevealTriangle

未だ4問目なのが大変悲しい。

適当に場合分けしてやるだけ……と思いきやハマってつらい思いをした。
確定できる箇所はforで順番に見ていくことはできない、と思ってwhile使ったけど別にそうでもなかった様子*1

class RevealTriangle {
public:
    vector<string> calcTriangle(vector<string> questionMarkTriangle) {
        vector<string> ret=questionMarkTriangle;
        int k=0;
        
        for (int i=0; i<ret.size(); i++) {
            for (int j=0; j<ret[i].size(); j++) {
                if (ret[i][j]=='?') {
                    k++;
                }
            }
        }
        
        while (k) {
            for (int i=0; i<ret.size(); i++) {
                for (int j=0; j<ret[i].size(); j++) {
                    if (ret[i][j]=='?') {
                        /*
                         ?b
                         c
                         */
                        if (i<ret.size()-1&&j<ret[i].size()-1&&
                            ret[i][j+1]!='?'&&
                            ret[i+1][j]!='?'
                            ) {
                            int b = ret[i][j+1] - '0',
                            c = ret[i+1][j] - '0';
                            
                            int a = ( c >= b ? c - b : c - b + 10);
                            
                            ret[i][j]=('0' + a);
                            
                            k--;
                        }
                        /*
                         a?
                         c
                         */
                        else if (i<ret.size()-1&&j>0&&
                                 ret[i][j-1]!='?'&&
                                 ret[i+1][j-1]!='?'
                                 ) {
                            int a = ret[i][j-1] - '0',
                            c = ret[i+1][j-1] - '0';
                            
                            int b = ( c >= a ? c - a : c - a + 10);

                            ret[i][j]=('0' + b);
                            
                            k--;
                            
                        }
                        
                        /*
                         ab
                         ?
                         */
                        else if (i>0&&j>0&&
                                 ret[i-1][j]!='?'&&
                                 ret[i-1][j+1]!='?'
                                 ) {
                            int a = ret[i-1][j]-'0',
                            b = ret[i-1][j+1]-'0';
                            
                            int c = (a + b) % 10;
                            
                            ret[i][j]=('0' + c);
                            
                            k--;
                        }
                    }
                }
            }
            
        }
        
        
        return ret;
    }
};

*1:終わった後に隣で爆速で通してた赤い人のコードを見たら、 3つ目の制約の意味と、簡単な解法が分かりました……orz