じゅーすいそのわくわくLittle Journey☆

競プロとかわいいおようふく

オンサイトのプログラミングコンテスト「緑以下コンテスト」を開催しました!

はじめに

先日 2023年12月2日に「第2回緑以下コンテスト」を開催しました。 緑以下コンテストとは、AtCoder Problemsのdifficultyがであると予想される問題だけを出題するというコンセプトのプログラミングコンテストです。

私はオンサイトのプログラミングコンテストに行くのが大好きなのですが、オンサイトは高難易度のコンテストであることが一般的なため、どうしても楽しめる人が限られてしまいます。 そこで、初心者の方にもオンサイトコンテストの楽しさを知ってもらいたいと思いこのようなコンテストを開催することにしました。

企画が生えるまで

くしらっちょさんの記事にも書いていますが、第1回緑以下コンテスト後にくしらっちょさんがXで「オンサイトをやってみたい」とポストしていました。私はオンサイトが大好きなのでいつか開催もしてみたいと思っていたので、ここぞとばかりにDMを送りつけました。

そのままの流れでwriterも募集し、たくさん人が集まったので、オンサイト開催プロジェクトが始動しました。

作問について

私はA問題とE問題のwriterをやりました。 作問は初めてだったので、いろいろと運営の人たちと話しながら問題を作りました。

A問題 緑以下コンテスト

問題はこちら

A問題は、入出力とif文だけで解けるシンプルな問題です。 おそらくオンサイト史上最も簡単な問題だと思います。 初めてオンサイトに参加するという人も多数いると思ったので、せっかく会場まで来てくれた人が「1問も解けなかった」という悲しい思いをしないようにできるだけ簡単な問題を出題しました。 サンプル1やサンプル2にコンテスト自体に関する説明を書いてるのもお気に入りポイントです。

E問題 みんな大好きmod 998

問題はこちら

E問題は再帰全探索で解く問題です。大体difficulty 500ぐらいを想定していました。順位表とかをみた感じ、そこまで外してはなさそうです。 この難易度帯で「答えを〇〇で割った余りを出力する」という形式の問題は多くないので、なんとなく無意味なmod 998で出力させる形式にしました。ちなみにmod 998で出力とは、mod 998244353ではなくmod 998です。深い意味はありません。

ところで、ABC328 E問題でほとんど同じ解き方の問題が出題されていたため、参加者でこれを思い出したという人は結構多いと思います。 実は作問したのはABC328よりも前でした。ABC328終了後に運営陣で没問にするか議論しましたが、想定難易度が大きく離れているという理由でそのまま出題しました。

余談

ABC324 C問題みたいなやつもABC324より前に作ってました。

会場について

元々はレンタルスペース等を借りて開催しようと思っていました。 ところが、なんとくしらっちょさんが「大学の部屋が借りれるかもしれない」と言ってくれて、大学に掛け合ってくれました。 結果はOKとのことで、青山学院大学での開催が決定しました。本当に感謝です。

名札について

オンサイトコンテストは、もちろんコンテストで競い合うのも楽しいですが、オンサイトならではの体験として他参加者の交流をするのが醍醐味ともいえます。 しかし、特にはじめてオンサイトに参加する人は、Xなどでは繋がってるけど顔は知らないという人がたくさんいて交流するのに困るということが起こり得ます。

私はいつもオンサイトに参加する際に、以下の画像のようなオリジナルの名札を用意しています。

まあ、名札のおかげで誰かわかったと言われたことは1度もないのですが…(ありがたいことに、多くの人が名札を見なくてもわかったと言ってくれるので)

オンサイトを開催するにあたり、せっかくなのでこのような名札を全員分用意したいと思いました。

名札を入れるケースは、アスクルで下のリンクのものを購入しました。かなりペラペラでしたが、とにかく安かったので助かりました。大規模なイベントを開催する際にはおすすめです。

https://www.askul.co.jp/p/6040729/

さて、名札の要件は以下のとおりです。

  • 緑以下コンテストのものであるとわかるようにする
  • 参加者のアイコンを大きく入れる
  • 参加者の名前を入れる

名札の背景については、同じく運営の∞ループ∞さん、くしらっちょさんが素敵なデザインを作ってくれました。本当に感謝です。

これで1つ目の要件を満たすことができました。残りの2つについては、がんばればなんとかなりそうです。

緑以下コンテストはありがたいことに70名以上の方に参加登録していただいていたため、運営を含めて80枚程度の名札を作成する必要がありました。温かみのある手作業で作るには微妙に大変ですね。そこで、connpass(参加登録用サイト)から出力した参加者名簿のCSVファイルをもとに、以下のようなPythonのプログラムを作成してみることにしました。

1つ目はBeautifulSoup、2つ目はPillowを使用して実装しました。

# connpassからアイコンを引っ張ってくるやつ
import pandas as pd
from bs4 import BeautifulSoup
import requests
import re
import os
import time

