Slide 1

Slide 1 text

“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 


Slide 2

Slide 2 text

エンジニアカフェ
 エンジニアやエンジニアに関わる人、エンジニアを目指す人をサポートする施設です。 
 エンジニアカフェ外観(提供:福岡市) イベントの様子 コワーキングスペース Event Co-Working&Meeting Consulting Cafe&Bar エンジニアカフェで体験できること


Slide 3

Slide 3 text

エンジニアカフェでは 随時ご相談を受け付けております! 本日のイベントに関するご質問はもちろん エンジニアに関するご相談・ご質問はお気軽にどうぞ! ・勉強の仕方を教えて欲しい ・学生でも参加しやすいコミュニティが知りたい ・子どもにおすすめのプログラミング教材ってある? ・3Dプリンタでこんなの作れる? などなど! スタッフやコミュニティマネージャーがオフライン・オンライン問わず ご対応致します。

Slide 4

Slide 4 text

自己紹介
 alt9800 (福岡市EngineerCafe利用者)
 
 触って楽しかった技術: Ruby (RoR、GR.rb,Gollum,Kimuraiとかを最近さわった)
 
 https://github.com/alt9800

Slide 5

Slide 5 text

自己紹介
 いで(@aseiide) (北九州在住)
 
 勉強していること: Ruby Ruby on Rails 基本情報技術者
 
 https://github.com/Aseiide

Slide 6

Slide 6 text

トピック
 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 
 


Slide 7

Slide 7 text

計算量の概念のお役立ちどころ
 - 通信スタック
 - グラフィックの表示について
 - https://cgworld.jp/regular/202110-chiyama-38.html
 
 


Slide 8

Slide 8 text

競技プログラミングとは?
 ● アルゴリズムとデータ構造
 ->競技プログラミングにはアルゴリズムテストのという側面がある
 ● データ構造について
 ->開発新卒に捧ぐ、データ構造の基本と特徴


Slide 9

Slide 9 text

実行速度について
 遅いとTLEになる
 https://twitter.com/scol_kp/status/1325799278984404992?s=20 Ruby


Slide 10

Slide 10 text

アルゴリズムを学ぶと何が嬉しいのか
 情報オリンピックとは | 第20回日本情 報オリンピック https://joi2021.ioi-jp.org/about/

Slide 11

Slide 11 text

Rateについてのあれこれ
 AtCoder コンテストについての tips - Qiita
 https://qiita.com/drken/items/8a6f139158cde8a61dce
 
 
 【AtCoder】Rubyで競プロに入門する - Qiita
 https://qiita.com/yuya_yuzen/items/e2a2c049a79dbe2bbf74
 
 


Slide 12

Slide 12 text

アルゴリズムテストの最初の一歩
 標準入出力


Slide 13

Slide 13 text

Rubyで始めると何が嬉しいのか
 ❏ 環境構築の容易さ
 ❏ スクリプト言語ならではの文法の明快さ
 ❏ 豊富なメソッド(他の言語で言う所の標準の関数)
 ❏ 型(Class)が動的に与えられる (よしあし)
 ❏ たのしい
 ❏ みやすい
 ❏ かわいい
 


Slide 14

Slide 14 text

もっと勉強を進めたい方へ(セッションを組むにあたって参考にした資料/書籍) 
 ❏ Rubyで始める競技プログラミング
 ❏ けんちょん本
 ❏ 基本情報技術者試験の過去問
 
 分野別過去問題 テクノロジ系|基本情報技術者試験.com
 https://www.fe-siken.com/index_te.html#2_2
 


Slide 15

Slide 15 text

事前準備
 ❏ Atcoderのアカウントを作る
 ❏ エディタを用意する (オンラインエディタもあるよ)
 


Slide 16

Slide 16 text

その他こんなのもあるよ
 ❏ Testを書きたい->RSpec、minitestが有用
 ❏ 他のコンテストにも出たい! - >Topcoder、Codility(Codesprint、Paiza)
 ❏ Rubyについて質問したいことがある。。。->Fukuoka.rb、Ruby.jp
 ❏ 検証用にエディタを用意するのがだるい wandbox
 


