矮小

井の中の蛙

ユーリ!!! on ICE 第2話 技術寄りスケオタ的注目ポイント

第2話は割とコメディ寄りでした……が、それでもフィギュアスケート的な注目ポイントがいくつかあったので自分の備忘録代わりに記録しておきます。Twitterでも他のスケオタの皆さんが思い思いにツイートしていたのを見ましたが、とりあえずフィギュアスケートの技術面についての要素だけ記載していきます。3点しかないのにいつの間にか文量がめっちゃ増えてしまいましたが、解説用の動画は今回もたくさん置いているのでそちらを見ながらゆっくり読んでいってください。

イーグルから2A

(2Aって何? と思った方は前回の記事をご覧ください ヴィクトルの演技を見てジャンプを見分けられるようになろう - 矮小

f:id:Nagoyan:20161014214349p:plain

プリセツキーがアイスキャッセルはせつに到着してリンクインした後のニキフォロフの練習シーン。上の画像のように両足を180度広げて滑る形を「(スプレッド)イーグル」と言い、現在のフィギュアスケートで言うところのムーブズ・イン・ザ・フィールド(一定の姿勢を保ったまま滑る動作)の一種となっています。単なる要素*1間のつなぎやコレオシークエンス、そして上のシーンのようなジャンプ前の予備動作にも用いられます。

少し余談となりますが、フィギュアスケートの技術要素にはそれぞれに対して-3から3までのGOE (Grade of Execution)という出来栄え点が考慮され、要素ごとに設定された基礎点に加えてGOEによる点が加点・減点されます。GOEの点数をそのまま加えるのではなく、要素ごとにGOE1点あたり何点加点・減点というルールが決められています。実際の点数表(競技規則ではScale of Value, SOVと呼ばれています)を見てみたい方はCommunication No. 2000を開いてみてください。

www.isu.org

また、ジャンプ・ステップ・スピンのそれぞれについて、「こういうことをしたら・こんな感じだったらGOEに考慮しましょう」というチェックリストがあります(これも上のファイルに記載されています)。で、今回取り上げたジャンプ前のイーグルは、そのチェックリストの中の “clear recognizable steps/free skating movements immediately preceding element” つまり「ジャンプ直前に明確で分かりやすいステップ、またはフリースケーティングムーブメントを行う」に該当するというわけです(たぶん)。

GOEの詳しい採点方法についてはこのサイトが最新のはず。

tororinnao.info

で、これをジャンプ前だけでは飽き足らずジャンプ後にまで付けてしまったのが2シーズン前の羽生結弦

youtu.be

動画は2014年グランプリシリーズ中国杯ショートプログラム。演技最初の3Aはジャンプ前後にイーグルを付けています。姿勢が制限されるというだけ(それでも難しいですが)のジャンプ前ならまだしも、ジャンプ後にイーグルを付けるためには極めてクリーンに着氷してその後のスケーティングの流れを作ることが必須となるので本当に大変なことです。また、ジャンプ後のイーグルは、GOE加点要素の “good extension on landing / creative exit” に該当するというメリットもあります。ちなみに、この羽生のイーグルでジャンプを挟む一連の動作はスケオタに「イーグルサンド」と呼ばれるようになりました。

イーグルから3Aの実施を集めた動画がこちら。というかこんな動画あるのか……。

イーグル - 3A 集 by あみの スポーツ/動画 - ニコニコ動画

ちなみにイーグルの状態に加えて膝から上を一気に後ろに反らした状態を「クリムキンイーグル」と言います。日本人でよくやっているのは宇野昌磨

www.youtube.com

動画は2015年グランプリファイナルのフリースケーティング(オペラ『トゥーランドット』より)。演技終盤、『誰も寝てはならぬ』のクライマックスをクリムキンイーグルで魅せます。

クリムキンやべえ!!!!! と思ったあなたはこちらへどうぞ。

www.nicovideo.jp

さらに余談。イーグルは両足のスケーティングラインが揃っていますが、これを前後にずらすと「イナバウアー」になります。そうです。イナバウアー」はスケーティング時の足の形を指す言葉であり、上体を反らしながら滑ることを言うのではありません。今日この記事を見てくださった方はお願いなのでこれだけでも覚えて離脱していってください。ちなみに上体を反らしている部分は「レイバック」と言います。上体を反らしていれば大体何でもレイバックなので「レイバックスピン」もあります。

荒川静香のレイバックイナバウアーがこちら。

www.youtube.com

動画は2006年トリノオリンピックフリースケーティングより。演技終盤、『誰も寝てはならぬ』の主題に入ったところでレイバックイナバウアーを披露しています。足を180度に開き、さらに脚を大きく前後にずらしているのが分かると思います。

コンパルソリー

f:id:Nagoyan:20161014230501p:plain

第2話Bパート中盤、勝生がリンクで練習していたのは「コンパルソリー」。

そもそも「フィギュアスケート」は、直訳すれば「図形のスケート」。フィギュアスケートが競技として始まった時は、スケート靴のブレードのエッジに乗って、いかに氷上に綺麗な図形を描けるかを競っていました。これが実際にフィギュアスケート競技会に導入された時の種目名が「コンパルソリーフィギュア」、日本では「規定」とも呼ばれていました。1990年を最後に競技種目としてのコンパルソリーは完全に廃止されましたが、そもそも氷上で綺麗な図形を描くことはすなわち上質なスケーティングにつながるため、現在でも練習の際にコンパルソリーのようなことが行われています。このコンパルソリーの練習によって一気にフィギュア界のスターダムへと駆け上がっていったのが日本の町田樹

インタビュー 町田 樹|キヤノン・ワールドフィギュアスケートウェブ

ちなみに当時のコンパルソリーの競技風景はこちら。言ったら悪いですが競技風景としてはだいぶ地味です……。

www.youtube.com

えばらさんのおかげで勝生のコンパルソリーに気付きました。ありがとうございます。ちなみにこのシーンの時僕はTwitterを見てました(集中しろ)。

『愛について』2つの編曲

作中ではEros/Agapeと同じ曲について2つの編曲が用意されていますが、今年は偶然似たようなプログラムに挑戦する選手がいます。それは浅田真央

www.youtube.com

www.youtube.com

曲はどちらもバレエ音楽『恋は魔術師』より、ファリャ作曲のRitual Fire Dance。ショートプログラムはピアノ編曲、フリースケーティングはオーケストラ編曲になっており、ショート最後のポーズがフリー冒頭のポーズと同じになっているところからも2つ合わせて1つのプログラムになっていることが分かります。膝をやっているようなニュースを見かけて心配ですが、今年も浅田の良い演技が見れたらいいなと思うのみです。

*1:フィギュアスケートで言う「要素」は「技術要素」、つまりジャンプ・ステップ・スピンのことを指します

ヴィクトルの演技を見てジャンプを見分けられるようになろう

ユーリ!!! on ICE第1話を見た皆さん、生きてますか? 僕は5回ぐらい死にました。

ところでこんなツイート

をしたところ、案の定「よくわからんけどすごいことは分かった」「というかそもそもジャンプの見分け方とか分からん」という声が散見されました。フィギュアスケートのジャンプは6種類しかないので体操の技などよりも名前が覚えやすいですが、ジャンプの踏み切りは一瞬で行われるためかなり集中して見なければならず、僕もちゃんとフィギュアスケートを見始めてからリアルタイムでジャンプをコールできるようになるまで2シーズンぐらいかかりました。

せっかくユーリ!!! on ICEを見るなら、ジャンプの見分け方を覚えてハイレベルな作画にスケオタ的視点から感動できるようになろう! そして10月下旬から始まるグランプリシリーズでもジャンプを判別しながら演技を見られるようになろう! ということで、この記事では第1話のBパートで流れたヴィクトル・ニキフォロフフリースケーティングの演技中の画像を使ってジャンプの種類を説明していきます。演技中のジャンプ構成の順番は無視して、判別しやすい順に載せていきます。

ジャンプの説明に「右足」「左足」という言葉が出てきますが、これはすべて多くの選手が行う反時計回りで回転する場合です。時計回りで回転する場合は左右を逆転して読み替えてください。時計回りで回転するジャンプに慣れるには、(両方とも女子ですが)アメリカのアシュリー・ワグナーやイタリアのカロリーナ・コストナーの演技を見ることをお勧めします。

アクセル

f:id:Nagoyan:20161006222156p:plain

この画像の進行方向は右。つまり前向きに跳び上がります。前向きに跳ぶのはアクセルのみなので一番分かりやすいです。着氷するときは必ず後ろ向きなので、「N回転アクセル」と言ったらN+0.5回転することになります。基礎点も6種類の中では一番高いです*1。回転数を数える時は「パッと見の回転数に1を足す」または「最初に後ろ向きになったところで0から数え始める」のがオススメです。

現実のフィギュアスケートでアクセルが得意な選手は日本の浅田真央……と言いたいところなのですが、ここではあえて伊藤みどり無良崇人を挙げておきます。

www.youtube.com

2本目のジャンプがトリプルアクセル。着氷が乱れてますが、ジャンプの回転方向によろけているので回転しすぎたということが分かります。おそロシ……日本だった……。

www.youtube.com

無良の筋肉で跳ぶジャンプも絶品。トリプルアクセルは3本目のジャンプですが、余裕があって回転がゆっくりなのでダブルアクセルと見間違えそう……。

トーループ

f:id:Nagoyan:20161006224621p:plain

写真は演技終盤の4回転トーループより。ここから左足のトーで蹴って跳び上がります。左足のトーで蹴るジャンプはトーループのみ。基礎点は一番低いですが、N回転アクセルよりもN+1回転トーループの方が点数が高くなるように設定されています。

フリップ

f:id:Nagoyan:20161006225212p:plain

フリップとルッツは右足のトーで蹴って跳び上がります。違いは跳び上がる時の左足の向き。左足が体の中心に対して内側(インサイド)になっているのがフリップです。

4回転フリップは4月に日本の宇野昌磨が昨シーズンの最終戦であるコーセイ・チームチャレンジカップで成功し、10月1日に行われたジャパンオープン(ここでも成功)ではギネス記録認定式が行われました。

www.youtube.com

これが世界初の4回転フリップ。現実では宇野昌磨の代名詞が4回転フリップになってほしい。

ルッツ

f:id:Nagoyan:20161006222105p:plain

ルッツもフリップと同じ右足のトーで蹴って跳び上がりますが、その時の左足は体の中心に対して外側(アウトサイド)になります。左足の向きが回転軸に向かって反しているという大変な跳び方であり、アクセルを除いて一番基礎点が高いジャンプになっています。

跳び上がる直前に左足を回転軸から反らすという不自然な動きをしなければならないので、跳び上がる瞬間に左足がグニっと外側に傾いたらルッツ、ということが多いです。ちなみに、ルッツを跳ぼうとして跳び上がる瞬間に左足がインサイドになってしまうと「エッジエラー」という判定を受け、基礎点が0.7倍になってしまいます(フリップを跳ぼうとしてルッツになってしまった時も同じ)。フィギュアスケートの採点は原則として「実施しようとした(事前に提出した)要素 (attempted)」ではなくあくまで「実際に実施された要素 (executed)」を基準とします*2が、ルッツとフリップの判定はその例外ということになります。

www.youtube.com

4回転ルッツと言えば中国の金博洋 (Boyang JIN)。昨シーズンシニアに上がってきたと思ったらいきなり4回転ルッツを成功させたのは(ジュニアから追ってなかった人は)びっくりしたと思います。この映像はショートプログラムでタンゴ・アモーレというフィギュアスケートではよく聞くタイプのタンゴですが、フリープログラムは「映画『ヒックとドラゴン』より」という年相応の曲目でかわいかったのでそちらもお勧めです。

サルコウ

f:id:Nagoyan:20161006234229p:plain

残り2つはトーで蹴らずにエッジが着氷したまま脚力で跳び上がるタイプのジャンプです。サルコウは右足を左に一気に振り上げて、左足のエッジで踏み切って跳び上がります。右足を振り上げる直前に両脚がハの字になることが多いです。サルコウトーループの次に点数が低く、場合によっては4回転トーループよりも4回転サルコウの方が得意という選手もいます。日本だと村上大介

www.youtube.com

演技冒頭で2本の4回転サルコウに成功しています。特に2本目のサルコウは跳び上がる直前に脚がハの字っぽくなっているのが分かるかと。演技終盤のステップシークエンスで解説が笑っているのは足がズルッと滑ってしまったからです。グランプリシリーズの大会で1位になれる貴重なチャンスで緊張してたのかも?

ループ

f:id:Nagoyan:20161006235245p:plain

ループは右足のエッジで踏み切ってグイっと回転します。ジャンプの着氷は普通右足で降りるので、連続*3で跳ぶコンビネーションジャンプのセカンド・サードにはトーループかループしか付けられないことになります。上の画像は後半のトリプルアクセルの後のセカンドジャンプ。画像のように、跳び上がる直前に脚を曲げるため、椅子に座るような姿勢になることが多いです。

日本人選手でループジャンプを挙げるなら浅田真央。コンビネーションジャンプのセカンドに3回転ループを付けることもよくあります。

www.youtube.com

2本目のジャンプはトリプルフリップトリプルループ。セカンドジャンプは助走がほぼ無いところから脚力だけで跳ばなければいけないので、特に爪先で蹴ることができないループをセカンド以降に付けるのは大変です。まあ浅田はそんなことも知らず後半でトリプルフリップダブルループダブルループの3連続ジャンプを跳んでいるわけですが……。

演技中にこなさなければいけない要素を覚えよう

J SPORTSのサイトが超優秀です。みんなもスカパーを契約しよう。

www.jsports.co.jp

詳しいルールを読みたければ、ISUがテクニカルパネルハンドブックを公開しているのでそれを読むことをお勧めします。

Single & Pair Skating - ISU

JSFが日本語訳を作っているはずなんだけど見当たらない……。ありました!!!

|Japan Skating Federation Official Results & Data Site|

このサイトの「ISU ハンドブック」→「シングル」が該当する競技規則書です。

フィギュアスケート要素検索

このページのおかげで気づきました。このページも要素記号について詳しい説明が書いてあるので興味のある方はぜひ見てみてください。

略号を使ってTwitterで快適に演技の実況をしよう

ジャンプの見分け方を覚えても、演技を見ながらツイートする*4ときにわざわざ「トリプルアクセル」とか入力するのは大変です。そこで、実施された演技の詳細が記載される「ジャッジスコア」のようにジャンプやスピンを略号で表すと、入力字数を減らせて何かと便利です。

ジャンプ

アクセル: A, ルッツ: Lz, フリップ: F, ループ: Lo, サルコウ: S, トーループ: T

ジャンプ記号の前に回転数を付けて、例えばトリプルアクセルは ‘3A’ のように表記します。コンビネーションジャンプは ‘3A+3T’ のように表記します。さらに、ジャンプ記号の後に特別な記号を付けることがあります。

  • 演技後半のジャンプ(基礎点1.1倍): x
  • 回転不足(1/4から1/2不足している。V列点数): <
  • ダウングレード(1/2以上不足している。1回転下の点数になる): <<
  • エッジエラー(ルッツ・フリップの踏み切りを間違えている。V列点数): e (edge)
  • 不明瞭なエッジ(減点されないが、GOEに影響する): ! (attention)
  • 3回転以上の同じ種類のソロジャンプの2回目(3回転以上の同種ジャンプは最低限片方をコンビネーションジャンプに組み込まなければいけない。基礎点0.7倍): +REP (repeat)
  • ショートプログラムで単独ジャンプではあるがジャンプコンビネーションと判断された要素(ショートプログラムでは必ず1本のジャンプコンビネーションを入れなければいけない): +COMBO
  • ジャンプシークエンス(ステップなどを挟んで連続ジャンプを跳ぶ。基礎点0.8倍): +SEQ (sequence)

「基礎点 n 倍」は、基礎点にnを掛けて小数第3位を四捨五入するので小数第2位まで数えます。一方「V列点数」は点数表のV列を参照します。V列の点数は基本的には基礎点の0.7倍を小数第2位で四捨五入して小数第1位まで丸めたものなので、前者の「基礎点0.7倍」とは微妙に異なる点数になります。テレビの実況・解説ではV列点数のことも「基礎点0.7倍」と言っていることが多いですが、厳密に点数を計算したい場合はこれらの点数がわずかに異なることに注意したいところです。

「点数表」はISUが公開しているScale Of Valuesを指します。ここには男女シングル(とペア)のすべての技術要素とその点数が載っています(以下はPDFファイルです)。

http://static.isu.org/media/1003/2000-sptc-sov-and-goe-2016-2017_revised-july-14.pdf

その他にも、リザルトに記載されることはありませんが、ジャンプ中に片手を挙げるとtano, 着氷後に氷上で勢い余って回転してしまうとot (over turn), 着氷後に着氷した方とは反対側の足を「おっと」といった感じで氷上に出してしまうことをso (stepping out), 着氷後に転倒してしまうことをfallと付記することで、そのジャンプがどんな状況だったかを示すことがあります。

スピン

スピンの種類は、(スピン前にジャンプ(フライング)をするか・しないか)×(途中で軸足を変えるか・変えないか)×(シット・キャメル・アップライト・コンビネーション(1つのスピンで複数の姿勢シット・キャメル・アップライトすべての姿勢になる(16-17シーズンから改定)))で、16通りの略号があります。フライングエントリーの場合はF, 軸足を変えた場合はCを付け、その後に姿勢*5を示すS/C/U/Coのいずれかを付記するとスピンの略号が完成します。一番大変なフライングチェンジフットコンビネーションスピンの場合は ‘FCCoSp’ となります。さらに、スピンの場合はどれだけスピン中にいろいろな要素をこなしたかによって1から4の「レベル」が認定されます。ジャッジスコアの略号では ‘FCCoSp4’ のように表記されます。

ステップ

ステップにはステップシークエンス: StSq と、イーグルやイナバウアーなどのムーブズ・イン・ザ・フィールドを伴うコレオグラフィック・シークエンス: ChSq の2種類のみです。StSqは1から4のレベル(レベル1も認定されなければB)が認定されますが、ChSqは必ずレベル1でGOEのみで評価するため常に ChSq1 になります。

実例

ユーリ!!! on ICE第1話で披露されたヴィクトル・ニキフォロフの演技構成を略号で書き下すと、4Lz 4F 3A CCSp FSSp 4Sx 3A+3Lo+2Lox StSq 3Lzx 3Fx 4T+3Tx CCoSp3p となります。尺の関係か ChSq っぽいところが見当たらなかったのと、3A+3Lo+2Loxの信憑性がかなり低い(勝生の3Loっぽいのはヴィクトルの3Aを流し直したのかもしれない?)など問題点が少しありますが、フィギュアスケートのプログラムを略号で書き並べるとだいたいこんな感じの雰囲気になります。

実際のフィギュアスケートの国際大会ではジャッジスコアなどを含むプログラム終了後即座にを公開することになっており、まあだいたい「isuresults 2016 world」みたいな感じでググるとPDFファイルがすぐ見つかるので適当に読んで慣れていきましょう。ジャッジスコアが読めるようになれば、大会の映像が見られなくても選手ごとにどんな演技が行われたかを確認することができるのでとても便利です。

最初から要素に集中して演技を見ていてもよく分からなくて楽しくないので、まずは好きな選手を見つけてウォッチすることをお勧めします。EDの表現にもあったようにたいていの選手はTwitterInstagramで他の選手と仲良くしているのでそっちを楽しむのもアリだと思います。もしフィギュアスケートの魅力に気付いたならば、10月下旬から行われる現実のグランプリシリーズも観戦しましょう! 日本のテレビ放送は解説が要素をコールしてくれるので、自分で判別できるようになるためにはとても勉強になります。

www.tv-asahi.co.jp

それでは皆さん、良いスケオタライフを! 誤記や加筆点などあったらコメントよろしくお願いします。

変更履歴

2016-10-08 21:30頃 +COMBOを+REPに修正しました。+COMBO記号はもう使われていない……はず。

2016-10-09 01:50頃 ヴィクトルの演技構成ラストのCoSpをCCoSp3pに訂正しました。コンビネーションスピンで3つの基本姿勢すべてをこなすと3pという記号が付きます。

2016-10-15 21:45頃 コンビネーションスピンの要件を最新のルールに変更しました。16-17シーズンからはコンビネーションスピンは3つの基本姿勢全てをこなすことが前提となるため、上の行で書いてあるような従来のCoSp3pという表記は単にCoSpという表記になり、2姿勢しかこなせなかった場合はV記号が付いて基礎点が減点される(点数表のV列の点数になる)という考え方になります。ヴィクトルの演技構成の略号例については2p/3p表記があるシーズンだろうという仮定(根拠は特にない……)に基づいて変更はしません。昔のプロトコル(ジャッジスコア)を読むには当時の変更前のルールを把握していないといけないので大変です……。

2016-10-15 22:00頃 ISU競技規則の日本語訳があるページを発見したので追記しました。このページどうやって検索するんや……。

2016-10-22 19:50頃 +COMBO記号は男女シングルのショートプログラムで使われるので追加しました。

2016-11-04 23:55頃 2週間以上前に付いていたブコメに今さら気づいたので修正しました(+COMBO記号についてはタイムリーなタイミングで修正してましたが)。ブコメは僕に通知来ないので間違っている点があったらコメント欄でお知らせください😢

2016-12-25 22:45頃 毎日安定して200PV以上あって怖くなってきたのでattempted/executedの部分の文をより詳細にし、「プロトコル」と書いていた部分を主に「ジャッジスコア」に修正しました。ジャンプに関わる記号と点数計算の少し詳細なところも記述しました。

*1:余計に半回転しなければいけないからというよりは前向きに跳び上がることがめちゃくちゃ難しいからという方が大きいです

*2:3回転アクセルを跳ぼうとしたら途中で体が開いてしまい2回転アクセルになってしまった場合は「2回転になってしまった3回転アクセル」という視点ではなく「空中での回転で大変余裕があった2回転アクセル」として採点される、という感じです。多分

*3:プリティーリズムでは5連続ジャンプとか跳んだりしますが、フィギュアスケートのルールでは1回のコンビネーションジャンプでは3連続までしか跳べません

*4:まあ演技見るときぐらい集中しろという話もありますが……

*5:ISUのテクニカルパネルハンドブックの真ん中らへんに参考画像が載っています

Codeforces 119 A Cut RibbonをDPで解く

簡単なDPの良問を見つけたので「DP分からんから競プロやめます」という人向けにメモ(僕もEditorialが理解できずに辞めかけました(8割嘘です)).

問題

長さが  n のリボンがある.これを長さ  a, b, c を単位としてカットしたい.カットされたリボンが最も多くなるようにカットした時のリボンはいくつになっている?

考え方

リボンをカットしていくことをシミュレーションしようとすると,リボンがどんどん短くなっていくので実装するときに配列の位置と残りのリボンの長さが逆になってややこしい.この問題を,「長さ  a, b, c のリボンのパーツがそれぞれ無限にある.これらをつなぎ合わせて長さ  n のリボンを作る.リボンのパーツが一番多くなるように作った時,使われたパーツの数はいくつ?」というふうに読み替えてみる.

入力例の1つ目 n, a, b, c = 5, 5, 3, 2 で考える.まず,リボンの配列 r を作り,r[a], r[b], r[c] をそれぞれ1で初期化する.この初期化は,はじめにリボンの位置0からそれぞれ長さa, b, cのリボンのパーツを置いたパターンを記録しておくことを意味する.r はこの事象が重ね合わせで記録されていることになる.

[0, 0, 0, 0, 1] ■■■■■
[0, 0, 1, 0, 0] ■■■□□
[0, 1, 0, 0, 0] ■■□□□
↓
[0, 1, 1, 0, 1]

次に,この配列 r を頭から走査していく.r[i] が1以上ということは,ここまで一番多くのリボンパーツを使って長さ  i までやって来たことを意味する.このとき,位置 i から新たに長さa, b, cのリボンパーツをつなげることを考える.位置 i に対して長さ  e のリボンパーツをつなげることを考えよう.このとき,長さ  i + e まで他の方法でより多くのパーツを使ってたどり着いているかもしれない.すなわち,今まで長さ  i のリボンを作ってきた方法にさらに長さ  e のリボンパーツをつなげる方法と,他のやり方で長さ  i + e のリボンを作る方法のうち,より多くのパーツを使っている方法を選ばなければならない.これは r[i + e] = max(r[i] + 1, r[i + e]) として表せる.maxの第1項が前者,第2項が後者に対応している.

上の例でシミュレーションしてみよう.インデックスはリボンの長さ,中の数はそこまで使った一番多くのパーツ数を意味している.

 1, 2, 3, 4, 5  ← i
[0, 1, 1, 0, 1]
    ↑ 最初は i = 2
[0, 1, 1, 2, 1]
    i     ↑ 長さは 2 + 2 = 4. パーツの個数は 1 + 1 = 2.
つまり,この時点では長さ4まで長さ2のリボン2つを使ったと言える
[0, 1, 1, 2, 2]
    i        ↑ 長さは 2 + 3 = 5. パーツの個数は 1 + 1 = 2.
長さ5のリボンを1つ使うより,長さ2と3のリボンを1つずつ使ったほうが
個数が多くなるので r[5] が更新された
長さ2に長さ5のリボンパーツをつなぐと必要な長さ5からはみ出るので省略

[0, 1, 1, 0, 1]
       ↑ 次は i = 3
[0, 1, 1, 2, 2]
             ↑ 長さ: 3 + 2 = 5, 個数: 1 + 1 = 2
r[5] は長さ2と3のリボンパーツをつなげた2個が最大だった
長さ3と2のリボンパーツを使っても個数は同じ
これよりあとのパターンは全て全体の長さ5をはみ出すので省略

この手続きを右端まで繰り返すと,r[5] は長さ5まで最も多くのパーツを使った時の個数が記録されていることになる.したがって,答えとしては r[5] をそのまま出力すればよい.

プログラム

import std.stdio, std.algorithm, std.string, std.conv, std.range;

void main() {
    int n, a, b, c;
    readf("%d %d %d %d\n", &n, &a, &b, &c);
    dp(n, a, b, c).writeln;
}

int dp(int n, int a, int b, int c) {
    int[] r = new int[n + 1];
    // 初期化の部分
    foreach (e; [ a, b, c ]) {
        // パーツがそもそも全体の長さを超えている時がある
        if (e <= n) {
            r[e] = 1;
        }
    }

    foreach (int i, ref e; r) {
        // 何らかの方法で i までたどり着いたなら……
        if (e > 0) {
            // 長さ a, b, c のそれぞれのパーツをつなげるやり方について
            // (長さを変数 cut で表す)
            foreach (cut; [ a, b, c ]) {
                // つなげても n からはみ出さなければ
                if (i + cut <= n) {
                    // r[i] に長さ cut のリボンをつなぐ時と
                    // 他の方法で r[i + cut] までたどり着く時のうち
                    // より個数の多い方を記録する
                    r[i + cut] = max(r[i] + 1, r[i + cut]);
                }
            }
        }
    }

    // 上の走査によって,r[n] には長さ n のリボンを作る時の最大のパーツ数が記録されている
    return r[n];
}

Codeforces Beta #92 Div2.A "The number of positions"

自分と同じ悲しみを産む人がいそうなのでメモ。

Problem - 124A - Codeforces

問題

Petrくんは  n 人の並び列の中にいます。Petrくんは自分が何番目の位置にいるのかは分かりませんが、前に  a 人以上、後ろに  b 人以下がいることが分かっています。Petrくんの位置としてありえる場所の数を出力してください。

考え方

例によって入力例だけで考えると死ぬやつ。何も考えずに解こうとすると「後ろの人の数は0人まで減らせるんだから単純に  n - a が答えでいいんじゃないか?」と自分は思ってしまったんですがそうではない。例えば以下の場合を考えてみる。

aaa....bbb (n = 10, a = 3, b = 3)

この時 n - a = 7 なので答えを7にしたくなるが、実は3つのaの真後ろに自分がいると、後ろのbは最大でも3人しかいてくれないため n = 7 となって矛盾する。

aaa#bbb

したがって  a + b \lt n の時はbが0人からb人までのb+1通りがある(aは何人でも増やせる)ので  b + 1 が正しい。

aaaaaa#bbb
aaaaaaa#bb
aaaaaaaa#b
aaaaaaaaa#

逆に  a + b \geq n の時は  b = 0 の時が最も多くの位置を取れるので  n - a が正解。

     ----> bを減らしていくと
.....bbbbb
aaaaaaa... <- (n - a)
       <-> 結局ここしか取れないことが分かる(この時bは条件を満たしている)

ソースコード

import std.stdio, std.range, std.string, std.conv, std.algorithm;
import std.math;

void main() {
    int n, a, b;
    readf("%d %d %d", &n, &a, &b);
    if (a + b < n) {
        writeln(b + 1);
    } else {
        writeln(n - a);
    }
}

夢屋の隠れ大盛り/夢屋,コスパを求めて

同じネタが出てこなかったので2本立てになりました.この記事は夢屋Advent Calendar 2015の20日目の記事です.Advent Calendarは普通1日1ネタだとは思いますが意外と普通のネタがここまで出ていないというのともうすぐ卒業ということで出し惜しみせず2ネタやりたいと思います.すみません.というか前2日がまだ出てないのですが大丈夫でしょうか.

About Me

知識の4年生で,大食いサークルクイズ研究会T食べるQ食うS食事に所属しています.このサークルは週2回の活動のアフターにほぼ確実にRanRanと夢屋に行く習慣があるので適当に計算しても100回以上は夢屋に行っていることになり,夢屋のメニューについてだいたいどんなものが出てくるかは知っているつもりです(さすがに日本酒とかは頼んだことがない).

夢屋の隠れ大盛り

夢屋といえばとりかつカレー両大がラスボスというのは誰もが認めるところとは思いますが,実は裏ボスが存在します.それがこのとりかつ丼(写真はおかず大).

鶏カツの量はおそらくおかず大でジャンチキ普通レベルがやってくると思われますが問題はご飯.丼なので普通でも多いのにごはん大にするとここからさらに増えるので大変です.そしてさらに凶悪なのが卵とじ部分.出汁が結構濃いので意外と早めに飽きてしまい苦戦します.RanRanの親子丼特盛が意外にキツいのと同じ理論なわけです.

ラスボスとはまた違った感覚を味わえます.是非挑戦してみてください.

夢屋,コスパを求めて

夢屋のコスパを求めて自炊に堕ちたエントリが本ACにも散見されますが,はっきり言って自炊は甘えです(過激派).ということで私が思う「夢屋で頼める一番コスパの良いメニュー」を紹介します.それはズバリ「揚げ出し豆腐定食」です.(写真は両大)

夢屋では一品料理に220円プラスすることでジャンチキなどのように定食化することが出来ます.そこからさらに両大なので300円追加で結局の値段は720円.チキンカツ定食と同じ値段でなんと12個もの揚げ出し豆腐におかず大分の唐揚げ1個を食べることが出来ます.ジャンチキや焼きからの普通よりも安くタンパク質の塊をここまで食べられるのはかなりコスパが良いと個人的には思っています.ちなみに豆腐は絹で結構柔らかいのでレンゲを使うと食べやすくなります.私のような豆腐スキーの皆さんは是非試してみてください.

卒論書いた

嘘です.書いてる最中です.

この記事はklis Advent Calendar 2015のために書かれたものです.今年はちゃんと12月の頭からやってます.すごい.記事としては9本目です.記事を書かなきゃいけないことを23時45分に思い出しました.すごい.普通に遅刻しました.すごくない.

知識情報・図書館学類の卒業研究のスケジュール感を把握してもらうために,自分が研究室に配属されてからやっていたことを時系列でまとめたいと思います.僕は知識情報システム主専攻なので他の主専攻の人はあまり参考にならないかもしれません.すみません.他主専攻の人書いてください.

  • 12月: 血の配属戦争をギリギリで平和的に乗り越え第一希望の研究室に配属される.最初のゼミでチュートリアル資料を渡される(最初のはただJavaについて書かれたもの,ただしgradleの話とかも書いてあってモダン).中旬頃にMBAを渡されるのでいじる
  • 1月: この頃から週1でゼミ.新しいチュートリアル資料(ここからは機械学習に関するもの)をもらったりその資料の理解度の進捗を確認したりしながら興味ある分野のサーベイを始める.院に行くかもしれないけど一応という意味で就活を始める.
  • 2月: 冬休みということでゼミは無くて実家に帰ってた.サーベイは多分してた.あとTwilog見たらキレてTwitterからいなくなってた.既に精神状態が危うい.ソーシャルゲーム開発会社とメガベンチャーにエントリーして1次面接で落ちる.Aから始まるコンサルとYから始まるポータルサイトにESで落ちる
  • 3月: ゼミ再開.引き続きもともとやろうと思っていた質問応答についてのサーベイを続けるがある日突然指導教員から「明日のゼミに題目の叩き台を持ってきてください」とのメールが入る.ゼミの方向性と質問応答の相性が悪いのではないかと薄々思っていたのでここで急遽SNS系の題目を提出する.ビビッときたベンチャー企業にエントリーして1次面接・2次面接を受ける.最終面接まで行った中小SIの社長が(検閲により削除されました)でわざと落ちにいく.落ちた
  • 4月: 着手発表.着手のスライドは4月に入ってから作った気がする.ここからはプログラムを書いては実験をし続ける日々.↑のベンチャー企業から内定をもらってこれもう院行かなくてもいいんじゃないかと思い始める
  • 5月: Twitterのデータを使って実験してはゼミで指導教員と議論するみたいなことをやっていた気がする.企業から内定をもらっていたことをゼミで指導教員に報告し院進しないことがほぼ確定する
  • 6月: 実験を続けるうちにこれもっとベースの手法のところから考えたほうがいいんじゃないかという話になり研究対象のレイヤーが1つ落ちる.WebDBフォーラムに出せたら出します(笑)みたいなことを言ったらなんか本当にそういう話になる
  • 7月: たぶん実験してた.何やってたかあんまり覚えてない.ここらへんからだんだん手法がややこしくなってくる
  • 8月: なんか本当にWebDBに出すことになった.精度が出ない→手法を難しくする→精度がもっと出ない→……という負のスパイラルに陥り結局論文を提出できなかった(ネガティブリザルトとしてまとめる可能性もあったけどこの手法だと良くないというのが後々のサーベイで見つかったので自分の意志で提出取り下げを決めた).この経験を機に大学院に進学する気持ちが完全に無くなった
  • 9月: 実家に帰らせていただいた.実家にいる間は研究のことを一切考えなかった(≒考えたくなかった)
  • 10月: 手法を単純なものにしたほうがいいという知見が先の論文提出用の実験の中で得られたので卒論は素直にそっちの方向で書くことに決めた(つまり手法の新規性からアイデアの新規性に重点を移した).予備実験を進める
  • 11月: 論文に載せる評価手法をどうしたらいいかを指導教員と相談し,データを揃えて実験し直す.実験プログラムのデータ取得部に想定とは違う動作を指定た部分が結構あり直すのに苦労する.中旬から卒論執筆に着手する
  • 12月: 実験が全て終わり卒論を仕上げる(まだ仕上がってない)

機械学習系はプログラム用のフレームワークがかなり充実してきており,サーベイしてアイデアが思い付けばあとはデータを集めてプログラム実装して実験するだけみたいな感じになってきている気がします.そのため一度実験をして結果を出せばあとはその結果を見て次にやることが動的に勝手に決まるのでこの分野はそこが楽かもしれません.1年過ぎて感じたことは

  • サーベイは英語でしよう(日本語という言語に着目した研究を除く)
    • 何も思い付かん場合はトップカンファレンスのAccepted Papersを見て面白そうなタイトルの論文を読む→参考文献を芋づる式に読む
  • 最初は小さいところから実験を始めて結果を逐一指導教員に報告しよう
    • なんかしらフィードバックがもらえるはずなのでその後の方針がどんどん決まる
  • 就活するなら早いうちに決めてしまおう
    • 上にもある通りああいう業界はスケジュールがめっちゃ早いです

研究に向いてなかった学生の例ですが参考になれば幸いです.卒業研究頑張りましょう.

CODE THANKS FESTIVAL 2015 参加記

経緯

  • 今年はCODE FESTIVAL行くぜ
  • A3問目で爆死(30分3完)→B15分で3完やったぜ→ち〜ん(笑)

ということで今年もTHANKSです.CODE FESTIVAL行くぜとか言ってる割にこの1年特に対して勉強してなかった(Codeforcesにはちょくちょく出るようになった)ので残当.

行く前

アニメ見てソシャゲして3時半に寝た.最近眠くなる時間帯が早まってきているのでよい.

当日

無事起床.寝る時間が短くても目覚ましへの応答速度は速い.テレコムセンターに行ったら1回のホールにそれっぽいことを前日から示唆していた学類の後輩がいてやっぱりなと思った.ちょっと早く来すぎたので会場があるフロアをさまよいながら5分ほど待つ.

開場したら交通費の精算チェックを済ませてTシャツを受け取って自分の席へ.Tシャツは今年は黒でかっこいいなと思った(黒なら何でもいい?).席次は39番と意外と真ん中の方だった.キャンセル多かったんだろうか.誓約書に署名してMBAWi-Fiに接続したら早速後ろの机に置いてあったお菓子を乞食しに行く.開始直前の弁当争奪戦はなんとか焼肉弁当をゲットする.席次が上の方が弁当に近いのが社会の縮図っぽい(適当).

コンテスト中

  • A(100): なぜか意味不明な考察を始めてAとBの正負で場合分けする意味不明なコードを提出したら通った.よくよく考えたら絶対値で考えなかったのが問題だった.数学の苦手な高校生かよ
  • B(100): 問題文の読み解きがJ問題だった.2-3分ぐらいかけて題意を理解してサッと書いてサッと出した.昇順で出力するというのを完全に見落としていたけどD言語にSetがないおかげで answer.sort.uniq したら必然的に昇順になるので気にせずパスできてよかった.Pythonでやってたら落ちてた
  • C(100): 1-indexedで解答するのと大小の比較演算子でちょっと混乱したけどすぐ出せた.AtCoderの問題は入力例にコーナーケースが入ってることが多くて優しい世界
  • D(100): 紙に書いてシミュレーションして考察.最大値は割とすぐ分かったけど最小値の出し方に数分悩む.5分近くかけてようやく理解したので実装したら通った
  • E(100): 最初左から右に順番に探していけばいいじゃんというアイデアで実装したけど1種類文字を消すとそれが全て文字列が消えることに気付いて再考.文字列長の制約がガバガバだったので「これもしや必要ない文字を2重ループで照合して全部消してからfindしたら上手いこと通るのでは?」と思いその方針で実装したら普通に通った.CODE FESTIVALだったらもっとキツい制約で出そう(やり方は分からん)
  • F(-): 問題読んでああゲーム理論であることだなあと思いつつ弁当を食べ始めた.紙に書いて考察しようとするもなんか難しそうだと思い込んでしまう.難しそうだと思うくせに「これ別にポイントがどうこうじゃないし意外と簡単な解法なのかもなあ」と思いつつG問題を見たらグラフの問題だったのでそこでFの考察をやめて飛ばしてしまう.ここが5完と6完の分かれ道だった
  • G(1×): 問題文読んでなんかダイクストラがベースっぽいなあと思う.開始前に撮ってきたお菓子を食べつつWikipediaダイクストラの記事を見ながらアルゴリズムを実装しているときに「prevにノードとそこに到達した時の色を持たせとけばいいのでは?」と思いついたのでその方針で進めたものの入力例1がWAになる(というか紙の上でのシミュレーションもなぜか出力例1と違っていた).とりあえず2つ目は答え合ってるし〜と思って思い出Submitしたものの結果見たらそこしか合ってない上に後半TLEだった.そのままなすすべなく終了

懇親会

疲れたので解説の後半全然聞いてませんでした.すみません.懇親会のコンテンツは去年とだいたい同じで音ゲーの課題曲もPARANOiA MAX -DIRTY MIX-と地平線のエオリアだった.パラマックスダーティー激は何回見ても後半が足15ぐらいに見える.今年はTHANKSにもスタンプラリーがあったのでスタンプを貰うために挑戦したらやってるうちにポジションが前の方にどんどんずれていって序盤ですぐ落ちた.マットは厳しい.DDRで疲れたので書道コーディングでD言語くんを書いたり(スタッフさんに「去年も見た」と言われた)コード川柳でD言語のアピールをしたりして遊んでたら川柳のほうが宇宙ツイッタラーXさんの目に止まったらしく賞をいただけた.去年は id:osyoyuDDRでベストスコアを出して表彰されていたのでTHANKSで2年連続筑波大生が懇親会表彰を受けるという栄誉ある記録を打ち立てた.来年あったら誰かよろしくお願いします.

まとめ

冒頭にもある通り2年連続のTHANKSということで個人的には不名誉と言うと言葉は悪いもののあまり良いことではないなあと思っていたので心持ちも微妙だったのですが,結果的には今年もD言語で5完できたし順位もそこそこだったしD言語の押し売りが結実したしでやはり今年も参加できてよかったなと思いました.僕は来年就職なので参加資格を失いますが,この大会が学生競プロerの強いモチベーションになっていることは確かだと思うのでこれからも続けていってほしいなあと思います.今年もありがとうございました.

提出した問題の解法とコードは別記事で.