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
6
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
43
Featured
See All Featured
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
840
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
470
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Mind Mapping
helmedeiros
1
350
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
270
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
490
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Raft: Consensus for Rubyists
vanstee
141
7.7k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Side Projects
sachag
455
43k
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