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
290
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
290
Rubyコミュニティのすゝめ / Kaigi on Rails PreEvent
aseiide
1
650
wakaranの解像度を上げるために / fjord lt vol-9
aseiide
1
1.4k
遅延評価勉強法を使って Railsチュートリアルをやってみた / fukuokarb 200 lt
aseiide
0
160
Other Decks in Technology
See All in Technology
Shopifyアプリ開発における Shopifyの機能活用
sonatard
4
250
透過型SMTPプロキシによる送信メールの可観測性向上: Update Edition / Improved observability of outgoing emails with transparent smtp proxy: Update edition
linyows
2
210
安心してください、日本語使えますよ―Ubuntu日本語Remix提供休止に寄せて― 2024-11-17
nobutomurata
1
990
Evangelismo técnico: ¿qué, cómo y por qué?
trishagee
0
360
マルチプロダクトな開発組織で 「開発生産性」に向き合うために試みたこと / Improving Multi-Product Dev Productivity
sugamasao
1
300
100 名超が参加した日経グループ横断の競技型 AWS 学習イベント「Nikkei Group AWS GameDay」の紹介/mediajaws202411
nikkei_engineer_recruiting
1
170
強いチームと開発生産性
onk
PRO
34
11k
社内で最大の技術的負債のリファクタリングに取り組んだお話し
kidooonn
1
550
Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間
oracle4engineer
PRO
28
12k
VideoMamba: State Space Model for Efficient Video Understanding
chou500
0
190
スクラムチームを立ち上げる〜チーム開発で得られたもの・得られなかったもの〜
ohnoeight
2
350
Amazon CloudWatch Network Monitor のススメ
yuki_ink
1
200
Featured
See All Featured
BBQ
matthewcrist
85
9.3k
A better future with KSS
kneath
238
17k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
GitHub's CSS Performance
jonrohan
1030
460k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Music & Morning Musume
bryan
46
6.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Building Applications with DynamoDB
mza
90
6.1k
Building Adaptive Systems
keathley
38
2.3k
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 - ボンバーマン (これは多次元配列に対してのアプローチが火をふきます) - まるばつゲーム (対話式から初めて ->
ランダムな入力を繰り返して問題を解かせ る人工無能を作成する など)