2020年4月22日水曜日

【C#】競プロ用にSegmentTreeのライブラリを作ったよ!

SegmentTreeってセグメント木とかセグ木とか色々に呼ばれているので検索するの苦労しません?
あなたはどのワードでここに辿り着きましたか?

先にコードを載せます。超普通のセグ木になります。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace Library
  6. {
  7. public class SegmentTree<T> where T: struct
  8. {
  9. private readonly T[] data;
  10. private int size = 1;
  11. private T defaultValue;
  12. private Func<T, T, T> function;
  13.  
  14. public SegmentTree(int size, T defaultValue, Func<T, T, T> function)
  15. {
  16. while(this.size < size) this.size *= 2;
  17. this.defaultValue = defaultValue;
  18. this.function = function;
  19. data = Enumerable.Repeat(defaultValue, this.size * 2 - 1).ToArray();
  20. }
  21.  
  22. // [a, b)
  23. public T RangedValue(int a, int b) { return RangedValue(a, b, 0, 0, size); }
  24.  
  25. private T RangedValue(int a, int b, int now, int l, int r)
  26. {
  27. if (r <= a || b <= l) return defaultValue;
  28. if (a <= l && r <= b) return data[now];
  29.  
  30. return function(RangedValue(a, b, now * 2 + 1, l, (l + r) / 2), RangedValue(a, b, now * 2 + 2, (l + r) / 2, r));
  31. }
  32.  
  33. public T this[int index]
  34. {
  35. get
  36. {
  37. return data[size + index - 1];
  38. }
  39. set
  40. {
  41. index += size - 1;
  42. data[index] = value;
  43. while (index > 0)
  44. {
  45. index = (index - 1) / 2;
  46. data[index] = function(data[index * 2 + 1], data[index * 2 + 2]);
  47. }
  48. }
  49. }
  50. }
  51. }

以下工夫した点

  • Genericsの型であるTに値型の制約を与えた
  • indexによるアクセスでより直感的に
  • ぐう短い

2020年3月31日火曜日

「Atcoderで水色になるまでにやったこと」を書きます


グラフが歪すぎる。

自己紹介



名前:アスラト
言語:C#
コンテスト出場回数:22回
入水時点のACCount:330

画像の通り競プロはやったり辞めたりしていました。
個人ではほとんどありませんがゲーム製作でプログラムを書いています。
ちなみに製作でのC#は二年ほどのブランクがあります。実質競プロ専用言語。

やったこと



大きく三段階に分かれています。
時系列順に並べましたが、「この順番でやるべき」という意味ではありません。
  1. AtCoderProbremsで古い時期のC問題と簡単なD問題を毎日解いた
  2. 125番目以前でD問題のDifficultyが水〜青色なABCを時間制限をつけて解いた
  3. 「レッドコーダーが教える、競プロ・AtCoder上達のガイドライン」を半分くらい解いた
上の三点とC#の話について書きたいと思います。


AtCoderProbremsで古い時期のC問題と簡単なD問題を毎日解いた



具体的にはABC64以前のC, D問題を1日1問以上を目安に解きました。
Streak数は驚異の41!すごい!ほめて!





誰も褒めないので私が褒めます!えらい!
大学で帰る前に図書館に行って問題を解いてから帰るという生活を送っていたおかげですね。
このように競プロを強制的に触れる環境を作り習慣化させました。
最初のアプローチとしては正しかったと思います。

一方でアルゴリズムに関しては大学の授業程度の知識しかありませんでした。(蟻本未購入勢)
過去問中に知らない解き方が出てきたらグーグルで検索する......といったことを繰り返し行ってきました。
これは非常に無駄が多くお勧めできません。
先に体系立ったアルゴリズムの学習または速解きの練習から始めることをお勧めします。


125番目以前でD問題のDifficultyが水〜青色なABCを時間制限をつけて解いた



古い時期でそこそこ簡単なC, D問題が枯渇し始めてからこちらに移行しました。
AtCoderのバーチャルコンテスト機能を利用してA〜D問題まで解きました。
こちらの目的は専ら速解きです。

