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
Rubyで始める!!競技プログラミング/ Kokura.rb #1
Search
Aseiide
January 25, 2022
Technology
0
340
Rubyで始める!!競技プログラミング/ Kokura.rb #1
Kokura.rb #1で使用したスライド
Aseiide
January 25, 2022
Tweet
Share
More Decks by Aseiide
See All by Aseiide
Rubyを使ってインタプリタを作ってみた / Learn ruby with ruby
aseiide
0
350
Rubyコミュニティのすゝめ / Kaigi on Rails PreEvent
aseiide
1
770
wakaranの解像度を上げるために / fjord lt vol-9
aseiide
1
1.6k
遅延評価勉強法を使って Railsチュートリアルをやってみた / fukuokarb 200 lt
aseiide
0
200
Other Decks in Technology
See All in Technology
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
8.8k
LLM時代のパフォーマンスチューニング:MongoDB運用で試したコンテキスト活用の工夫
ishikawa_pro
0
140
実践!カスタムインストラクション&スラッシュコマンド
puku0x
0
450
CDK CLIで使ってたあの機能、CDK Toolkit Libraryではどうやるの?
smt7174
4
190
20250910_障害注入から効率的復旧へ_カオスエンジニアリング_生成AIで考えるAWS障害対応.pdf
sh_fk2
3
260
Terraformで構築する セルフサービス型データプラットフォーム / terraform-self-service-data-platform
pei0804
1
180
S3アクセス制御の設計ポイント
tommy0124
3
200
研究開発と製品開発、両利きのロボティクス
youtalk
1
530
「何となくテストする」を卒業するためにプロダクトが動く仕組みを理解しよう
kawabeaver
0
420
スマートファクトリーの第一歩 〜AWSマネージドサービスで 実現する予知保全と生成AI活用まで
ganota
2
220
会社紹介資料 / Sansan Company Profile
sansan33
PRO
6
380k
「全員プロダクトマネージャー」を実現する、Cursorによる仕様検討の自動運転
applism118
22
11k
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.4k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.6k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
13k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
Fireside Chat
paigeccino
39
3.6k
Embracing the Ebb and Flow
colly
87
4.8k
Music & Morning Musume
bryan
46
6.8k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
What's in a price? How to price your products and services
michaelherold
246
12k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
Transcript
“Rubyで始める!!” 競技プログラミング kokura.rb #1 {date}. 2022/01/22 @Online &福岡市エンジニアカフェ Kokura.rb
#1 - connpass https://kokurarb.connpass.com/event/229360/ https://github.com/Aseiide/kokurarb/issues/1 https://gist.github.com/alt9800/a7d2588880b28671968524ba1807bab6
エンジニアカフェ エンジニアやエンジニアに関わる人、エンジニアを目指す人をサポートする施設です。 エンジニアカフェ外観(提供:福岡市) イベントの様子 コワーキングスペース Event Co-Working&Meeting Consulting Cafe&Bar
エンジニアカフェで体験できること
エンジニアカフェでは 随時ご相談を受け付けております! 本日のイベントに関するご質問はもちろん エンジニアに関するご相談・ご質問はお気軽にどうぞ! ・勉強の仕方を教えて欲しい ・学生でも参加しやすいコミュニティが知りたい ・子どもにおすすめのプログラミング教材ってある? ・3Dプリンタでこんなの作れる? などなど! スタッフやコミュニティマネージャーがオフライン・オンライン問わず
ご対応致します。
自己紹介 alt9800 (福岡市EngineerCafe利用者) 触って楽しかった技術: Ruby (RoR、GR.rb,Gollum,Kimuraiとかを最近さわった) https://github.com/alt9800
自己紹介 いで(@aseiide) (北九州在住) 勉強していること: Ruby Ruby on Rails 基本情報技術者
https://github.com/Aseiide
トピック JavaScriptで学ぶアルゴリズム③[ソートアルゴリズム⑵] -マージソート|Tasting.com 【アプリリリース予定】| note https://note.com/tasting/n/nb85f082c4ab2 「100日後に退職する47歳」作者が経験したミドル層転職と“年齢の壁”(3/3ページ) - SankeiBiz(サンケイビズ):自分を磨く経済情報サイト
https://www.sankeibiz.jp/article/20211123-KOHSKSSKDJF4PILJ6LHWVB4OYI/3/ クイックソートの計算量を聞かれるなど https://twitter.com/zone_energy_jp/status/1386877764863672320?s=20
計算量の概念のお役立ちどころ - 通信スタック - グラフィックの表示について - https://cgworld.jp/regular/202110-chiyama-38.html
競技プログラミングとは? • アルゴリズムとデータ構造 ->競技プログラミングにはアルゴリズムテストのという側面がある • データ構造について ->開発新卒に捧ぐ、データ構造の基本と特徴
実行速度について 遅いとTLEになる https://twitter.com/scol_kp/status/1325799278984404992?s=20 Ruby
アルゴリズムを学ぶと何が嬉しいのか 情報オリンピックとは | 第20回日本情 報オリンピック https://joi2021.ioi-jp.org/about/
Rateについてのあれこれ AtCoder コンテストについての tips - Qiita https://qiita.com/drken/items/8a6f139158cde8a61dce 【AtCoder】Rubyで競プロに入門する
- Qiita https://qiita.com/yuya_yuzen/items/e2a2c049a79dbe2bbf74
アルゴリズムテストの最初の一歩 標準入出力
Rubyで始めると何が嬉しいのか ❏ 環境構築の容易さ ❏ スクリプト言語ならではの文法の明快さ ❏ 豊富なメソッド(他の言語で言う所の標準の関数) ❏ 型(Class)が動的に与えられる (よしあし)
❏ たのしい ❏ みやすい ❏ かわいい
もっと勉強を進めたい方へ(セッションを組むにあたって参考にした資料/書籍) ❏ Rubyで始める競技プログラミング ❏ けんちょん本 ❏ 基本情報技術者試験の過去問 分野別過去問題
テクノロジ系|基本情報技術者試験.com https://www.fe-siken.com/index_te.html#2_2
事前準備 ❏ Atcoderのアカウントを作る ❏ エディタを用意する (オンラインエディタもあるよ)
その他こんなのもあるよ ❏ Testを書きたい->RSpec、minitestが有用 ❏ 他のコンテストにも出たい! - >Topcoder、Codility(Codesprint、Paiza) ❏ Rubyについて質問したいことがある。。。->Fukuoka.rb、Ruby.jp ❏
検証用にエディタを用意するのがだるい wandbox
知ってると良さそうなこと - 標準入力 gets は実行されるたびに一行ずつ値を読み込む - Enumerable型を利用して複数の変数に値を一度に格納することができる 標準入力で ruby rails
が与えられるとき a,b = gets.chomp.split(' ') で a = ‘ruby’ ,b = ‘rails’ を与えることができる - 複数行にわたって入力がある場合は全てをメモリ上に展開する方法がある。 Ruby 標準入力から値を受け取る方法 - Qiita https://qiita.com/Hayate_0807/items/2e9705091b 181a104621
知ってると良さそうなこと つづき arr = Array.new while line = $stdin.gets
arr << line.chomp.split.map(&:to_i) end みたいな感じでもいいかも 前項の例はcsvのデータを扱うときとか便利かも。 合わせて読みたい Ruby IOクラスについて学ぶ - Qiita https://qiita.com/naotospace/items/bd0a5295e540e27936b3
A - Div [問題文] N 個の互いに区別できないお菓子を、A君とB君で分け合います。 両者とも 1 個以上の 整数個のお菓子を得るような分け方は何通りありますか?
A - Div https://atcoder.jp/contests/abc198/tasks/abc198_a
A - Div の考え方 ・・・ N個 Aさん Bさん 互いに区別ができない ↓
何個ずつ分け合うか 高校 数学A 重複組み合わせの基礎 | あうるさんの杜 https://awl3no.com/suugaku/baainokazu/choufukukumiawase-kiso
A - Div のコード例 n = gets.chomp.to_i if n
< 2 then puts 0 else puts n - 1 end
A - ABC Swap [問題] 3 つの箱 A,B,C があります。それぞれの箱には、整数が
1 つ入っています。 現在、箱 A,B,C に入っている整数はそれぞれ X,Y,Z です。 これらの箱に対して以下の操作を順に行った後の、 それぞれの箱に入っている整数を求めてください。 箱 A と箱 B の中身を入れ替える 箱 A と箱 C の中身を入れ替える A - ABC Swap https://atcoder.jp/contests/abc161/tasks/abc161_a
A - ABC Swap の考え方 A B C 一般にこういう処理をswapと呼びます
Rubyの基本文法を習うときに言語仕様を 教えてもらった人もいるかも。
A - ABC Swap のコード例 input = gets.chomp.split(" ")
x = input[0] y = input[1] z = input[2] x, y = y, x x ,z = z ,x puts "#{x} #{y} #{z}"
B - Bishop [問題] B - Bishop https://atcoder.jp/contests/panasoni
c2020/tasks/panasonic2020_b
B - Bishop の考え方
B - Bishop の考え方 一般化すると... 全体のマスが奇数なら全マス数の半分 + 1 , 偶数なら
全マスの半分 ビショップは動けることがわかるので、 偶 x 偶 = 偶 奇 x 奇 = 奇 偶 x 奇 = 偶 を使って、 入力値 縦 x 横 の積に対して場合わけをすれば良さそう!
B - Bishop の考え方 line = gets.chomp.split().map(&:to_i) # [7,3] int
cross = line[0] * line[1] if line[0] == 1 || line[1] == 1 then ans = 1 # 1があると動けないのでまずい else cross.even? ? ans = cross / 2 : ans = (cross / 2) + 1 end puts ans
B - A to Z String [問題] B
- A to Z String https://atcoder.jp/contests/abc053/tasks/abc053_b
B - A to Z String の考え方 例えば、入力例3 において、
HASFJGHOGAKZZFEGA HASFJGHOGAKZZFEGA HASFJGHOGAKZZFEGA HASFJGHOGAKZZFEGA HASFJGHOGAKZZFEGA とかいっぱいでてくるジャン!!! とか思うとドツボにはまるので、シンプルに一番長いとこを取ってくりゃいいじゃん!って おもうのがコツかも
B - A to Z String のコード例 str = gets.chomp.split("")
a = str.index("A") z = str.rindex("Z") puts z.to_i - a.to_i + 1 # これはだいぶエスパーなことをしている list = [1,4,6,7,3,4,2,5,7,4,6,4,3,6,5,4,3,3,4] みたいな配列があったときに 4 は何回、あるいはどの位置に登場しているのかしりたいときは 以下のような魔術が使える count = list.each_index.select { |num| list[num] == x }
キーワード - ループ (コレクション) - 再帰 - ソート (マージ、フラッシュ、バブル...etc) -
スタック/キュー - グラフ - 決定木 - 全探索(幅優先/深さ優先) - 動的計画法(DP)
実装すると楽しそうなもの - Wordle - ボンバーマン (これは多次元配列に対してのアプローチが火をふきます) - まるばつゲーム (対話式から初めて ->
ランダムな入力を繰り返して問題を解かせ る人工無能を作成する など)