【月一】C++っておいしいの?

はじめに

お待たせ。待った?どうもプログラミングサークルTNP所属の広報担当kurokuです。(キツ…

先日サークル内で役職の引継ぎがあり、見事、広報担当(ブログ・Twitter更新)になってしまいましたなりました。

引継ぎの際に反省会も行われ、更新頻度について触れました。いい機会なので僕の目標というか、目安として(最低でも)月一回はブログを更新していきたいと思います。

 

そうはいうものの、毎月更新するとなると話題がなくなります。ただでさえ僕はグラブル、YouTubeでしか時間をつぶしていない気がするので、こんなことなら別に書かなくてもいいよなぁとか思うわけです。(むしろ書かない方がいい

そこで、サークル室のホワイトボードにブログの題材として質問などを受け付けようと考えました。誰でもいいのでゲーム制作でわからないことやプログラミングについてなどどんなことでもいいので書いてみてください。(コメント等でも歓迎です!

それについて僕が少し勉強して、このブログでできるだけ簡潔に、情報共有ができればなと思います。

(ただ、あまりにおじさんを悩ませるような難しい質問をすると僕の独断でなかったことにしてしまうかもしれません…)

 

C++ってどうなの?

さて、いよいよ本題です!ホワイトボードに早速題材が書いてありました。

「C++について」

 

いやいや。。

(雑じゃない?)

 

まぁいいんです。書きます。こんな感じでどんどん題材ください!

(できればもうちょい具体的に!

C++とは、手続型プログラミング言語であったC言語にオブジェクト指向やジェネリックプログラミングの考えを取り込んだ言語です。それぞれわかりやすく言うと、

・手続型

 プログラムを順番に実行していく

・オブジェクト指向

 オブジェクト(データと処理内容)ごとに独立させる考え

・ジェネリックプログラミング

 型などを意識させないように抽象化して記述する

といった感じ。

一見してC言語をもりもりにパワーアップさせたのがC++といった感がしますが、それは間違いありません。

しかし、そんなC++にも弱点はあります。

それは文法が難しいこと。

 
(僕はC言語由来のプログラムしか書けないのでわかりませんが)多重継承というのを組み込んだせいでポリモーフィズムにも影響が出たりでなかったり(?)
 
 
 
 

よくわかんないですねーー。

 
 
 
ですがサークル内でゲームを作る分には使えて損はないです。ライブラリもリファレンスも結構多めですし、何よりC言語が書ければC++も書ける!

これで終わってもいいんですが、内容がなさすぎるのでどんなことができるのかについて軽く触れたいと思います。

#include<iostream>

#include<string>

int main(void) {

std::string s = “hello”;

std::cout << s << std::endl;  //hello

       return 0;

}

C言語だとchar型の配列で書く必要があった文字列もC++ではstring型(正確にはstringクラス)に格納することができます。それに加え、文字列同士の足し算や部分文字列(例えば”ell”)を取り出したりなんかもできます。

std::cout<<s+s<<std::endl;  //hellohello

std::cout<<s.substr(1,3)<<std::endl;  //ell

#include<iostream>
#include<vector>
int main(void) {
  std::vector<int> vec;
  vec.push_back(0);
  vec.push_back(1);
  vec.push_back(2);
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i] << std::endl;  //0,1,2
  }                   

      return 0;
}

vector型(クラス)は配列とほとんど同じ挙動をします。ただ、宣言の部分で要素数を書いていないにもかかわらず値を格納することができています。

vectorは可変長配列と言われ、要素数を自由に変化させることができます。上の例だと宣言時は要素数は0でしたがpush_back()するたびに自身で要素を増やし格納しています!(push_backは末尾に格納するメソッド(関数))

さらにvectorはジェネリックプログラミングの要素も持っています。宣言する際にvector<int>としていますが、これはint型を要素に持つvectorを宣言しています。たとえばintの部分をdoubleやboolあるいは、自作の型MyDataとしてもvector<int>と同じく扱うことができます!

最後に紹介するのは演算子のオーバーロードです。

関数やデータ構造をユーザ側で定義できるのは知っていると思いますが、演算子についてもユーザが定義することができます!

例えば、

#include
#include
std::vector<int> operator*(const std::vector<int>& vec, const int& t) {
  std::vector<int>v(vec.size());
  for (int i = 0; i < vec.size(); i++) {
    v[i] = vec[i] * t;
  }
  return v;
}
int main(void) {
  std::vector<int> v = { 0, 1, 2, 3, 4 };
  v = v * 5;
  for (int i = 0; i < v.size(); i++) {
    std::cout << v[i] << std::endl;  //0,5,10,15,20
  }
  return 0;
}

と書いてみます。本来vector<int>*intなんてできませんが自分で*を定義することでそれを実現できてしまいます!

しかし、演算子オーバーロードを闇雲に使うと演算子本来の挙動と整合性が取れなくなりとても危険です!詳しいことは各自で調べてもらうとして、できるだけあらかじめ実装されているものを使うようにしましょう。

まとめ

大したこと書いてないのでまとめもくそもないんですが、まぁC++はいろいろ楽だよってことが伝わればいいかなと思います。興味が出てきた人はC++について調べたり、聞いたりして闇をのぞき込んでみればいいと思います。

こんな感じの雑まとめをこれからも月一以上で出していくのでどうぞお楽しみに!kurokuでした~。

ゲームジャム(1年生向け編)

はじめに

こんにちは、3年生のいっちーです。9/27~9/28に1年生向けのゲームジャムを行いました。

今回は1年生向けということで、2年生以上とペアを組んでゲーム制作を行うペアプログラミングを行ってみました。

ただ、ゲームジャムは2日間を予定していましたが、2日目は日程が合わない方が多く、私を含め2名だけの参加でした。なので、1日目と2日目でテーマを変えた実質1日のゲームジャムになりました。


1日目

1日目のテーマは「」「消える」「疾走感」でした。参加者は1年生が3名、2年生以上が3名で丁度良くペアを組むことができました。

なりょー(1年) & まんじゅう(2年)

開発環境:DXライブラリ

落ちてくる雨粒や障害物を避けながらゴールを目指すアクションゲームです。

コードを書く前に、ステージの概略や当たり判定の計算方法などを紙にしっかり書いていたのが印象的で、丁寧にプログラミングをしていると思いました。私は行き当たりばったりで進めていくことが多く、それがバグの原因にもなっているので見習いたいと思います。

T.S.(1年) & ずっきー(2年)

開発環境:Unity

プレイヤーを操作して、落ちてくる雨粒を避けるゲームです。

プレイヤーは雨粒に当たると小さくなっていき、最後には消滅してしまいます。当たり判定はプレイヤーの大きさに依るようで、プレイヤーが大きいうちは避けるのが難しく、プレイヤーが小さくなり消滅寸前になると避け易くなるという、バランスの考えられたゲームだと思いました。

UMA(1年) & いっちー(3年)

開発環境:DXライブラリ

前回のゲームジャムで制作した、鳥を火炎弾で焼き鳥にするストレス解消ゲームの改良版です。

当たり判定や火炎弾の連射の修正、焼き鳥を画面上方向に移動させて昇天させるなど、システム面と演出面で改良を加え、より一層ストレス解消が見込めるゲームとなっていました。


2日目

2日目のテーマは「強靭」「丸い」「焦燥感」でした。

まんじゅう(2年)

開発環境:RPGツクール

ボールをぶつけあうスポーツのようなゲームだそうです。

今回はアニメーションにこだわったようで、ボールがプレイヤーと敵の間を動くようにアニメーションし、ボールを投げている様子が表現されていました。

また、ある条件を満たすとプレイヤーの覚醒イベントが発生し、ステータス向上に加え、強力な必殺技が使用可能になるなど、一方的な試合になっていました。

いっちー(3年)

開発環境:DXライブラリ

ボールを操作して、制限時間内にスタートからゴールまで移動するイライラ棒のようなゲームです。

ボールには慣性が働いており、床には傾斜がついているので、思いのほか操作の難しいゲームになりました。また、壁に当たると加速度が反転します。


おわりに

制作期間がほぼ1日と短い時間でしたが、1年生全員がゲームを完成させることができたので、ペアプログラミングは成功と言えるのではないでしょうか。TNPはほとんど個人制作で今回のように複数人でゲーム制作を行うことがないので、これをきっかけにチームでプログラミングする機会が増えればいいなと思います。

「#月間競技プログラミングは役に立たない」が変わってきたという話 と 俄然出ないやるきの話

https://twitter.com/natanakane/status/1179389159368212486

こんばんえるえる〜

研究が一向に進まない四年生のガナリヤです。
本当に進まないです、どこから手を出していいかも分からず、そういう状況になるとさらに研究のやる気がアになります。

そいういう状況なのでTNPのブログに逃げています(おい)
久々のポエム枠です。


競技プログラミングとは

上記を参考にしてください。
日本でいちばん有名な競技プログラミングのサイトのAtCoderが去年書いたブログです。
競技プログラミングの説明や、最近の社会の変化に対する流れが出てきました。

https://atcoder.jp/contests/abc142/tasks/abc142_b

初めて競技プログラミングの問題を解くなら上の問題などがよいです。

– for
– scanf
– printf

が使えれば解ける問題ですね、意外と競技プログラミングは他のアプリ制作やウェブ制作に比べると簡単だったりします


月間競技プログラミングは役に立たない

このブログのタイトルは「月間競技プログラミングは役に立たない」に関するものです。

この#月間競技プログラミングは役に立たない とはなんでしょうか?

競技プログラミングは、いわゆる「アルゴリズム」や「計算量」を考えて、如何に素早くコーディングするか?を競うスポーツです。


例えば上記に上げた問題なら

– forを書ける
– ifを書ける
– scanfが使える

をどれぐらいのスピードで間違いをすることなく書けるか?
という力が身につきます。

また、競技プログラミングはいわゆる「プログラミング筋肉」が身につきます。
どういうことかというと
「ぷよぷよ作りたいんだけど、ぷよが繋がっている判定どう作ろう」
というのが、一瞬で書ける力です。

昔はさっぱり出来ませんでしたが、競プロを初めて一年半ほどたった今は、迷うことなく書けるようになっています(実際に書いていないのでおそらくですが(おい))

競プロの楽しさといえばやはり、土曜日の夜21:00~22:40のコンテストで、リアルタイムに順位が変化するところと、それの結果によって、レートがダイレクトに決まるという点だと思います。
出るだけだとレートは伸びないし、下がることのほうが多く、強くなるしかレートは伸びないです。
ただ、それだけレートが伸びると非常に嬉しい気持ちになれまs

そんなこんなで、ハマると楽しい競プロなのですが、10年ほどまえから「競技プログラミングは実務で役に立たない」という論争が毎月のようにTwitterで行われていました。

特に、このころはまだ競技プログラミングの名前が世間で非常に薄く、情報オリンピックもまだ影が薄かった時代です。

そのため、いわゆるアルゴリズムを得意としない(得意分野がアルゴリズムではなく、他の開発系に向いている人)としばしばTwitterで論争が起きていました。


役に立たない時代から(一部)必要とされる時代へ

そんな論争もこのまえもまたTwitterで起きてました。

「競技プログラマーのコードは簡潔で、計算量のためなら可読性を下げたコードを書く。実務にとって、邪魔だし読み辛い」

みたいな論争でした。

ここらへんが勘違いされやすいところですが
「競技プログラマーはできるだけ計算量を減らす人間」ではないです

どちらかというと「計算量考えなくていいなら、簡単な実装・読みやすい実装を選ぶ」人間に、強くなるほどなっていきます。

理由は単純で、計算量の制約ないなら別にどんな解法でも良いからで、楽に書いて早めに提出したほうがレートが上がるからですね。

そんなこんなで、競技プログラマーはたしかに「アプリ」や「システム」「ファイル構成」などは苦手ですが、「汚い」コードとは必ずしもは言えないかもしれないです。


話がそれてきたので戻します(何も考えないで書いているので)

最近(僕はまだ二年弱しかやっていないですが)、非常に競技プログラミングの幅が就活・社会で広がってきているなと感じています。

先週の日曜日、コンテストで東京に行ってきました。

スポンサーは軒並みに太いです(僕は頭わるいし開発がガバなので入れませんが・・・)

競技プログラミングのスポンサーは、ここ数年非常に強いところが揃っています。

  • Google
  • Yahoo Japan
  • KEYENCE
  • MUGEN(画像処理+ロボットアーム 三ヶ月で収入が倍になってるらしい、こわいね)
  • Sky(人工知能)
  • Free
  • KLab(ラブライブの開発とか)
  • Future(アルゴリズム、人工知能)

今回のコンテストのスポンサーもYahooと電通で太い感じでした。

どうしてコンテストのスポンサーが比較的強いのかというと、新しい企業ほど(成長率の高い企業ほど)、より強い改革・そして海外に勝つための新しい技術を必要としています。

特に、競技プログラマーの

  • アルゴリズム力
  • 考察力
  • 実装力

を必要としています。(これは罠で、別に競技プログラミングやってない天才のほうが多分多いのですが)

また、DeepLearning系の会社も競技プログラマーを非常に欲しています。

新しいDeepLearningの開発や実装をするとなると、論文の公式を読んでそれを再現すること、そしてさらに拡張することが必要になります。
そういう力が競技プログラマーはすでに持っているため、必要とされるわけです。

先週のコンテストでFutureの人も、競技プログラマーを取る率が高く、競技プログラマーは他のこともできると言ってました


海外だとHackerRankを筆頭に、既に競技プログラミングで就職・転職することが当たり前になってきています。
日本だと情報の流通と、そもそもやる気の差が激しいので広まりません。

ただ、競技プログラミングが求められている仕事があるので
全員がそれにつくべきでないし、ウェブもアプリもゲームもありとあらゆるジャンルが必要であるため、そういうことになってほしくはないのですが
やはりこれからのプログラミングの3大テーマ

  • 人工知能
  • ビックデータ
  • IoT

を考えると、さらに競技プログラミングをやっている人間ほど有利になっていくんじゃないかと思います。
月間競技プログラミングが役に立たない が 簡単には否定できない時代が来たように思えます。
僕は開発ができないのでアですが・・・


やる気の話

ポエム枠なので、あとまだ寝る時間にははやいのでやる気の話をします。

というのも現在研究室で新しく入るB3と勉強会を一緒にしたい、といろいろとねっているのですが、結局「やる気」の話に陥ってしまうからです。

大学生は結構プログラミングができる子・できない子が非常にはっきりします。
文法が分からず、アプリなど動くものを作ったことがない子も居て、いわゆる下から上まで幾度となく居ます。

ただ、僕が思っているのはみんなプログラミングができないということはなく、むしろ「そういうプログラミングができるようになる機会がなかった」
が正しい表現だと思っています。

僕は1,2年生のころ、文法を暗記することに必死で、無駄な努力をしていました。

当然楽しくありませんし、しょうもないこと(C#のIE系とか)で時間を無駄にしていました。(これは無駄)ラムダ

ただ、僕はゲーム制作、そしてなにより競技プログラミングに出会って、レートが伸びて、オンサイトにいって、ある程度の満足感を得ることが出来ました。

プログラミングができない、やる気のないという人はおそらく、この「成功体験」や「承認欲求」を満たしたことがないんだと考えています。

一度、レートが伸びる、ゲームをプレイしてもらう、アプリを作ってTwitterにあげてFavをもらう、Qiitaに投稿する

こういう成功体験 をしているかいないかで、プログラミングに対する目的意識などが変わるんだなぁって思っています。

話がまとまらないので、まとめるとB3との勉強会でどうやる気を引き出すか?や、そもそもやる必要がないんじゃないか、迷惑なんじゃないか

など色々考えて、僕は何が楽しいんだろうなぁって考えるようになったということです

僕はやる気が他の人よりも強い人間ではなく、趣味もなく、お金をかけたいと思うことがないので(にゃん)

僕はゲームジャムは非常に賛成で、きっかけさえあれば、プログラミングが嫌い・できないが少しずつ変わると思っています。(コンテストがあって出れませんでした、ごめんなさい(次は是非出たいです!))
ゲームジャム・アプリ制作・競技プログラミング・Qiita・ウェブ制作、など、何でもいいのでなにか作ると決めて、それを外部に公開して遊んでもらう、成功体験をするのが大事なのだなぁと(終りが見えなくて焦っています)


寝る時間になったのでにじさんじ見て寝るます

グダグダ書きましたが、研究が進んでいません。
こういうダメ人間にならないように、やる気がモテる人間になってください
僕はそういう人になれなかったので、きょうも進んでいません

なんかつまらない話・ポエムすぎるのと、暗いので次の記事では「本当の技術系(Neo4jらへん)」か「にじさんじの推しライバー」を書きます

見返してないので、結構変なこと書いてるかも

ゲームジャム(夏休み編)

はじめに

 こんにちは。2年次のまんじゅうです。
記事を書くのは初めてなので、変なところとかあるかもしれないですが、どうか温かい目で読んでくれればと思います。

 今回のゲームジャムは8月14日と15日に開催しました。お盆でしたがそこそこ参加者がいて嬉しかったです。
 また14日、15日のどちらも猛暑日だったので、誰も熱中症にならなくて良かったと思います。

 今回はお題に沿って何か作るのではなく、なるべく自分で考えて制作する、という方向で企画していました。
 そのため、お題ではなく、あくまで何を作るか思いつかない人への救済措置として「倉庫」、「火」、「駐車場」、「重力」、「落とす」という単語を提示しました。

作品紹介

1年次 UMA

開発環境 DXライブラリ

 初年次講義で扱った「フラッピーバード」のソースコードを元に作ったそうです。
飛んでくる敵を避けたり、うまく弾を当てたりしてスコアを稼ぐゲームとなっています。
 元にしたゲームがある、という点を加味しても、初めての制作物としては完成度が高いと思いました。

2年次 たか

開発環境 DXライブラリ

 卍型の自機が卍の先端から放つ攻撃を敵に当てる、というゲームのようです。
攻撃を放つと、次の攻撃が可能になるまでの待機時間が発生したり、敵がランダムで生成してされた瞬間に攻撃されないよう、
敵の攻撃不能時間を設定していたりと、細かいところまで作り込んでいると感じました。

2年次 まんじゅう

開発環境 Siv3D

 「街コロ」というボードゲームを作ってみようと頑張ってました。
ダイスを振る機能と、出た目による建物の効果の処理は実装できたのですが、
 時間が足りなかったために建物購入の処理が完成せず、ゲームとしてはまだ成り立っていない状態です‥。

2年次 ズッキー

開発環境 Unity

 今年の夏コミに出した迷路ゲームを改良したものだそうです。
ランダムで壁を生成するようにし、それによって起こりうる詰み状態を防止するために壁を壊す機能を追加したそうです。
 また、壊した壁の種類と枚数によってゲーム終了時のスコアが増減するようにして、高いスコアを出すにはしっかり迷路を歩かないといけないようになっていました。

3年次 いっちー

開発環境 Unity

 なんと時間内に2作品完成していました。
 1つが火事の建物から人を避難させるゲームで、円形の足場を操作して障害物を避けつつ、小島まで避難させる、というものでした。
足場で人がバウンドする上に、小島が小さいため、難易度は高そうに見えました。


 2つめが、人を前に飛ばして、乗るとジャンプするキノコを駆使して停止するまでの距離を競うゲームでした。
地面に人がぶつかって転がり、その先のキノコに当たってまたジャンプ、という動きをしていたので、見ていて面白かったです。

3年次 うおちー

開発環境 Unity

 下に重力がかかっている空間で、上下に移動して火の玉を避けるゲームです。
当たり判定が実装できていないとのことですが、ゲームとしてはほとんど完成しているように感じました。

最後に

 やっぱりゲームジャムは良いですね。
他の人のアイデアやコードの組み方などを見て学べる機会になりますし、自分の制作活動への意欲も高まります。
 夏休みは長いのでだらけてしまいがちですが、今回の会でのやる気を思い出して頑張って制作していこうと思います。

TNPBOX 2019 夏コミver.

こんにちは。

TNP会長のいっちーです。

C96に出品する「TNPBOX 2019 夏コミver.」が完成いたしました。

内容は以下の通りになります。

  • 【β版】「普通の」RPG
  • smartball
  • スネークゲーム
  • 森の魔法使い
  • 迷路ゲーム
  • TNP BOX (ゲームランチャー)

表紙絵

制作者 : ハイブリッジ(1年次)

作品名の「TNPBOX」をイラストに落とし込み、当サークルのイメージキャラクター、TNP子とマッチさせた素晴らしい作品です。

絵が描けない2、3年次に代わり、 1年次のハイブリッジ君が描いてくれました。


【β版】「普通の」RPG

制作者 : まんじゅう(2年次)

開発環境 : RPGツクールMV

タイトルに「普通の」とある意味深なRPGゲームです。

今回はβ版ということで、完成版は”RPGアツマール”に投稿する予定だそうです。

※ゲームの途中で、数秒毎にエラーメッセージが表示される不具合が確認されています。その場合はお手数ですが、一度ゲームを再起動してくださいますようお願いいたします。


smartball

制作者 : うおちー(3年次)

開発環境 : Siv3D

昔懐かしのスマートボールがパソコンで遊べます。

ボールの入る判定が絶妙で、ついつい熱中してしまうゲームです。


スネークゲーム

制作者 : Yuta(3年次)

開発環境 : Pyxel

レトロな雰囲気が素敵なスネークゲームです。

ヘビの通った道が軌跡として残る、一風変わった仕様となっています。


森の魔法使い

製作者 : いっちー(3年次)

開発環境 : DXライブラリ

敵を倒し、アイテムを集めてゴールを目指すアクションゲームです。

動くブロックや消えるブロックなどの様々な仕掛けを用意し、遊び応えのあるゲームに仕上げました。


迷路ゲーム

製作者 : ズッキー(2年次)

開発環境 : Unity

ユニティちゃんを操作してゴールを目指す、3D迷路ゲームです。

滑らかなアニメーションと快適な操作性が、飽きを感じさせません。

俯瞰視点を切り換えられる親切設計です。


TNP BOX (ゲームランチャー)

製作者 : でったー(2年次)

開発環境 : Siv3D

シンプルで洗練されたゲームランチャーです。

ゲーム起動時にはランチャーが自動的に隠れるようになっており、ゲームの邪魔にならないように工夫されています。

上記で紹介した5つのゲームをこれ一つで起動し、遊ぶことができます。


以上、6つの作品が入った「TNPBOX 2019 夏コミver.」を100円で頒布いたします。

月曜日 南地区 ”ユ” ブロック 36a 」でお待ちしておりますので、ぜひお越しください!!

ICPC2019国内参加記 team_YARUDAKE編

初めまして!二年生のkuroku(でんそん)です。サークルのブログをはじめて執筆するのでどんな雰囲気で書けばいいかいまいちわかりませんが、先日行われたICPC国内予選の感想などを伝えられたらなと思います!

我々の先輩方の参加記(Tech_ONS編)もあるのでそちらも合わせてご覧ください!

(ブログ慣れてないのでリンクとか参考とかはTech_ONS編から飛ぶか自分で調べて!)

チーム概要

そもそもチームについてなんですが、他の有名つよつよ大学に比べてうちの大学の競プロer人口が少ないです(それはそう

なので、チームを組むにあたってはサークル内のゲーム制作ニキ(AtCoderにはお触り済み)たちに声をかけて一緒に出てもらうことになりました。

いっちーさん、まんじゅうくんありがとうございました。

準備としては国内模擬の際の1完でやばいと感じつつ、全探索とグラフのおべんきょをがんばったつもりでした(つもりね

国内予選当日

1コマ目の授業が監督の先生の授業だったので終了後挨拶に行って、リハーサルを一通りやって昼食、一つ授業を挟んで14:30にガナリヤさんと同着で会場入り。

なんとなく早く来たものの、普段VisualStudioの設定はそのままでやっているので環境構築RTAの練習もせず、1完はやだなぁとか考えていました。

そんなこんなで16:30になり、コンテストが始まりました。ほとんどのチームはA、Bあたりは分担して解くと思いますが、自分たちのチームはとりあえず3人で1問解こうみたいな感じの方針でした。

A問題は苦戦することなくAC(列が生徒だったのが少し気持ち悪かったですが(転置とったらどーですか

B問題は現在の座標を持って二重ループを回し、始点と終点のマンハッタン距離を測っていきました。しかしサンプルケースの答えが合わずインデックスがずれたか見てると、決定ボタンを押した回数も答えに入れるよと教えてもらい提出。実行時に9sくらいかかってたけど無視して提出したらACでした。

C問題に取り掛かり、mの制約をみて全探索っぺぇ~と思いながら考察へ。見立て通り分銅は「左に乗せる」、「右に乗せる」、「乗せない」の3通りしかないのでO(3^m)だとわかったのですが実装ができん(あれ、全探索。。。

30分くらい詰まったのでいったんDを見に行って、「これ、AtC●derでやったとこだ!」と思いつつよくわかりませんでした。順位表を見てもCを飛ばしてDをACしているチームは少なかったのでまたCに戻って頭を悩ましていました。

長いようで長かった3時間が過ぎ、初めてのICPC国内予選は2完という結果でした。感想としては全探索がしっかりかければ3完できそうだなぁっていうのと、チームでコンテストに参加するのはたのしいってところでしょうか。

今回の後日談(まとめ)

最近競プロ以外のことに目移りしまくりでしたが、ICPCはモチベ上昇にもなってもっと精進したいと思いました。

コンテスト終了後にガナリヤさんにC問題を教えていただいて、そういう勉強会的なのも面白いと思います。(もっと競プロerが増えればやってもいいねっておっしゃっていたのでもっと増えてどうぞ

ぼく個人の目標は今年中にAtCoder水色になることで、来年のICPCでは4完したいですね。(なお今のratingは…

まんじゅうくんも前回のABCでC問題を解けていたので来年は水色行けるでしょ(鼻ほじ←C解けなかったやつ

後輩たちにもどんどん競プロでハラス布教して勉強会できるくらいの人を集めてみたいですね。

来年のICPCに向けていろんな希望をもったところでこの記事を締めたいと思います。

以上、kurokuでした~!(文字だらけでごめんね!

ICPC2019国内参加記 Tech_ONS編

最近,大学で何を学んだんだろう,何をしてきたんだろう,といろいろ複雑なお気持ちな,四年生の老害,ガナリヤです

今回は,07/12(金)に開催されたICPCプログラミングコンテストのインターネット予選の参加記を適当ながら書いていこうと思います

おそらく,あとでYARUDAKEチームからも参加記が上がると思います(上がるよね(老害))


開始前

午前中,授業だったり研究のお話だったり色々と辛いお気持ちになっていました(かなしいね

かなしくなったので,14:30に会場である部屋に先入りしました(今回,監督員の先生には,この時間帯に部屋を予約してもらうなど,多くのご協力をいただきました.頭が上がりません.あとで感謝の品を持っていこうと思います.)

部屋に入る途中,後輩のkurokuくんに出会いました
覚悟がちげえまろ

早く来すぎたかなと思いながら,持参したUSキーボードの準備やパソコンの立ち上げなどをしていました(大学のキーボードはJISなので)

その後,チームメンバーのsiiiecや三年生のいっちーなども来て,時間を無駄にしていました(集合早すぎた,ごめんなさい)

今回,Tech_ONSは全員が四年生で研究室や,自分の場合入試勉強など非常に忙しく,国内模擬予選しか通し練習が出来ていませんでした.
そのため,自作ライブラリはほとんど去年ので,おそらくバグだらけだったと思います(使わなかったので尚良)

今回持ってった本は

の三冊です(普通だな!)

あと,マスコットとして,ニコニコテレビちゃんと,プロ生ちゃんのアクリルスタンドを持っていきました,かわいいね(かわいいので

だらだらsiiiecと話していると,C_avaも来て,打ち合わせをしながら時間を潰しました
全員研究室が違うので,集まるのは大学でもそうそうないんですよね
四年生って研究するけど,研究できなくないか?

そんなこんなしていると,16:30になり,ICPCが始まりました


ICPCコンテスト

問題リンク

位表リンク

今回のICPCは,去年と同じく最初の方針は同じで

  • C_avaがVisual StudioRTAをする
  • siiiecがA問題を通す
  • ganariyaがB問題を通す
  • CはC_avaのC
  • Dを三人がかりでなんとかする

みたいな感じでした
あと,誰かが解法を書いている間に,エッチなテストケースを書いて嘘を落とす,みたいな方針でした

プリンターの前でganariyaとsiiiecが待機して,C_avaが印刷をしました

B問題を見ると,あ^〜ってなる感じの問題でした
簡単じゃ〜んって思いながら,平気でBFS書いていました(無駄)(戦犯)

コンテスト終了後,kuroku君の解法をきいて,マンハッタン距離でいいじゃんってなりました
今回,自分のミスが響いて結構無駄な計算量を書けてしまいました
次のAtCoderなどのコンテストからは,わかっても,一分追加で考察をしてからコーディングを行おうと思いました

B問題の嘘解法(重すぎ)が生えた時,siiiecがコーディングしてました,はやい

C_avaのエッチなテストケースも通ったので,Aを通すと,そりゃもうAcceptでした,嬉しい

(A問題結局どういう問題だったんだろ)

その後,自分がB問題を解いて,当然遅い実行時間でしたが,Acceptはできました
色々と反省が残るコンテストでした・・・

Bをお通ししたあとは,三人でCをいちゃこら考えていました

C問題は,$3^N$で全探索すればいいな〜ってなって,その後ganariyaとsiiiecで詰めながらコーディングしてました

いま思い返すと,このCも実装をミスっていて,実行時間が肥大化してました
本当に思い返すとなんでそんなコード書いてるんだ?ってぐらいしょうもない実装を書いてて悲しくなりました,ほんとだめだめです

C問題を実行しながら,まあ答えが出れば通るやろ〜〜って,言いながらD問題に移りました

D問題は,カウンタをえいえいする問題で,なんかいやらしい問題だなってなりました(ぱっと見簡単だけど,多分むずい)

三人で考察してると,C問題の出力が出たので,投げるとWA(は?

とりあえず紙出力して,自分がCのデバッグ,
siiiecとC_avaでD問題の考察をしていました

Cは結局,分銅を追加しなくてもよい薬は先に取り出す,という操作でうまく行きました
この処理は,最初に提出する前に一度書きかけて「いらないか!」となって消したのですごい悔しい
すべてが裏目に出ている

Cはその後足りない処理を書き足したら,結局通り,再びD問題で停滞しました

三人で色々と考察を行い,C_avaとsiiiecで実装を始め,サンプル地獄になっていました

その後も色々と考え,セグ木+DP?って思いながら考察してたら非情にも時間になりました

Tech_ONSは今年もまた,3完で幕を閉じたのです


振り返り+老害より

今年のICPCでは,Tech_ONSは
495チーム中,138位で終わりました

お気持ちとしては,悔しいというお気持ちと単純に力不足だったという感覚です

B, Cでガバ考察をしてしまったので,本当に申し訳ないし悔しいです

また,やはり三人がかりでも僕たちだとまだD問題は解けず,これが解けるようにならないと安定してアジアに行けないんだなと思いました(Dの解法は結局DPでした(DはDPのD))

嬉しい点としては,後輩チームが初参加で2完をしていて,頼もしいなと思いました
TNPの競技プログラミングを始めた二年生も合計4人?(自分のおそらくの観測上)になり(最近かなりTNPから増えていて嬉しい),秋田大学もどんどん競技プログラミングや,他のアプリ制作のコンテストに出て,どんどん秋大が強くなればいいなと思いました

このチームTech_ONSで出場するのはおそらく今年で最後なので,アジアに行きたいなぁと思っていました

結果としては駄目でしたが,非常に貴重な経験が出来たので,競技プログラミングを初めて本当に良かったと思います

来年以降もTech_ONSとして自分が出られるかは現状分かりませんが,来年以降も秋田大学で後輩チームがICPCに参加し,アジア大会への切符を掴んでほしいと思いました.


是非,このICPC・競技プログラミングの文化がTNPに続いて,来年以降の後輩チームが国内大会・アジア大会で活躍する姿を老害として見守りたいなと思います.

ガナリヤでした!


YARUDAKE編も見たいなぁ|・`ω・)

ICPC国内模擬戦2019 Tech_ONS参加記

こにゃにゃちは〜〜
ひとまず色々と片付いて,色々と吹っ切れてきたガナリヤです.
将来設計がだいぶ怪しくなってまいりましたねこれは

最近,いろいろとVTuberといい,Twitterといい,ヒリつきすぎていて,嫌な情報社会になってきたなあって感じますね


さて,今回,TNPのメンバーからなる2チーム「Tech_ONS」と「team_YARUDAKE」がICPC国内模擬予選(https://jag-icpc.org/?2019%2FPractice%2F%E6%A8%A1%E6%93%AC%E5%9B%BD%E5%86%85%E4%BA%88%E9%81%B8)に参加したので,参加記をまとめておこうと思います(最近投稿も無かったので)


本番一時間前

研究室にこもって面接練習をしていたガナリヤは,ウキウキでTNP部室に向かいました,当たり前ですね
研究室はなんかジメジメしていて,お気持ちが下がるのでア

TNP部室には,すでにsiiiecとkurokuくんがいて,設営が始まってた感じでした

ちなみに僕の所属する四年チームはTech_ONSでganariya, siiiec, C_avaで構成されています.
二年,三年チームはteam_YARUDAKEで2年生二人と3年生d絵構成されています.

設営に取り掛かりましたが,色々な問題が発生してて終始ドタバタしていました.
具体的には

  • siiiecのパソコンが印刷機ようになりそうになり,自分のmacbookが候補になる
  • 自分のmacbookをディスプレイにつなぐケーブルがない
  • C_avaが到着し,Windowsをつけるも,Wifiになぜか繋げない(結局あれはなぜ?)
  • siiiecのパソコンをなんとか持ってくる(印刷機PCを別に用意した)
  • Visual Studioの設定がうんち(僕はよくわからないので,お気持ち担当していました)

多分,本番当日もグダグダになるので,早めに集まろうね!って思いました,反省

僕はこのグダグダというか,ドタバタしながらコーディングしたり考察するのがICPCの楽しいところなのかな?って気がしますね


デュエル開始!(14:00)

14:00からついに模擬戦が始まりました〜〜
長さは三時間で結構長いねって思うかもしれませんが,全然足りないんですよね(11問でるので,無理)

上記の問題文は(https://jag-icpc.org/?2019%2FPractice%2F%E6%A8%A1%E6%93%AC%E5%9B%BD%E5%86%85%E4%BA%88%E9%81%B8%2F%E5%95%8F%E9%A1%8C%E6%96%87%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88)

らお借りしました

僕は印刷係だったので,A・B問題を印刷
C_avaはテンプレートの写経地獄
siiiecはA問題の考察をしてました

A・B問題を印刷し終わったところ,siiiecはA問題の解法が生えたらしい 早い 僕いらなくないですか?

そんなこんなで,C_avaが設定してくれた(縁の下の力持ち)テンプレートで,siiiecがコーディング始める

見た感じ大丈夫そうだったので,僕はB問題に行く


B問題は毒の沼地っていうやつでした.

$100{\times}100$マスのうちに,通れるマスと,毒のあるマスがあります.
あなたは最初$(x_i, y_i)$に居ます.
そして,合計100回$(to_{x_i}, to_{y_j})$に順番に移動したいです.
このとき,毒のあるマスを通る回数を最小にしたいです.合計何回ですか?

みたいな問題です.

0-1BFSじゃ〜〜ん(やるだけか?)ってなり,一応考え直してから,僕0-1BFSの書き方知らないってなる(は?)

C_avaが圧縮しようとしていて,それはつらたんではってなる(ぶん回すのが国内戦だと正義なので)

結局仕方がないので,ダイクストラっぽいBFSで誤魔化す実装をすることにする.
なんとなく書いたところ,案の定プログラムが終わらない.

目grepすると,Q.pop()(priority_queueからポップをしてない)をしてない,これ何回目でしょうか

それを外すと,時間はかかるけどうまく動いているっぽいので,現代のCPUとメモリに感謝を捧げて,siiiecとC_avaが考えているC問題に移る

結局,A問題・B問題はAC出来ました


C問題にうつると,C_avaとsiiiecが唸ってた

C問題もグリッドの内容で
上下左右斜め好きな方向に1マス進むと,その1マス先に,廻小宮が生える.
その廻小宮の太刀筋の位置に入らないように繰り返し移動し,目的にまで行く場合最小回数は何回ですか?

みたいな問題.多分よくわからないと思うので問題文を読んでください

C_avaが図示して,説明してくれた.これ答えでは?

サンプルをみると,なんとなくX座標とY座標の絶対値の足し算に,+1か−1かそのまま,みたいな感じがある(優しいね)

僕は考えたくなかったので(こういう問題基本的に僕は解けない),とりあえず偶奇で分ける発想に三人で至る

すると大体の場合は上手くいくが,偶数と奇数のときに例外が発生する感じがある.(偶数が0のときと,0以外の偶数のとき)

とりあえずここで,偶奇以外は自分が実装しておいた

すると,C_avaとSiiiecから片方0ならこれ,そうでないならこの処理!みたいな指示が来たので,実装する,実装汚いね(反省します)

ICPCを信じて,お祈り提出をすると通る
テンション上がりますねこれは,これだからICPCやめらんねえんだよなこれ

二回目の提出も通る,嬉しい,サンプルのおかげ ありがとう全てにありがとう(藤岡弘)

ここで,大体一時間40分経過.ここから地獄のD問題が始まる


D問題は

編集距離のDP問題があるよね!
それに,もう一つの追加で回転(先頭の文字一個を文字列の末尾に持っていくよ)が追加されてるよ!
文字列$X$を文字列$Y$に変形するのにかかるコストを求めてね?

みたいな問題.

ここで発生した問題は,誰一人として編集距離覚えてないことなんですよね(笑い事ではない)

編集距離のアルゴリズムを覚えてないので,その場で自分が編集距離の解法を生やす
半年前の自分が勉強していたので,有能(忘れていたのはぐう無能)

編集距離のアルゴリズムは出たのはいいものの,回転をするDPがよくわからない.

C問題で味をしめた僕たちは,とりあえず回転の回数を全探索しようみたいになって,全探索してみる.

色々試すと,サンプルが合う
これだからICPCはやめらんねえんだよな〜って言いながらSubmitしたら,WAしました

そっからどうしてもD問題の解法が生えない
順位表見ても,また今年もC問題とD問題に大きな崖が出来ていて,やっぱり4完が必須なんだなって思った

C_avaとsiiiecはE問題に行ってしまう(基本的にD解けないときは,Eは絶対に解けないので,今回の国内予選は順位表を見ながらDに専念したい みんながEを解いてたらEに行く戦法を取りたい)

Eは,最大クリークに落とし込む問題だったみたいです,ライブラリ自体持ってないので(こんなん出してええんか?)

結局Dが解けないまま,三時間が経ちました,無情



結局そういうわけでTech_ONSはABCの3完で180チーム中51位でした.
4完が40チームあるのと,本番は500チームぐらいあるので,やはり4完しないと厳しい感じがします

残り時間もだいぶ短くなってきました.
もう一回アジア大会に出れるように,頑張ろうと思います
ガナリヤでした!

Top