user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
header = {
    'User-Agent': user_agent
}

def downloads(url, name):
    save_dir = 'images'
    if not os.path.exists(save_dir):
        os.mkdir(save_dir)
    fname = name + ".png"
    save_picture = save_dir + "/" + fname
    r = requests.get(url, headers=header)
    with open(save_picture, "wb") as pi:
        pi.write(r.content)
        print("save:", save_picture)
    time.sleep(1)


# ユーザー名, 表示名, ハンドルネーム を持つCSVをconnpassから出力
# (ハンドルネームはアンケートに書いてもらったやつ)
csv = pd.read_csv('participant.csv')

for index, row in csv.iterrows():
    url = "https://connpass.com/user/" + row['ユーザー名']
    r = requests.get(url, headers=header)
    soup = BeautifulSoup(r.text,'lxml')
    img = soup.find('img', title=row['表示名'])
    imgurl = img['src']
    downloads(imgurl, row['ユーザー名']) 
# 名札画像を生成するやつ
from PIL import Image, ImageDraw, ImageFont

# backgroundのパス, 参加者名(=ハンドルネーム), 参加者のID(=ユーザー名)から名札を生成するコード
def run(back, name, id):
    background = Image.open(back)
    nafuda = background.copy()
    icon = Image.open('images/' + id + '.png')
    nafuda.paste(icon, (30,220))
    draw = ImageDraw.Draw(nafuda)

    font = ImageFont.truetype('azuki.ttf', 50)

    # 名前が長い人は文字を小さくしていい感じにする
    if (len(name) >= 8) :
        font = ImageFont.truetype('azuki.ttf', 40)
    if (len(name) >= 10) :
        font = ImageFont.truetype('azuki.ttf', 28)
    draw.text((230, 280), name, 'black', font=font)

    nafuda.save('nafuda/' + id + '.png', quality=95)

名札の文字にはあずきフォントを使用しました。

ここで、問題が発生します。なぜが一部の人のアイコンの画質が非常に荒くなっていました。これは私のプログラムの問題ではなくそもそもconnpassに登録されている画像がガビガビなようです。これでは交流をしやすくするという本来の目的を果たせるかどうか微妙です。そこで、結局アイコンは可能な限りXなどから温かみのある手作業で取ってくることになりました。画像を何度も変更したので、名札を生成する方のコードは大活躍でした。

完成した名札はこんな感じです。

いい感じに仕上がったのでよかったです。参加者から「全員分の名札があってすごい」「名札のおかげで交流がしやすかった」などの声も多数いただいたため、がんばって準備した甲斐があったと思いました。

ネイル

緑以下コンテストにちなんで緑のネイルをしていきました。かわいいですね。

おようふく

私はオンサイトコンテストに参加する際に毎回かわいいおようふくを着ていくのですが、ロリィタは動きにくいためなかなか着る機会がありませんでした。しかし、今回は運営なのでプログラミングをすることはないため、せっかくなので久しぶりにロリィタを着ました。Metamorphoseの3段フリルJSKです。

帽子と中に着てるブラウスは、Xのアイコンとおそろいの、AmavelのSecret Macaronシリーズです。

当日

前日の夜に参加登録した人を観測したので、慌てて追加で名札を印刷しました。前日に参加登録してくれた方が結構いたようで、抜けがあり申し訳ございません。

なんか当日はメイクをミスってしまい時間がかかりました

コンテスト前

運営+αのみんなで青学の学食を食べました。メニューがいっぱいあり迷いましたが、私はカレーにしました。おいしかったです。

コンテスト前の受付は意外と時間がなく、少しばたばたしてしまいました。これは反省です。

コンテスト中

コンテスト中は順位表を観戦しながらclarの対応をしていました。他の人の問題も含め、ジャッジに不備がある等の致命的なclarが飛んでこなくて安心しました。初の全完者が出た時は運営陣みんなで盛り上がりました。オンサイト参加の方ではないですが、Extraを全完する方が2名もいて驚きました。強い人、本当に強い……

ところで、コンテスト中は参加者の邪魔になってはいけないので部屋の外にいましたが、オンサイトの様子を前から見ることはなかなかない機会なので、せっかくだから見に行けばよかったなと少し後悔しています。

コンテスト後

コンテスト後は、使用した部屋に残って雑談したり、半年ぶりにABCをサボってごはんに行ったりしました。

一緒にぬいぐるみの写真を撮ったり、

2ショットを撮ったり、

運営+αのみんなでマックドナルドを食べたり

などとても充実した時間になりました。 こうやって他の競プロerと交流することができるのは、やはりオンサイトならではの体験で、とても楽しいですね。

おわりに

運営のみなさま、参加してくださったみなさまのおかげで本当に楽しい時間を過ごすことができました。ありがとうございました。

参考にした記事