Slide 17

Slide 17 text

知ってると良さそうなこと
 - 標準入力 gets は実行されるたびに一行ずつ値を読み込む
 - Enumerable型を利用して複数の変数に値を一度に格納することができる
 標準入力で ruby rails が与えられるとき
 a,b = gets.chomp.split(' ') で
 a = ‘ruby’ ,b = ‘rails’ を与えることができる
 - 複数行にわたって入力がある場合は全てをメモリ上に展開する方法がある。
 
 Ruby 標準入力から値を受け取る方法 - Qiita 
 
 https://qiita.com/Hayate_0807/items/2e9705091b 181a104621
 


Slide 18

Slide 18 text

知ってると良さそうなこと つづき
 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


Slide 19

Slide 19 text

A - Div
 [問題文]
 N 個の互いに区別できないお菓子を、A君とB君で分け合います。 両者とも 1 個以上の 整数個のお菓子を得るような分け方は何通りありますか?
 
 
 A - Div
 https://atcoder.jp/contests/abc198/tasks/abc198_a
 


Slide 20

Slide 20 text

A - Div の考え方
 ・・・
 N個
 Aさん
 Bさん
 互いに区別ができない 
     ↓
 何個ずつ分け合うか 
 高校 数学A
 重複組み合わせの基礎 | あうるさんの杜 
 https://awl3no.com/suugaku/baainokazu/choufukukumiawase-kiso 
 


Slide 21

Slide 21 text

A - Div のコード例
 n = gets.chomp.to_i
 
 
 if n < 2 then
 puts 0
 else
 puts n - 1
 end
 


Slide 22

Slide 22 text

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


Slide 23

Slide 23 text

A - ABC Swap の考え方
 A
 B
 C
 一般にこういう処理をswapと呼びます 
 
 Rubyの基本文法を習うときに言語仕様を 
 教えてもらった人もいるかも。 
 


Slide 24

Slide 24 text

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}" 
 


Slide 25

Slide 25 text

B - Bishop 
 [問題]
 
 B - Bishop https://atcoder.jp/contests/panasoni c2020/tasks/panasonic2020_b

Slide 26

Slide 26 text

B - Bishop の考え方


Slide 27

Slide 27 text

B - Bishop  の考え方
 一般化すると...
 全体のマスが奇数なら全マス数の半分 + 1 , 偶数なら 全マスの半分
 ビショップは動けることがわかるので、
 偶 x 偶 = 偶
 奇 x 奇 = 奇
 偶 x 奇 = 偶
 を使って、
 入力値 縦 x 横 の積に対して場合わけをすれば良さそう!
 


Slide 28

Slide 28 text

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
 


Slide 29

Slide 29 text

B - A to Z String 
 [問題]
 
 B - A to Z String
 https://atcoder.jp/contests/abc053/tasks/abc053_b 
 
 


Slide 30

Slide 30 text

B - A to Z String の考え方
 例えば、入力例3 において、
 
 HASFJGHOGAKZZFEGA 
 
 HASFJGHOGAKZZFEGA
 HASFJGHOGAKZZFEGA
 HASFJGHOGAKZZFEGA
 HASFJGHOGAKZZFEGA
 
 とかいっぱいでてくるジャン!!!
 とか思うとドツボにはまるので、シンプルに一番長いとこを取ってくりゃいいじゃん!って おもうのがコツかも
 


Slide 31

Slide 31 text

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 } 


Slide 32

Slide 32 text

キーワード
 - ループ (コレクション)
 - 再帰
 - ソート (マージ、フラッシュ、バブル...etc)
 - スタック/キュー
 - グラフ
 - 決定木
 - 全探索(幅優先/深さ優先)
 - 動的計画法(DP)
 


Slide 33

Slide 33 text

実装すると楽しそうなもの
 - Wordle
 - ボンバーマン (これは多次元配列に対してのアプローチが火をふきます)
 - まるばつゲーム (対話式から初めて -> ランダムな入力を繰り返して問題を解かせ る人工無能を作成する など)