2024年度参加者マニュアル - hakatashi/decathlon GitHub Wiki
📖参加者マニュアル
TSG十種競技は、TSGに関連する競技を1日で10種類行い、その総合得点でTSGの王者を決めるイベントです。
1競技だけの参加なども歓迎です。時間が合えばぜひ参加してください!
このマニュアルは、参加する際に参考になる情報が一目で分かるよう1つのページにまとめたものです。全部確認しておく必要はありませんが、この下の2セクションは読んでおくことをおすすめします。
🔰新入部員・初心者の方へ
このイベントはTSGの普段の活動の成果を出す競技なので、新入部員の方はかなり不利かもしれません。ですが、まったくの初心者でも競技には参加できるように工夫しています。
それぞれの競技説明の「🔰初心者向けヒント」という欄に必要な情報が載っているので、これを参考にいろいろ試してみてください。何かわからないことが少しでもあれば、Slackの#decathlonまたは#sandboxに投稿してくれれば、TSG部員が可能な範囲でサポートします。
また、プログラミングを触ったことのない方でも、特に第6競技「ITクイズ」第8競技「タイピング」第10競技「プロンプトエンジニアリング」は楽しんでもらえるかと思うので、ぜひ時間を縫って参加してください!
👛あらかじめ準備しておくと良いこと
各競技の、当日までにやっておくと良いかもしれないことをまとめました。
- プロンプトエンジニアリング
- 第10競技「プロンプトエンジニアリング」に参加するには必ず事前にプロンプトを提出してもらう必要があります。 第9競技「コードゴルフ」開始前に十種競技ポータルサイト上でプロンプトの提出を行っておいてください。
- CTF/diff
- CTFが初めての場合は、Scrapboxの「CTF」のページを事前に確認して、雰囲気をつかんでおきましょう。常設CTFの問題をいくつか解いてみるのもOKです。
- CTF (Pwn) ではバイナリファイルが渡されます。バイナリを詳しく解析したい場合、事前にGhidraやIDAをインストールしておくことをおすすめします。
- diffではPythonのバイトコードが渡されます。Pythonのバイトコードの扱いに詳しくない場合、事前に初心者向けヒントを読んでセットアップをしておくことをおすすめします。
- また、練習用ページが公開されています。あらかじめプレイして、システムの使用に問題がないか確認しておいてください。
- ITクイズ
- 過去問が公開されています。当日の問題の半分以上はこのリストの中から出題される予定です。
- あらかじめ軽く目を通しておくか、予習しておくと有利です。
- 競プロ早解き
- 自分が普段競技プログラミングをする環境を整えておきましょう。
- プログラミングが初めての場合は AtCoder Programming Guide for beginners で事前に学習しておきましょう。
- 競技プログラミングが初めての場合は AtCoder Beginners Selection で事前に練習しておきましょう。
- ここまでできたなら当日1、2問は必ず解けるはずです!
- タイピング
- 練習用ページが公開されています。あらかじめプレイして、システムの使用に問題がないか確認しておいてください。
- 量子コンピューティング
- コードゴルフ
⏲️タイムスケジュール
当日、Slackの#decathlonチャンネルで Google Meet のアドレスを共有します。時間になったらこちらに参加してください。
- 13:00-13:15 イベントの説明など
- 13:15-15:45 第1~5競技 CTF + diff + 量子コンピューティング
- CTF (Pwn), CTF (Web), CTF (Crypto), diff, 量子コンピューティング を同時に開催します
- 16:00-16:20 第6競技 ITクイズ
- 16:30-17:00 第7競技 競プロ早解き
- 17:00-17:30 ITクイズ 採点結果発表&解説
- 17:30-17:45 第8競技 タイピング (日本語)
- 17:45-18:15 第9競技 コードゴルフ
- 18:10-18:45 第10競技 プロンプトエンジニアリング (鑑賞会)
- 18:45-19:00 結果発表
🌏ポータルサイト
競技はポータルサイト上で行います。事前に以下のアドレスにアクセスして、TSGのSlackを通してログインができることを確認しておいてください。
https://decathlon.hakatashi.com/
ログイン方法
ページの右上にあるLOGINボタンを押します。
別ウィンドウが開きます。右上のワークスペースが「TSG」になっているのを確認した上で「許可する」を押してください。(「TSG」でない場合は選択してください)
ページの右上が自分のアイコンになればログイン成功です。
※登録されたユーザー名とアイコンはインターネット上で公開されます。公開されたくない場合はSettingsから公開しても良い名前とアイコンに変更してください。
エラー
このようなエラーが出た場合は、一時的なものなので、ページをリロードしてください。
🔊通話について
Google Meet
- 当日、Slackの#decathlonチャンネルで Google Meet のアドレスを共有します。
- この通話では主催であるhakatashiがイベントの進行や重要なアナウンスなどを行うので、イベント参加中は可能な限り開いておいてください。
- イベントに関する質問など以外ではマイクをミュートしておいてください。
Discord
- イベント参加中、Google Meet と同時にTSGのDiscordに接続して、雑談などを行って構いません。
- 主催のhakatashiも雑談に参加する予定です。
- 招待リンクはSlackの#sandboxチャンネルの固定リンクに書いてあります。
- 自由にチャンネルが作れるようになっているので、人が多くなったりした場合は適当に分割してください。
⚠️イベント中に質問などがある場合
以下のいずれかの方法で主催のhakatashiに連絡してください。
- イベント進行用の Google Meet でマイクをアンミュートし、hakatashiに声をかける
- Slackの#decathlonチャンネルで、「@hakatashi」のメンション付きでメッセージを投稿する
優先度が高くない場合は、それ以外の方法で知らせても大丈夫です (Google MeetのQ&A機能など)
🏟️競技説明
第1競技 CTF (Pwn)、第2競技 CTF (Web)、第3競技 CTF (Crypto)
実施概要
- 第1競技から第5競技までは同時に行われます。与えられた時間を自由に使って、まずは自分の得意な分野に取り組んでみてください。
- CTFはサイバーセキュリティに関連する技術を用いたパズルです。問題ごとにさまざまなタスクを解き、最終的にフラグと呼ばれる文字列を提出するとクリアとなります。
- 競技は別途設ける競技ページ上で行われます。競技に先立ってあらかじめユーザー登録をしておいてください。
- 競技ページの右上のRegisterからユーザー登録できます。
🔰初心者向けヒント
- 競技ページに表示される問題文に初心者向けのヒントが表示されます。ぜひ確認してください。
- CTFが初めての場合は、ScrapboxのCTFのページを事前に確認して、雰囲気をつかんでおきましょう。常設CTFの問題をいくつか解いてみるのもOKです。
- Pwn問題ではバイナリファイルが渡されます。バイナリを詳しく解析したい場合、事前にGhidraやIDAをインストールしておくことをおすすめします。
ルール
- 今回のCTFは個人戦です。アカウントを共有したり、情報を共有したりしないでください。
- スコアサーバーを攻撃しないでください。
獲得得点の計算方法
- 獲得得点はそれぞれの問題ごとに独立に計算されます。
- 提出が早い順番に順位が付きます。
- 問題が解けた場合、この競技の獲得得点は 100 × 0.99 ^ [提出順位 (0-indexed)] 点です。
- 問題が解けなかった場合、この競技の獲得得点は0点となります。
送信するスコアについて
問題が解けた場合、ポータルサイトで回答送信時刻を入力してください。回答送信時刻を確認するには、ログインした状態で https://ctf.hakatashi.com/user にアクセスして、Solvesの欄を見てください。
関連Slackチャンネル
- #sig-ctf: TSGでは定期的に有志がチームを組み、さまざまなオンラインのCTF大会に参加しています。特にSECCONなどの大きな大会ではメンバー全員が全力で大会に取り組んでおり、CTF合宿などもたまに行われます。興味があればぜひ参加してみてください!
第4競技 diff
実施概要
- リバースエンジニアリングを、早く、的確に行う能力を競う競技です。
- 競技ページにアクセスし、競技開始時刻になると、ルールとバイナリファイルのダウンロードリンクが表示されます。
- 与えられたバイナリファイルを解析し、これになるべく近いファイルにビルドされるようなソースコードを提出してください。
- ソースコードは複数回提出することができます。
🔰初心者向けヒント
-
この競技ではPythonのバイトコードを解析する必要があります。
-
Pythonのバージョンは3.12.2です。
-
Pythonのバイトコードの解析には、公式のdisライブラリの他、uncompyle6、pycdcなどのデコンパイラツールがあります。また、pycdcに付随しているpycdasなども便利です。
- ただし、使われているpythonのバージョンが新しいため、そのままではデコンパイラは正しく動かないはずです。
-
公式のディスアセンブラを用いる場合、以下のようにすると、結果が表示されます。
import dis import marshal with open(filename, 'rb') as f: f.seek(16) dis.dis(marshal.load(f))
ルール
- コンパイル環境など、細かいルールは競技開始後に表示されます。
獲得得点の計算方法
- 配点は素点が50点、順位点が50点の100点満点です。
- 素点は (正解バイナリのサイズ - diffスコア) / 正解バイナリのサイズ * 50 点です。
- ただし、0点未満にはなりません。
- 順位点は 50 × 2/(順位+1) 点です。 (1-indexed)
- 素点の高い順に順位がつきます。
- 素点が同じ場合は、解答送信時刻の早いほうが高い順位がつきます。
関連Slackチャンネル
- #sig-ctf: 「diff」はCTFの1ジャンルであるreversingをテーマにした競技です。興味があればぜひ参加してみてください!
第5競技 量子コンピューティング
実施概要
- 量子コンピューティングの能力を競う競技です。
- 指定された課題をこなすことができる量子回路を組み、Pythonコードとして提出することができればクリアとなります。
🔰初心者向けヒント
- この競技ではプログラミング言語Pythonと、pennylaneという量子コンピューティングのライブラリを使用します。事前にこれらが使用できる環境を整えておくことで当日のデバッグが容易になるでしょう。
- この競技で出題される量子回路はごく基本的なものです。事前に量子コンピューターの基礎を抑えておくだけでも得点できる可能性が高まるでしょう。
- 教材としては以下のようなものがおすすめです。
ルール
- 競技時間が開始すると、競技サイト上に問題が1問出題されます。指示に従ってPythonのコードを提出してください。
獲得得点の計算方法
- 提出が早い順番に順位が付きます。
- 問題が解けた場合、この競技の獲得得点は 100 × 0.99 ^ [提出順位 (0-indexed)] 点です。
- 問題が解けなかった場合、この競技の獲得得点は0点となります。
関連Slackチャンネル
- #sig-qcon: TSGでは量子系のコンテストに参加しています。TSGとしてチーム戦に参加することもあるので、初心者の人も経験者の人も気軽に覗いてみてください!
第6競技 ITクイズ
実施概要
- TSGで定期的に開催されている、「ITクイズ」を題材にしたペーパーテストです。
- インターネットやプログラミングなど、ひろく「IT」に関連する周辺知識を問う小問が出題されます。
- 過去問から40問、新規作成した問題が20問の計60問と、近似値問題1問が出題されます。
- 過去問はこちらから確認することができます (約2800問)。
- 過去問はフォームでの出題に適した形に改題されることがあります。
- 過去問のうち20問はここ1年間で出題された問題 (問題2101~) から出題されます。
- 事前の予習や対策に制限はありません。
- 競技終了後、作問者が採点を行います。採点が終了したあと、Googleフォーム上で得点が公開されます。そこに記載してある点数を入力してください。
🔰初心者向けヒント
- このクイズの出題範囲は、インターネットやIT企業についてなど、わりと広めです。プログラミングの経験はそこまで関係ないので、初心者でも気軽に参加できると思います。
- 問題の多くは過去問から出題されるので、事前の予習も有効です。
ルール
- 競技開始と同時に、クイズ回答用のGoogleフォームのリンクが共有されます。フォームにアクセスし、制限時間以内に問題を解いて提出してください。
- 検索は禁止です。極力頭の中にある知識のみを使って解いてください。
獲得得点の計算方法
- 配点は素点が120点、順位点が80点の200点満点です。
- 素点は1問2点で120点満点です。
- 順位点は 80 × 2/(順位+1) 点です。 (1-indexed)
- 素点の高い順に順位がつきます。
- 素点が同率の場合は近似値問題の近い順に順位がつきます。
- 近似値問題も同率の場合は回答送信時刻の早い順に順位がつきます。
採点基準
- 明らかに表記が誤っているものは、小さなミスであっても誤答とします。 (Google→Gogle など)
- 通称・略称などの一般的な表記ゆれは正解とします。(Amazon.com, Inc.→アマゾン社 など)
- 漢字表記は必要ありません。
- 東洋人名はフルネームのみを正解とします。
- 西洋人名はファーストネームのみで正解とします。
- 採点には常識が適用されます。(「その挙動から『リターンキー』とも呼ばれるキーは何でしょう?」で「リターンキー」と答えても正解にはなりません)
競技の流れ
-
競技開始時間になると、ポータルページから競技ページに飛べるようになります。リンクをクリックして、競技ページを開いてください。
-
時間内に問題を解き、ページ下部の「送信」ボタンを押してください。
-
送信後、「スコアを表示」というボタンが表示されます。採点完了まで、この画面を開いておいてください。
- 「スコアを表示」ボタンを押しても構いませんが、この時点で表示されるスコアは自動採点によるものであり、この競技における正式なスコアではありません。
-
「第7競技 競技プログラミング (早解き)」が終了したあと、採点セッションを行います。共有画面上で正解となる答えを1問ずつ発表するので、採点に不満がある場合は Google Meet のチャットかマイクでその旨を申し立ててください。
-
採点セッション終了後、再び「スコアを表示」からスコア表示ページを開いてください。(すでに開いている場合はページをリロードしてください) ここに表示されている点数が最終的な点数となります。
関連Slackチャンネル
- #sig-quiz: TSGのクイズ好きのためのチャンネルです。2週間に一度開催している「ITクイズ」の告知もここで行われるので、ウォッチしたい方はこのチャンネルに加入しておいてください!
第7競技 競技プログラミング (早解き)
実施概要
- AtCoderのバーチャルコンテストを用いた、競技プログラミングの早解きコンテストです。
- 競技に参加するにはAtCoderアカウントおよび AtCoder Problems アカウントが必要です。
- 問題セットは 100-100-200-200-300-300-400-400 です。
🔰初心者向けヒント
- プログラミングが初めての場合は AtCoder Programming Guide for beginners で事前に学習しておきましょう。
- 競技プログラミングが初めての場合は AtCoder Beginners Selection で事前に練習しておきましょう。
- ここまでできたなら当日1、2問は必ず解けるはずです!
ルール
- 競技は外部サイトの AtCoder Problems 上で行われます。あらかじめリンク先を確認し「Join」しておいてください。
- 競技が始まったら問題リストが公開されるので、指定された問題を解いて、AtCoderに提出してください。
以下の行為は禁止です。
- 過去の自分や他人の提出を読んだり、コピーする行為
- 問題文の内容を処理することにより、プログラムの入出力以外の部分を自動生成して提出する行為
獲得得点の計算方法
- 時間内に獲得した問題の合計得点の10分の1がこの競技の獲得得点になります。
- ペナルティはありません。また、最終提出時刻は競技点数には影響しません。
関連Slackチャンネル
- #sig-procon: 競技プログラミング全般の話題に関するチャンネルです。AtCoderユーザー名をBOTに登録しておけば、TSGのメンバーとコンテストの順位で競い合うことができます!
第8競技 タイピング (日本語)
実施概要
- 日本語タイピングの速度を競います。この競技のルールは概ね「文章入力スピード認定試験」のルールに準拠しています。
- 競技ページにアクセスし、競技開始時刻になると開始ボタンが表示されます。好きなタイミングで開始ボタンをクリックし、競技を開始してください。
- ゲームが開始すると画面左側にPDFが表示されます。PDFに記載されている文章を右側の入力エリアに正しく入力していってください。
ルール
- 競技時間は開始ボタンを押してから10分間です。
- 競技中は、打鍵によって文字を入力するものであればどのようなツールを使っても構いません。
- つまり、キーボード配列やIMEの種類に制限はありません。
- 競技中に他のウェブサイトを開いたりしても構いませんが、コピーアンドペーストで文字を入力するなどの行為は禁止です。
獲得得点の計算方法
- 時間内に正しく入力できた文字数が素点となります。
- 参加者の中で最も高い素点を100点としたときの点数が各参加者の獲得得点となります。
素点の計算方法
「入力した文字列」と「正解文字列」に以下の正規化を順番に施したものをそれぞれ【入力】と【正解】とする。
【入力】と【正解】の最長共通部分文字列を計算し、共通部分文字列の長さから【入力】で余分に挿入されている文字列の長さを引いたものを「正しく入力できた文字数」とする。
わかりやすい説明
- 余分に挿入された改行や空白などはスコアに影響を及ぼしません。
- 不足している改行や空白などもスコアに影響を及ぼしません。
- 全角数字を半角で打ち込んでもスコアに影響を及ぼしません。
第9競技 コードゴルフ
実施概要
- コードゴルフを行います。コードゴルフは、与えられた処理を実行するプログラムを可能な限り短く書く、という競技です。
- 競技ページにアクセスし、競技開始時刻になると、ルールと問題が表示されます。
- ソースコードは複数回提出することができます。
🔰初心者向けヒント
- 当日は「C言語」「Python」の2言語が必須言語枠として出題されます。これらの言語を書けるようになっておくと、当日少なくとも得点を獲得することができるでしょう。
- コードゴルフ用のテクニックを学ぶと、勝てる確率が上がります。学ぶための資料として、以下のようなページが参考になりそうです。
- TSGでは過去にコードゴルフ大会を何度も開催しており、その時提出されたコードの解説がWikiにまとめられています。参考になるテクニックがたくさん掲載されているので、読んでおくと良いかもしれません。
ルール
- このコードゴルフ競技は個人戦です。他の人と協力して解くことは禁止されています。
獲得得点の計算方法
- このコードゴルフ競技では複数の言語による種目が行われます。獲得得点はそれぞれの言語ごとに計算され、その合計がこの競技での獲得点数となります。
- それぞれの言語における満点は 200 ÷ [言語の数] 点です。
- それぞれの言語について、課題を解く全プレイヤーで最も短いコードを提出したプレイヤーは満点を獲得します。
- 課題を解くコードを提出した他のプレイヤーは、満点 × [全プレイヤーで最も短いコードの長さ] ÷ [自分が提出した最も短いコードの長さ] を獲得します。
- この競技における満点は200点ですが、必ずしも200点を獲得するプレイヤーがいるとは限らないことに注意してください。
関連Slackチャンネル
- #コードゴルフ大会: TSGが開催するコードゴルフ大会に関する情報が流れてくるチャンネルです。
第10競技 プロンプトエンジニアリング
実施概要
- プロンプトエンジニアリングの能力を競う競技です。
- 参加者には競技開始までに以下のルールに従って事前にプロンプトを提出してもらいます。当日、プロンプトから出力された内容を誰のものかを隠した状態で発表し、参加者の投票により得点を決定します。
🔰初心者向けヒント
- ChatGPTなどのAIツールに慣れ親しんでおきましょう。
ルール
- 対話型AIに新規性のある俳句を考えてもらうためのプロンプトを提出してください。
- 俳句にはテーマが存在しますが、その内容はプロンプト作成者には公表されません。提出されたプロンプトの「【テーマ】」と書かれた部分を全て実際のテーマに置き換えてからAIに送信されます。
- テーマとして考えられるものの例: 卒業、海、コーヒー、クリスマス、大阪
- 俳句は以下の形式のCSVで出力してください。
- 1行目に俳句の本文を出力する。一句目・二句目・三句目で分割し列で区切る。
- 2行目にその俳句の読み仮名を出力する。一句目・二句目・三句目で分割し列で区切る。
- 区切り文字はASCII文字のカンマのみ許容されます。
- プロンプトは1000文字以内とします。
- 一句目・二句目・三句目がそれぞれ五音・七音・五音になるように出力してください。字余りは全体で1音までペナルティなしで許容されます。字足らずは不可です。
- 俳句が指定されたパーサでパース不能だった場合、出力形式に関する得点を0点とします。この際、判定者が出力を読み、俳句が出力されていると思われる場合はそれを出力から手動で抽出し俳句発表会への提出として扱います。このとき、何度かリトライを行う場合があります (出力形式に関する得点は0点で変わらない)。
- 俳句の読み仮名が指定されたパーサでパース不能だった場合、判定者が出力を読み、俳句の読み仮名が出力されていると思われる場合はそれを出力から手動で抽出し俳句発表会への提出として扱います。俳句の読み仮名が出力されていないと思われる場合、判定者が任意に俳句の読み仮名を設定し、それを俳句発表会への提出として扱います。
- モデルにはOpenAI社のチャット向け言語モデル「gpt-3.5-turbo」を使用します。
プロンプト作成の手引き
作成したプロンプトをテストしたい場合、ChatGPTの無料版を使用することをおすすめします。例えば上のような出力を得た場合、「彼女は 優雅さと 気品に満ちていた」という俳句 (?) を提出したものとみなされます。
満点を取れる出力例
古池や,蛙飛び込む,水の音
ふるいけや,かわずとびこむ,みずのおと
この出力は出力形式に関する得点を50点獲得することができる。
満点ではないが、許容される出力例
以下は「秋」をテーマとする俳句の一例です。
林檎の香,秋風に揺れ,収穫の時
りんごのこう,あきかぜにゆれ,しゅうかくのとき
この出力は出力形式に関する得点を35点獲得することができる。
採点基準
出力形式に関する得点
- 俳句の部分が所定の形式で出力されていること: 15点
- 以下の不備1つにつき-5点とする。
- 1行に3つより多くの列が含まれている
- 区切り文字がASCIIのカンマでない
- 区切り文字の前後に空白文字が含まれている
- 以下の不備1つにつき-5点とする。
- 俳句の読み仮名の部分が所定の形式で出力されていること: 15点
- 以下の不備1つにつき-5点とする。
- 1行に3つより多くの列が含まれている
- 区切り文字がASCIIのカンマでない
- 区切り文字の前後に空白文字が含まれている
- 以下の不備1つにつき-5点とする。
- 字余り/字足らずについての配点: 15点
- 不備は以下の通り減点する。
- 読み仮名に関する出力がパース不能: -15点
- 字足らずがある: -10点
- 字余りが全体で1音以内: -0点
- 字余りが全体で2音: -5点
- 字余りが全体で3音: -10点
- 字余りがそれ以上: -15点
- 不備は以下の通り減点する。
- 俳句とその読み仮名のCSV以外の文字列が出力されていないこと: 5点
なお、採点に用いるパーサは競技ページから確認することができます。
俳句発表会における採点基準
参加者の皆さんは、以下の基準で好きな俳句を選んで投票してください。困ったらリストで上にあるものを優先してください。
- 読み仮名が明らかに不自然でないか
- 俳句として自然か
- 俳句がテーマに沿っているか
- 俳句として好みかどうか
- 俳句としての趣を感じるかどうか
出力形式に関する得点で採点基準となっている内容は採点対象外とします。
獲得得点の計算方法
- 出力形式に関する得点が50点満点、俳句発表会における投票による得点が50点満点としたときの合計点数が獲得点数となります。
- 出力形式に関する得点は上の採点基準で採点した得点がそのまま得点となります。
- 投票による得点は、最も得票点数が高い参加者の点数を50点としたときの点数が得点となります。
関連Slackチャンネル
- #ai-users: AIをより上手に活用して画像生成をしたりプロンプトを作成したりしたい人たちのためのチャンネルです。
🔢配点
- CTF (web): 100点
- CTF (crypto): 100点
- CTF (pwn): 100点
- diff: 100点
- 量子コンピューティング: 100点
- 競プロ早解き: 200点
- タイピング (日本語): 100点
- ITクイズ: 200点
- コードゴルフ: 200点
- プロンプトエンジニアリング: 100点
計: 1300点