Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
chibaswift_canacel.pdf
Search
canacel
December 06, 2024
5
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
chibaswift_canacel.pdf
canacel
December 06, 2024
More Decks by canacel
See All by canacel
Liquid Glass最前線
canacel3
0
36
Featured
See All Featured
Designing Experiences People Love
moore
143
24k
エンジニアに許された特別な時間の終わり
watany
108
250k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
First, design no harm
axbom
PRO
2
1.2k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
440
The SEO Collaboration Effect
kristinabergwall1
1
510
Become a Pro
speakerdeck
PRO
31
6k
Site-Speed That Sticks
csswizardry
13
1.3k
We Have a Design System, Now What?
morganepeng
55
8.2k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
390
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.6k
Scaling GitHub
holman
464
140k
Transcript
Swiftで1ヶ月 競プロをやってみたら 意外とよかった話 2024/12/6 西田 楓 (canacel)
自己紹介 • かなせる (canacel) (西田 楓) • フラー株式会社でiOSアプリを作っています • 趣味①: チェンバロ
• 趣味②: ゲーム • ブレワイのマップ達成率100%達成しました!
アジェンダ 1. なぜ競プロを始めたのか 2. Swiftで競プロは可能? 3. 実際に競プロやってみた 4. 競プロを通して得られたもの・失ったもの 5.
おわりに
1. なぜ競プロを始めたのか
突然ですが 競プロやったことあるよ〜って方、 いますか?🖐
Swiftで競プロやったことあるよ〜 って方は・・・?🖐
そもそも競プロとは • 「競技プログラミング」の略 • 与えられた問題のプログラムを作成し、解くまでにかかった時間や 正答数・過程を競う
None
None
なぜ競プロを始めたのか • 新しい視点を得るため • 「プログラミングは手段」だと思っていた • エンジニアとしてさらに成長するにはどうすればいいか… • プログラミングを手段としてではなく目的として捉えることで これまでとは違う景色が見れるのでは…?
• 逆張り人間なので他の人がやってないことをやりたかった • Swiftでの競プロ参加はマイノリティなイメージ
自己紹介② (前提共有) • 競プロはこれまで名前だけは知っていたが、 やったことはない • 情報系の学科にいたがアルゴリズムとデータ構造 の授業を受けた覚えがない* • なので独学していた記憶があるが、遠い昔なので
ほぼ忘れてしまった • コーディング速度はそこまで自信がない *高専では電気・電子工学、大学では図書館情報学を専攻していました
2. Swiftで競プロは可能?
A. 可能!
AtCoder は Swift に対応している • Swift 5.8.1 (Xcode 14.3.1) •
Swift-Algorithms, Swift-Collections 使用可能
便利なツールもある • Apple公式ライブラリ • apple/swift-algorithms : SequenceとCollectionのアルゴリズム • apple/swift-collections :
データ構造の実装用 • 非公式 • koher/swift-atcoder-support : 便利コピペ集 • ShotaKashihara/atcoder-cli-swift : コンテスト用CLIツール
3. 実際に競プロやってみた
ABCに参加してみた • AtCoder Beginner Contest(通称ABC) • AtCoderが毎週定期的に開催している競プロ初心者向けコンテスト • 参加したのは以下の日程 •
ABC 379 (11/9 (土) 21:00~22:40) • ABC 381 (11/22 (金) 21:00~22:40) • ABC 382 (11/30 (土) 21:00~22:40)
簡単 難しい https://atcoder.jp/contests/abc382/tasks
None
コンテストに参加してみて思ったこと ① C問題以降が難しい ② 仕事のコードと競プロのコードは全然違う ③ 計算量を意識する必要がある ④ Swiftの参加者が…少ない…!
① C問題以降が難しい • ABC の場合、アルゴリズムの知識無しでいけるのはA, B問題まで で、C問題以降を安定して解くには対策が必要 • 計算量を考慮し、適切な探索の手法に辿り着くのが鍵 •
常設問題 (時間制限のないコンテスト) を解いたり、解説動画を見 たり、本を読んだりして勉強する必要あり📖
• 競プロ: 時間とメモリの制限がシビア・正解すればOK • 仕事: 可読性・保守性・拡張性が求められる ② 競プロのコードと仕事のコードは全然違う if N
% 2 == 0 { print("No") } else if N == 1 && S == "/" { print("Yes") } else { let s = S.split(separator: "/").map { String($0) } if s.count != 2 { print("No") } else if s[0].contains("2") { print("No") } else if s[1].contains("1") { print("No") } else if s[0].count == s[1].count { print("Yes") } else { print("No") } } ABC 381 B問題の解答例
③ 計算量を意識する必要がある • 以下のコードの計算量は O (NM) • 例えば N や
M が 2x10^5 の場合、O (NM) = 400億 • 家庭用 PC の計算速度は毎秒 10 億回程度*であり、このコードは 明らかに時間がかかりすぎている for n in N { for m in M { // NM͕େ͖͍ͱͱ͕͔͔ͯ࣌ؒΔΑ } } * 米田 優峻. 競技プログラミングの鉄則 ~アルゴリズム力と思考力を高める77の技術~. 2022. p24.
④ Swiftの参加者が…少ない…! 毎回10人もいない😂
4. 競プロを通して 得られたもの・失ったもの
競プロを通して得られたもの • 楽しさ • 仕事じゃないプログラミングは楽しい!✨ • 計算量を気にする心 • enumerated() は
O(1)! • Swiftの言語仕様を気にする心 • zip() や enumerated() の中身はどうなってるんだろう?と調べたり… • Swiftへの興味・関心の向上につながっていると思う
競プロを通して失ったもの • 毎週土曜日の夜にパートナーとお酒を飲んでゆっくりする時間 • ABCは毎週土曜日の夜にある。。 • パートナーもABCに参加してもらうことで解決 • 知人・友人と一緒にやると感想戦ができて楽しい!
5. おわりに
まとめ • Swiftでも競プロできる! • Swiftで競プロをやるための便利なツールやライブラリが色々ある! • ある程度のアルゴリズムの知識が必要 • 競プロをやることで、言語仕様や高階関数の計算量を知るきっかけ ができた
• プログラミングを手段としてではなく、目的にするのもありだなと 思った
今後の展望 • せめて茶色にはなりたい…! • 明日の夜21時からABCがあります! みんなも競プロやってみよう! https://atcoder.jp/contests/abc383