みんながいるから続けられる。続けられるから成長できる。プログラミング力を磨く部活動のご紹介
2020年10月7日(水)13時0分 BIGLOBE Style
開発部門(基盤本部)でエンジニア育成を担当している高玉です。
BIGLOBEには登山部、麻雀部、ツーリングクラブなど様々な部活があります。今日はインドア派の部活、プロコン部についてご紹介します。
プロコン部とは
プロコンってご存知ですか?
ここでいうプロコンは、ゲーム機用のProコントローラーでも、良い点(Pros)・悪い点(Cons)を列挙するのでもありません。「競技プログラミングコンテスト」の略です。
プログラミングコンテストとは、プログラミングの技術を競い合うイベントです。参加者にお題が出題されるので、そのお題を解くプログラムを制限時間内に提出します。
プロコン部では、プログラミングコンテストで出題された過去問を各自が解いて持ち寄り、その解法を披露しあうことで、楽しくプログラミング力を高めあっています。
この記事の最後に、部活で書いている実際のコードをご紹介します。JavaScriptで多倍長整数を扱う神コードも飛び出します。どうぞお楽しみください。
ゆるくて多様なプロコン部
プロコン部の最大の特徴は「ゆるさ」と「多様性」にあります。
プログラミングコンテストに挑戦して良い成績を目指すよりは、幅広いアルゴリズムに触れて楽しく実装することが目的のゆるい部活です。
部活は週1回1時間、業務時間内に開催しています。国内最大の競技プログラミングサイトAtCoderで公開されている過去問を1つ取り上げて、各人が業務の合間に自分のペースで挑戦してきます。本番のプログラミングコンテストでは「問題を早く解くスキル」も求められますが、部活ではそのプレッシャーがないのも、ゆるさにつながっています。
約10名のメンバーが使うプログラミング言語は本当に様々です。C++、Python、JavaScript、Java、Scala、Swift、Ruby、Haskell、Rust、Clojure、F#。
みんなが同じ問題を解いてくるのですが、人によってアプローチの仕方が違うことに加え、言語による得意・不得意が分かるのがとても面白いです。問題によって「Haskellだと短く書ける」「Pythonだとシンプル」「C++のライブラリ便利」といった違いがハッキリ分かります。
名著と名高い「達人プログラマー」では「毎年少なくともひとつの言語を学習する」というプラクティスを紹介していますが、この部活が新しいプログラミング言語を学ぶ最適な場になっています。私もC++で問題が解けるようになりました。
みんながいるから続けられる
メンバーにプロコン部の魅力を聞いたところ、
「一人だとなかなか続かないけど毎週集まることでモチベーションが維持できる」
「他の人と一緒にやることで、やる気が刺激される」
「解いてくる人がいるので辞めるに辞められない環境」
といった声が集まりました。
また、
「自分の解答も人に説明するので思考やコードが整理される」
という声もありました。
仲間がいるのは心強いものです。ゆるく取り組んでいるとはいえ幅広く様々なアルゴリズムを学ぶので「苦手なアルゴリズムに取り組むのはとてもしんどい」という正直な声もありました。それでも続けられるのはすごいことです。
その結果「ちゃんと力量アップした実感がある」というメンバーもいます。コンピューターのメモリー量や計算量が、利用するデータ構造やアルゴリズムによって大きく異なることを、業務だけで学ぶことはなかなかできません。「コンピュータや処理系の気持ちになれる」との声もありました。
BIGLOBEが大切にする価値観・信念(BIGLOBEマインド)の一つに「継続的に成長する」があります。みんながいるから続けられる、続けられるから成長できる。私たちプロコン部の活動は「とてもBIGLOBEらしい活動だなぁ」と改めて思います。
みんなのコードをチラ見せ
振り返ってみると、週1回・週1問のゆるいペースとはいえ、とてもたくさんの問題を解いてきました。その中から3つほど、問題と解答コードをご紹介します。
コードゴルフ感ただようPython v.s. Rust
問題文
駅の待合室に座っているjoisinoお姉ちゃんは、切符を眺めています。
切符には 4 つの 0 以上 9 以下の整数A,B,C,D が整理番号としてこの順に書かれています。
A op1 B op2 C op3 D = 7 となるように、op1,op2,op3 に + か - を入れて式を作って下さい。
例えば (A, B, C, D) = (3, 2, 4, 2) が与えられた時、3+2+4-2=7 と出力するプログラムが求められています。Pythonで直積を求めるライブラリー itertools.product を活用して、コンパクトに書かれたコードがこちらです。
importsys, itertools
[a, b, c, d] = sys.stdin.readline().rstrip()
ops = ['+', '-']
forexp in['%s%s%s%s%s%s%s'% (a, op1, b, op2, c, op3, d) forop1, op2, op3 inlist(itertools.product(ops, ops, ops))]:
ifeval(exp) == 7:
print'%s=7'% exp
break
コードの短さを競い合う「コードゴルフ」の雰囲気が漂います。
そういえば、プロコン部で苦手なアルゴリズムに挑戦することが続いたため、その気晴らしにコードゴルフ大会が開催されたという噂があります(笑)。
ちなみに、Rust を書いてきたメンバーのコードはこれでした。コンパイルの通ったRustのコードって簡単に見えるから不思議です!
useproconio::input;
useitertools::*;
fnapply(op: char, x: i32, y: i32) ->i32{
matchop {
'+'=>x +y,
'-'=>x -y,
_ =>unreachable!(),
}
}
fnevaluate(a: &Vec<i32>, ops: &Vec<char>) ->i32{
ops.iter().zip(a.iter().skip(1))
.fold(a[0], |s, (&op, &x)|apply(op, s, x))
}
fnmake_expression(a: &Vec<char>, ops: &Vec<char>) ->String{
a.iter().cloned().interleave(ops.iter().cloned()).chain("=7".chars()).collect()
}
fnoperators(n: usize) ->implIterator<Item =Vec<char>>{
(0..n)
.map(|_|"+-".chars())
.multi_cartesian_product()
}
fnsolve(a: String) ->String{
lets =a.chars().collect::<Vec<_>>();
leta =s.iter().map(|c|c.to_digit(10).unwrap() asi32).collect::<Vec<_>>();
operators(3)
.filter(|ops|evaluate(&a, &ops) ==7)
.map(|ops|make_expression(&s, &ops))
.nth(0)
.unwrap()
}
fnmain() {
input!{
a: String,
}
letr =solve(a);
println!("{}", r);
}
ワンライナー F#
問題文
ファーストフードチェーン「ピザアット」のメニューは「A ピザ」「B ピザ」「AB ピザ」の 3 種類です。A ピザと B ピザは全く異なるピザで、これらをそれぞれ半分に切って組み合わせたものが AB ピザです。A ピザ、B ピザ、AB ピザ 1 枚あたりの値段はそれぞれ
A 円、B 円、C 円です。中橋くんは、今夜のパーティーのために A ピザ X 枚と B ピザ Y 枚を用意する必要があります。これらのピザを入手する方法は、A ピザや B ピザを直接買うか、AB ピザ 2 枚を買って A ピザ 1 枚と B ピザ 1 枚に組み替える以外にはありません。このためには最小で何円が必要でしょうか?なお、ピザの組み替えにより、必要な量を超えたピザが発生しても構いません。
例えば (A, B, C, x, y) = (1500, 2000, 1600, 3, 2) が与えられた時、つまりAピザ 1500円、Bピザ 2000円、ABピザ 1600円で、Aピザが3枚、Bピザが2枚必要な場合、AB ピザを 4 枚買って A ピザと B ピザ 2 枚ずつに組み替え、A ピザを 1 枚買い足すのが最適です。7900円と出力することが求められます。
毎回必ずF#を使って、1行のプログラム(ワンライナー)で提出するメンバーのコードを紹介します。関数型とオブジェクト指向のマルチパラダイムの言語、とのことですが、私は不勉強で理解できないため、いつも雰囲気だけ楽しんでます😇
ループを使った解法では、ABピザ2枚をi枚買って、AピザとBピザに分けつつ、足りないAピザ・Bピザを補充する戦略を取ります。ABピザを買う枚数を変化させながら、最小の金額を総当たりで調べます。
stdin.ReadLine()
|>funx ->x.Split(' ')
|>Array.map int
|>funx ->(x.[0], x.[1], x.[2], x.[3], x.[4])
|>fun(a, b, c, x, y)->
[1..(max x y)]
|>List.fold (
funret i ->
a *(max (x - i)0)+
b *(max (y - i)0)+
c *i *2
|>min ret
)(a *x +b *y)
|>printfn"%d"
場合分けによる解法では、AピザとBピザを別々に買うのと、ABピザを買って分けるのとで、どちらが安くなるかを調べます。
stdin.ReadLine()
|>funx ->x.Split(' ')
|>Array.map int
|>funx ->(x.[0], x.[1], x.[2], x.[3], x.[4])
|>fun(a, b, c, x, y)->
[
a *x +b *y;
(
ifx >y
thena *(x - y)+c *2*y
elseb *(y - x)+c *2*x
);
c *2*(max x y)
]
|>Seq.min
|>printfn"%d"
JavaScriptで多倍長整数を扱う、だと!?
問題文
非負の整数 a, b (a ≤ b) と、正の整数 x が与えられます。
a 以上 b 以下の整数のうち、x で割り切れるものの個数を求めてください。制約
0 ≤ a ≤ b ≤ 1018
1 ≤ x ≤ 1018
例えば (a, b, x) = (4, 8, 2) が与えられた時、つまり 4 以上 8 以下の整数のうち 2 で割り切れるのは、4, 6, 8 の3つなので、3 と出力するプログラムが求められています。
「0 以上 b 以下の整数のうち x で割り切れるもの」から「0 以上 (a - 1) 以下の整数のうち x で割り切れるもの」を引いた値を計算すればOKです(a が 0 の時を考慮する必要があります)。
ただ、この問題の「制約」が10の18乗で大変大きくなっているのがポイントです。C++であれば、64ビット以上の整数を表す long long を使って次のように簡単に解けます。
#include <iostream>
usingnamespacestd;
typedeflonglongll;
ll f(ll n, ll x) {
if(n == -1) return0;
returnn / x + 1;
}
intmain() {
ll a, b, x;
cin >> a >> b >> x;
cout << f(b, x) - f(a - 1, x) << endl;
return0;
}
私は当時 JavaScript で取り組んでいたのですが、JavaScriptで多倍長整数を扱うことができず撃沈していました。そんな時、メンバーの一人が次のコードを提出してきたのです。神か!
長いので折りたたんで表示します。
「部活動」をもっと詳しく
「部活動」のニュース
-
声優・ファイルーズあい、PTSDで一部活動制限へ「悔しい気持ちでいっぱいです」 プリキュア・ジョジョ主演の人気声優
オリコン 12月31日(火)12時3分
-
【持続可能な部活動運営】 株式会社サクシード(証券コード9256)が、埼玉県より地域スポーツクラブ活動への移行に向けた実証実験業務を受託しました。
PR TIMES 12月26日(木)12時46分
-
【安心安全な部活動運営を】 株式会社サクシード(証券コード9256)が、豊中市の部活動指導員研修会講師の提供をいたしました。
PR TIMES 12月25日(水)12時46分
-
平野ノラ 神戸市の公立中学の部活動終了、クラブ化に「部活で得るものは凄く多いし、親としては...」
スポーツニッポン 12月20日(金)14時36分
-
溝口紀子氏 神戸市の公立中学の部活動終了、クラブ化に「部活動は単なるスポーツ、文化活動ではなく...」
スポーツニッポン 12月20日(金)14時13分
-
JR東日本スポーツが取り組む部活動支援事業に、保護者連絡サービス「tetoru(テトル)」 を採用
PR TIMES 12月19日(木)12時46分
-
部活動改革、有識者会議が中間報告…地域展開へ
リセマム 12月19日(木)11時15分
-
スポーツテックのユーフォリア、部活動やサークルに励む学生選手と指導者向け無料の練習記録アプリ「SportsMate (スポーツメイト)」をリリース
PR TIMES 12月18日(水)14時16分
-
神戸市、部活動改革「KOBEKATSU」へ2026年全面移行
リセマム 12月17日(火)11時45分
-
神戸市公立中学校 『学校単位の部活動』終了・会費制の地域クラブへ移行 「ダンスや料理」なども選択可能
TREND NEWS CASTER 12月17日(火)7時30分
トピックス
- 尹大統領の拘束令状執行を開始 写真
- 米南部50人死傷事件は単独犯か NEW
- アップル Siriの訴訟和解へ 写真
- ネット通販で購入の本「闇深い」 写真
- 子どものすきっ歯 実は理想的? 写真
- 青学大が8区快走 差を広げる NEW
- シード争い 9位〜13位は53秒差 NEW
- 「フリーザ軍団」今年も7区登場 写真
- YOSHIKI 小学生時代の美食伝説 写真
- パク・ソジュン 最近やせた理由 写真
- 中継所目前 国学院タスキ落とす 写真
- 青学大・野村 史上初の56分台 写真
- トランプホテル前爆発 自殺か 写真
- 箱根復路 山下りの6区スタート 写真
- 米 日本に空対空ミサイル売却 写真
- サンド伊達「1回がんになって」 写真
- 神戸の住宅に男女3人の遺体 写真
- 3日 関東の平野部でも雪か 写真
- 偽物?10円玉「65000円」のワケ 写真
- 温厚な犬 冬になると現れる宿敵 動画
- YOSHIKI 小学生時代の美食伝説 写真
- パク・ソジュン 最近やせた理由 写真
- サンド伊達「1回がんになって」 写真
- モー娘。生田衣梨奈が今春卒業へ 写真
- 小倉弘子アナ TBS退社を報告 写真
- テレ朝が個人視聴率3冠 要因は 写真
- 山本裕典 ホストクラブ体験入店 動画
- マヂラブ野田 先輩と一触即発 写真
- 新垣結衣の追記メッセージに感動 写真
- 紅白世帯視聴率 後半は前年比増 写真
- 麒麟 ギャラ事情を赤裸々告白 写真
- やす子 フワちゃん騒動に初言及 写真
- GACKT消滅 別番組が異例の謝罪 写真
- 村重杏奈 入浴シーンにクレーム 写真
- 映す価値なし 鬼龍院のXが話題 写真
- GACKT 大親友の芸人と年越し 写真
- 「比嘉地雷」新ワード爆誕に反省 写真
- フジ・山崎夕貴アナ 今年中復帰 写真
- 山里亮太 ラジオ生番組を欠席 写真
- ryuchellさん姉 母の死去を報告 写真
- シード争い 9位〜13位は53秒差 NEW
- 青学大が8区快走 差を広げる NEW
- 中継所目前 国学院タスキ落とす 写真
- 「フリーザ軍団」今年も7区登場 写真
- 青学大・野村 史上初の56分台 写真
- 箱根復路 山下りの6区スタート 写真
- ばんえい競馬 コウテイが大金星 写真
- 川崎F 二階堂コーチの退団発表
- 高校サッカー 関東勢5校8強入り 写真
- 阪神待望「打てる捕手」誕生間近 写真
- 青学大・太田蒼生が「婚約」発表 写真
- 大関・大の里 今年初の稽古 写真
- 大谷翔平の2025年成績 記者予想 写真
- 大谷「デコピン年賀状」に大反響 写真
- Cロナウド「仏にはPSGしかない」 写真
- 箱根5区 中継バイクに「どけ」 写真
- 青学大 2年連続7度目の往路V 写真
- 箱根「山の名探偵」実況に沸く 写真
- 青学エース・太田 左薬指に指輪 写真
- 史上初の快挙 2区で3人区間新 写真
- 子どものすきっ歯 実は理想的? 写真
- 神戸の住宅に男女3人の遺体 写真
- 3日 関東の平野部でも雪か 写真
- 地震で妻子死亡 酒量増えた男性 写真
- 避難所共通ID 長崎以外利用せず 写真
- 母の口テープで塞いだか 女逮捕 写真
- 「パスポート」デザイン変更へ 写真
- 交差点で車衝突 酒気帯び運転か 写真
- 石破首相 中国への訪問に意欲 写真
- 広島 銭湯のロッカーに景品 動画
- 米南部50人死傷事件は単独犯か NEW
- 尹大統領の拘束令状執行を開始 写真
- トランプホテル前爆発 自殺か 写真
- 米 日本に空対空ミサイル売却 写真
- タイで迷惑行為 邦人に罰金 写真
- 米新政権 圧力外交でどう変化? 動画
- モンテネグロで銃撃 10人死亡 写真
- 尹氏の拘束令状「早ければ今日」 動画
- 中国の若者に「鳥カフェ」が人気 写真
- 韓国 政治危機の中で経済対策 写真
- ネット通販で購入の本「闇深い」 写真
- 偽物?10円玉「65000円」のワケ 写真
- バランス崩しゲーム 再現の猛者 写真
- あえて寒い冬に訪れるべきお城 写真
- 「お雑煮」東は角餅?西は丸餅? 写真
- ラーメン豚山 SNS炎上受け反論 写真
- 2万8600円「鈍器本」に絶賛の声 写真
- 運試し 後悔しない福袋の買い方 写真
- 意外と知らない「お年玉」の由来 写真
- 70代〜90代「人生最大の後悔」 写真
- 温厚な犬 冬になると現れる宿敵 動画
- やる気なし お姫様気質なネコ 写真
- カップルを待つ 紳士なペンギン 写真
- 猫を懐へ 住職の朝が幸せそう 写真
- マンチカン「オマエもうキライ」 写真
- 目に見えない何かと戦う猫ちゃん 写真
- 可愛い猫「最狂の表情」のワケ 写真
- 象が通行料を徴収 スリランカ 動画
- ダブルヘソ天のワンコとニャンコ 写真
- 猫好き羨ましがる 垂涎級の絶景 写真