特に茶〜緑色で
「D(orE)問題は無理!しかもC(orD)問題で大量に時間を消費した!」
という時はぴえん😭な結果になることを身を持って体験してきたはずです。
ある程度解けるようになったらどこかで速解きの練習はした方がいいと思います。
あとバーチャルコンテストで私と対戦しましょう!


「レッドコーダーが教える、競プロ・AtCoder上達のガイドライン」を半分くらい解いた




みなさんこれをやりましょう。学習に向いている問題ばかりです。
ちなみに「半分」である理由は、解いている最中に水色に昇格しただけで深い理由はありません。
これのおかげかは分かりませんが、解き始めた3/5辺りからレートが急上昇したのでみなさんやりましょう。

振り返って



振り返ると「体系的学習→演習」の流れを完全に崩してしまった気がします。
蟻本等で勉強した上で上述のリンクをクリアし、その後速解きの練習をすると要領良く水色に昇格できると思います。
ただ1, 2番目の演習を先であっても私の血肉になりえたことはここに明言させていただきます。

C#はぶっちゃけどうなの?



C#の良い点はそこそこ速くて綺麗に書けることです。
LINQの暴力だけでなく、入力部分を工夫するだけでもC++より簡潔に記述できます。(関連:【C#】手抜き競プロライブラリ〜入力編〜
其を侮る勿れ、短く書け得ることはそれだけ伸び代を残していることを意味します。
C++よりも一歩先のレートに足を伸ばせるかもしれませんね。実際私も水色になれたわけで。

とはいえ、速さ及びライブラリの充実度においてC++には到底叶いません。
速さは言わずもがな、C#には優先度付きキューも平衡二分木も順列列挙も存在しません。
加えてどマイナーな問題を解くとC#で提出している人が極端に減ります。

ではなぜC#を使うのか。理由は「使えた」ことと「関数型」です。
そもそも「関数型を使って綺麗に速くかけるようになりたい」という願望から私の競プロ生活が始まりました。
そして新たに言語を学ぶ気になれなかった私は、当時使えたC, C#, Java, JavaScriptの中からLINQがあるC#を選択したという歴史的な背景が存在します。

最後にC#もとい競プロの言語についてめちゃくちゃ良いこと言うので聞いてください。

競プロをする目的が競プロならC++にしろ。そうでないならなんでも良い。

これが私の結論です。
何をするにも言えますが、目的や目標の明確化を心がけると良いと思います。

今後



私の当初の目標は水色になることでしたが、まだ上昇の余地が残されているのでもう少しだけ続けてみようと思います。
青に昇進できてもできなくてもまた記事を書きたいですね。

P.S.
水色に昇進することを入水って表現するのすこ

2020年2月18日火曜日

dmmのデイリーパチンコの大当たりを一月で二回引くの巻

2020/2/7に大当たりを引いて、


2020/2/18でまた大当たりを引きました。


結構すごくないですか?確率低いと思うんですけど。

2019年12月27日金曜日

【C#】手抜き競プロライブラリ〜入力編〜

最近競プロを再開しました。
競プロやってたって言えたらかっこいいじゃないですか。
目標は水色。

今日は基本中の基本かつ速度の大幅な向上を期待できる入力のライブラリをご紹介します。

といってもStreamを使ってどうたらこうたら......とかはしないです。

あくまで自分の理解を越えない範囲で、コスパの良い書き方を目指しました。
  1. class Input {
  2. static IEnumerator<string> enumerator = new string[] { }.AsEnumerable().GetEnumerator();
  3.  
  4. public static string Line => Console.ReadLine();
  5.  
  6. public static string[] StrArr => Line.Split(' ');
  7.  
  8. public static int NextInt => int.Parse(NextWord());
  9.  
  10. public static long NextLong => long.Parse(NextWord());
  11.  
  12. public static List<int> IntList => StrArr.Select(int.Parse).ToList();
  13.  
  14. public static List<long> LongList => StrArr.Select(long.Parse).ToList();
  15.  
  16. public static string NextWord() {
  17. while (!enumerator.MoveNext()) {
  18. enumerator = StrArr.AsEnumerable().GetEnumerator();
  19. }
  20. return enumerator.Current;
  21. }
  22. }

うーん、NextWordだけ"()"が必要なあたりすごく手を抜いてる感が出てますね。

NextInt等はJavaのScannerに挙動が近いです。(Scannerの宣言ないけど)
  1. var a = NextInt;
  2. Console.WriteLine(a);

こんな感じ。

賢い点はenumeratorの初期値に空のstringを入れていること。
これによってwhile文の条件式が簡潔に済ませられます。

コードはご自由にどうぞ。間違いがあったらごめんね。

2019年9月15日日曜日

【ASTRALCHAIN】クリア後の感想とちょっとしたアドバイス

ネタバレは回避します。

筆者について



各FILE(章)の最後にクエスト等の遂行度合いをリザルトとして確認できます。
私は各FILE平均2個程度のクエストを逃していました。
ASTRALCHAINでは実際に現地に赴かないとマップに表示されないクエストが存在するので注意が必要です。

難易度はFILE04まで「有利」、簡単すぎたのでそれ以降「拮抗」に切り替えました。
「有利」での残機は7でしたが、減る前に全て倒せていました。
まあ「拮抗」に切り替えた途端死にまくってゲームオーバーになりましたが。

クリア時間は30時間弱。想定通りらしいです。

地形



私が力説するより紹介映像見た方が早そう。



綺麗っすね。

キャラメイクの部分で主人公の誕生年が2058年と読み取れます。
舞台は近未来的なSFがベースとなっており、マップにもその仕掛けが組み込まれています。
繁華街とか情報量が多すぎてすごい(小並感)
またIRISという情報統合装置?(動画サムネの機能)もSFの味を引き立たせることに成功しています。

欠点は上下移動が弱すぎる(特に上方向へジャンプできない)点です。
物を破壊した際にアイテムが高いところに落下し取れない事態がままあります。
本作の舞台は人工島で、当然フィールドも人工物ばかり。
必然的に高低差のあるマップが多いのですが、それが操作で活かされていない気がします。
ついでに戦闘時も上下の操作性が低いので飛行ユニットへの攻撃手段が限られてしまいます。
分かるんですよ。ボタンが足りないからジャンプできないって。
でもせっかくだし欲しかったよなぁ。

キャラクター



プラチナゲームズは尻がすごいと言われていますが、あんま関心なくて申し訳ないw
男主人公デフォルトマンなので女主人公やキャラメイクの感想とかもありませんし。

リアル路線を追求した脱中世ファンタジーゲームは、もれなく不気味の谷との戦うことになります。
本作はある程度リアル路線に進みながらもギリギリのデフォルメ度合いで粘れていたと思います。
ただ結局童顔さが残る女主人公(男主人公の場合は妹)が一番可愛くて、美人扱いされる人達はいうほど......
気になる人は公式サイトで見てみましょう。
妹ちゃんは声ついて動くとより可愛くなりますよ!

ストーリー



ムービー部分で真っ先に抱いた感想は「映画みたいだった」です。
漫画やアニメよりも映画。力入ってるなぁと。
とにかくキャラクター達が違和感なく動くんですよね。
何気ない場面でも待機モーションがヌルヌル動いたのは衝撃でした。
またきっちりフラグを回収しつつも読めない展開が合わさる塩梅が優れていました。
ただ終幕して全てが明らかになったかというと微妙さが残ります。
しっかり考察すれば解決してくれる?

音楽



ゆっくり曲を聞けたの主題歌しかない説。
戦闘中に会話が挟まらなくとも曲を聞く暇などありません。
だってそういうゲームの作りになってますもの。
非戦闘中はグラフィックに頭のリソースを奪われていたのでやっぱり聞いていません。
もう一周しないと音楽の良さを享受できないかも。

戦闘



「戦闘が難しい」「覚えることが多すぎる」という意見が見られましたが、チュートリアルが非常に親切だったので気になりませんでした。

本作の戦闘は「チェインバインド+シンク」や「ジャストレギオン+シンク」を獲得することで真価を発揮します。
プラチナお得意のヒットストップが加わり脳汁ドバドバですよ。
ここから本当に戦闘が楽しい。

不満な点はカメラワークの正解が分からなかったこと。
...と思ったけどカメラの回転スピード速くすれば解決するかも。あとでやろ。

まとめ



最近物量でゴリ押すゲームが多い中で短く太く仕上げた作品は貴重です。
SF, アクション, 短時間クリア この3点に興味を持った方は購入をおすすめします。

買ってから知りましたが2本でお得 ニンテンドーカタログチケットがめっちゃお得。
ぜひご検討ください。

2019年9月7日土曜日

ふるーつふるきゅーとを遊んだ

ふるーつふるきゅーと(R18版)をやってみたんですよ。
最序盤の仕掛けとかちょっと面白かったんですけど、それより驚いたのが声優の若本さん(セルとかアナゴさんとかの人)っぽい人が出てたこと。
ただの声真似ならいいんですけど(良くないけど)、もしそうなら仕事を選べと言いたい。幾ら何でも謎すぎる。

2019年9月6日金曜日

家に蜘蛛とかいう害虫がきた

家に蜘蛛が出るようになってしまいました。
穴を塞いでなんとかやりすごしたいと思ってるんですが、まあその前にインターネットで調べてみようと。


蜘蛛を退治するなと言うけど君たちねぇ
家に蜘蛛の巣を作っててその下に大量のふんがあったり、放置してたパーカーに繭を作ってたりするわけですよ。
もうホラーですよホラー。残さず駆逐してやるからな。きつい柑橘系の芳香剤とカフェインドバドバのコーヒー飲みまくってやるからな。覚悟しろ。

2019年9月5日木曜日

ニコニコでのアニメ視聴の優位性

最近ニコニコは落ち目だのなんだの言われますがやっぱコメントって強いんですよね。

アニメを見てる時って別のことしたくなりませんか?
それじゃあと二画面で別の作業をすると、
「よく見てなかった。もう一回見るか。」
となってしまいがち。

別作業を加えると大幅にキャパオーバーしてしまいます。
ちょうどよくアニメと平行作業できるのはなにか。
そう。コメントを読むことです。リソースがぴったり。
もう私はコメント抜きでアニメ見れない体になってしまいましたね。

2019年9月3日火曜日

牛乳を飲め

今日は自作ゲームもASTRALCHAINも進展がなかったので話すことないんですよね。
しかしこれまでちゃんとだいたい毎日更新できていたのにここで途絶えるのは勿体無い。

ということで今日は牛乳を飲みましょうという話です。

プログラマーの人って、食事を忘れるほど没頭するので痩せている人と、ずっと物を口に運んでいるので太っている人のどちらか一方に属する人が多いらしいです。
私は前者なのですが麦茶だけはちゃんと飲んでいたんですよね。
しかし麦茶の栄養素なんて微々たるもの。痩せたい人が飲むものですよねこれ。

今まで麦茶だったのを牛乳に置き換えてみると案外よかったです。
だって成人男性の摂取カロリーまで届くんですもの。
私の肌トラブルって栄養の欠如から来るんじゃないかと思う時がたまにあるんですよね。

やっぱり平均より大きくずれていると不幸を呼びますよね。
みなさんもいつもより栄養のあるものを飲んでみるのはいかがでしょうか。

2019年9月2日月曜日

【ASTRALCHAIN】プレイ日記190902

まとめサイトの広告欄とかでASTRALCHAINの情報をほとんど見ていないのでこのゲーム大丈夫なん?と心配していました。
6時間くらい遊びましたがしっかり面白かったです。
ムービーは映画を見ている感覚。
セリフを言っている時の待機モーションとかもしっかり作られているのはすごいです。
難点をいうならゼノブレ2やゼルダで慣れきったジャンプ要素がなくて、
「ここでジャンプできたらなあ」
と度々思ってしまうことです。
まあ本当にそれくらいしか見当たらないのですごい楽しいです。