(2021-05-28 11:47:01) 2021 年度前期コンピュータ 21
2021 年度 前期 コンピュータ 2
担当 和地 輝仁
1シラバス抜粋1
2授業のノート (Ruby 編)2
§1Ruby のインストール . . . . . . . . . . . . . . . . . . . . . . .2
§2繰り返しと条件分岐. . . . . . . . . . . . . . . . . . . . . . .2
§3クラスの初歩 . . . . . . . . . . . . . . . . . . . . . . . . . . .6
§4数値のクラス (Integer, Float) . . . . . . . . . . . . . . . . . .7
§5文字列のクラス (String) . . . . . . . . . . . . . . . . . . . . .8
§6真偽値のクラス (TrueClass, FalseClass, NilClass) . . . . . . .10
§7配列のクラス (Array) . . . . . . . . . . . . . . . . . . . . . . .11
§8繰り返しと配列 (Array)・範囲 (Range) . . . . . . . . . . . . .14
§9関数定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
§10関数定義の例 . . . . . . . . . . . . . . . . . . . . . . . . . . .19
§11再帰 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20
§12コンテナの要素の反復操作 (Enumerable) . . . . . . . . . . . .23
§13正規表現 (Regexp) . . . . . . . . . . . . . . . . . . . . . . . .27
§14文字列操作. . . . . . . . . . . . . . . . . . . . . . . . . . . .31
§15クラス # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
§16連想配列 (Hash)#. . . . . . . . . . . . . . . . . . . . . . . .36
§17数値計算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38
§18アルゴリズム . . . . . . . . . . . . . . . . . . . . . . . . . . .41
§19より進んだ課題 . . . . . . . . . . . . . . . . . . . . . . . . . .46
§20雑多な例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49
1シラバス抜粋
授業概要プログラミング言語 Ruby の基礎を学び、現代的なプログラミン
グの基礎的な知識を知る授業です。
1. スコープ、クラス、関数などプログラミング言語の基礎的な概念を理解
2. 条件分岐や繰り返しなどの制御構造を理解する。
3. 制御構造を活用してプログラムを作成できる。
授業計画順序を交換する場合もあるので注意すること。
1. Ruby のインストール
2. 繰り返しと条件分岐
3. クラスの初歩
4. 数値のクラス
5. 文字列のクラス
6. 配列のクラス
7. 繰り返しと配列
8. 関数定義
9. 関数定義の例
10. 再帰
11. コンテナの要素の反復操作
12. 正規表現
13. 文字列操作
14. 数値計算
15. 期末試験
成績評価期末試験では、Ruby スクリプトを用いて与えられた課題を解決
できるかどうかを評価する (50%)。各回の授業では演習問題を出題し、その
提出状況と内容も評価する (50%)。原則として全ての時間の出席を求めるが、
やむを得ない理由で欠席をする (した) 場合はできるだけ速やかに申し出て、
指示を受けること。
備考受講するには、コンピュータ 1 の単位を修得していることが望ましい
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 22
2授業のノート (Ruby 編)
§1Ruby のインストール
(1.1)計算機室の rubyこの授業では ruby というプログラム言語を学習す
る。2021 年度から、Visual Studio Code を利用する。これは、計算機室のコ
ンピュータにインストールされており、ruby のプログラムの入力と実行を便
利に行えるものである。
自分のコンピュータにインストールする場合は、
(1) https://code.visualstudio.com/download のインストーラで、Visual
Studio Code をインストール
(2) https://rubyinstaller.org/downloads/ の「Ruby+Devkit 3.0.0-1
(x64) 」Ruby 処理系をインストール (バージョン番号等は異なることも
(3) 以下の手順で Visual Studio Code の拡張機能をインストールする。まず、
Visual Studio Code を起動する。ウィンドウ左端のアイコン列の上側一
番下 (マウスホバーで「拡張機能」と出る) をクリックすると、「拡張機
能マーケットプレース」上部に検索欄があるので、そこで検索して、下
記の拡張機能をインストールする。
• Japanese Language Pack for Visual Studio Code
• Code Runner
• Ruby
• VSCode Ruby
• Ruby Solargraph
(1.2)動作確認Visual Studio Code で ruby の新規ファイルを作成し、次
の内容を入力する。
dosa.rb
1puts "hello"
保存しようするとファイル名を聞かれるが、「test」等と入力し、ファイルの
種類をプルダウンメニューから「Ruby」にし、保存する。
実行するには、ウィンドウ右上にある、右向き三角形のアイコンをクリッ
クする。実行結果は、エディタ画面の下に「出力」エリアが出現してそこに
現れる。texworks と違い、ファイルを変更した際は、保存してから実行しな
いと、変更は反映されないので注意すること。
(1.3)puts、コメント
プットエスputs は文字列を出力して改行するメソッド1であ
る。また、「#」以降行末までは無視されるので、コメント (注釈) を書くなど
できる。ruby では文字列は二重引用符で囲む2。
puts とコメントの説明
1puts "hi!" #あ い さ つ し ま す
§2繰り返しと条件分岐
(2.1)for 文for 文は繰り返しを実現する制御構造である。
for 文の文法
for < 変 数 > in < オ ブ ジ ェ ク ト >
< 処 理 > ( 複 数 行 で も よ い)
1ruby のメソッドは、C 言語などの「関数」、Small Basic の「サブルーチン」にあたる。2一重引用符も使えるが、二重引用符とは違いがある。§5 を参照。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 23
〈オブジェクト〉3 は each メソッド4に応答するものならば何でもよいが、典
型的には Array 型や Range 型のオブジェクトが使われる。下の例では Range
型のオブジェクト (1..5) を用いている。
for 文の例
1for i in (1..5)
2puts i
上の例では、変数 i が 1 から 5 までの整数を変化しながら、2 行目の「puts
i」を実行するので次のような出力になる。
12345��
下の例では Array 型のオブジェクト ["a", "bc", 4] を用いている。
for 文の例
1for x in ["a", "bc", 4]
2puts x
abc4��
3整数や文字列など、ruby で扱える「値」のこと。オブジェクトは整数 (Integer) や文字列(String)、あるいは、未習だが範囲 (Range)、配列 (Array)、正規表現 (Regexp) などのクラスに属する。4先 にSmallBasicの サ ブ ル ー チ ン に あ た る と 書 い た が 、rubyで は「object.method(parameter)」の よ う に 、す べ て の メ ソッド 呼 び 出 し は オ ブ ジェク ト に対して行われる。each メソッドに応答できるとは、object.each(..) という呼び出しが可能なobject のことを指す。
(2.2)演算子ruby で利用できる演算子5の主なものを下にあげる。表の上
の方ほど優先順位が高い。つまり、1-2**3*4 は 1-((2**3)*4) と解釈され
る。また、商 (/) は、割る数、割られる数とも整数 (Integer) の場合は整数
の商の意味であり、浮動小数点数 (Float) などのときは、商は小数になる可
能性もある。このように、演算対象のオブジェクトの型 (クラス) によって演
算子の動作が変わる場合があるので注意が必要である。
[]配列要素へのアクセス
!論理否定 (単項演算子)
-負号 (単項演算子)
* / %積、商、整数の剰余
+ -和、差
> >= < <=大小の比較演算子
== != =~ !~等値性の比較演算子、正規表現のマッチ
&&論理積 (かつ)
||論理和 (または)
=代入。自己代入も (+= -=など)
(2.3)課題 01 – ベキの計算自分の学生番号の 1 乗から 10 乗までを表示す
るプログラムを作成し提出せよ。ただし、学生番号の先頭が 0 の場合「0012」
などとはせずに、「12」としてプログラムに記述すること。
学生番号「1234」の場合の課題 01 の実行例��
12341522756187908090423187858355362861381721051424
5普段は意識しなくてよいが、a<20 のような記法は実は糖衣構文であり、ruby では演算子すらメソッドである。したがって例外を除けば演算子を再定義して動作を変更することすらできる。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 24
35309450437774572164357186184021382204544537676775108238564040729666349314048356638802626032648187505353567209228244052427776��
(2.4)if 文その 1if 文は条件分岐を実現する制御構造である。
if 文の文法その 1
if <式 >
< 処 理1 > ( 処 理 は 複 数 行 で も よ い)
else( e l s e の 部 分 は 省 略 可 能 )
< 処 理2 >
〈式〉が真6 ならば〈処理 1〉を、偽ならば〈処理 2〉を実行する。else の部
分は省略可能である。
if 文の例
1year = 2012
2if year % 4 == 0 #本 当 は 違 う
3puts "うるう年"
う る う 年��
「かつ」や「または」に相当する演算子も用いると、次のような if 文も書ける。
if 文の例
1hour = 23
2if hour>= 22 || hour<= 7
3puts "睡眠中"
6ruby で式が「偽」であるとは、式が NilClass のオブジェクト nil であるか、または、FalseClass のオブジェクト false であることを言う。式が「真」であるとは「偽」ではないことを言う。
5if hour > 7 && hour < 22
6puts "起床中"
睡 眠 中��
else 付き if 文の例
1hour = 10
2if hour>= 22 || hour<= 7
3puts "睡眠中"
5puts "起床中"
起 床 中��
(2.5)課題 02 – 3 の倍数かつ 4 の倍数ではないとき1 から 50 までの整数
を表示するが、整数が 3 の倍数であり、かつ、4 の倍数ではないときは「さー
ん」と表示するプログラムを作成し、「0000 和地-02.rb」のようなファイル名
(学生番号、名前、課題番号) で提出せよ。
課題 02 の実行例��
12さ ー ん45さ ー ん78さ ー ん
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 25
10111213::484950��
(2.6)if 文その 2if 文には elsif を記述できる。
if 文の文法その 2
if <式1 >
< 処 理1 >
elsif <式2 > ( e l s i f は 省 略 可 能 。 複 数 あ っ て も よ い )
< 処 理2 >
elsif <式3 >
< 処 理3 >
else( e l s e の 部 分 は 省 略 可 能 )
< 処 理 n>
〈式 1〉が真ならば〈処理 1〉を実行し、そうではないとき、〈式 2〉が真なら
ば〈処理 2〉を実行し、そうではないとき、〈式 3〉が真ならば〈処理 3〉を
実行し、if と elsif に書かれたすべての式が偽であったら〈処理 n〉を実行
elsif 付き if 文の例
1point = 95
2if point>= 90
3puts "A"
4elsifpoint>= 60
5puts "BCD"
7puts "F"
しかし elsif を用いずに以下のようにしてしまうと、意図に反する結果に
なる。それは、2 行目の if で条件が真になった後も、6 行目の if に到達して
しまうからである。このような場合は先の例のように elsif を用いる方が簡
潔に書ける。
意図に反する if 文の例
1point = 95
2if point>= 90
3puts "A"
56if point>= 60
7puts "BCD"
10if point < 60
11puts "F"
ABCD��
(2.7)課題 03 – FizzBuzz次のような出力をするプログラムを作成し、
「0000 和地-03.rb」のようなファイル名 (学生番号、名前、課題番号) で提出
せよ。つまり、i 番目 (i = 1, 2, . . . , 100) の行では、i が 3 の倍数ならば Fizz、
5 の倍数ならば Buzz、ただし 15 の倍数ならば FizzBuzz と表示し、それ以外
では i を表示するプログラムを作成せよ。
課題 03 の実行例��
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 26
2Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz16::98FizzBuzz��
§3クラスの初歩
(3.1)クラスとはruby のオブジェクトは必ずクラス7に属する。クラスとは
同種のオブジェクトの総称のような意味である。例えば、整数「1」は Integer
クラスのオブジェクト、文字列「"2"」は String クラスのオブジェクトであ
7オブジェクト指向言語の多くは (1970 年代の Smalltalk や C++からして)、 クラスシステムを備える。クラスシステムはオブジェクト指向言語に必須の要素であると誤解されたり、オブジェクト指向言語の特徴をあげてもクラスシステムの特徴をあげるに留まりがちである。しかし、ruby を ruby たらしめているのはメソッドの動的束縛である。for 文の項では、「each メソッドに応答するオブジェクト」という言い方をしたが、他の言語ならば「Array や Range クラスのオブジェクト」となるところである。つまり、ruby では、どのクラスに属するかは重要ではなく、どのメソッドに応答するかが重要である。オブジェクトの性質を知るのに、どのクラスに属するかではなく、どのメソッドに応答するかを手掛かりにする ruby のような方式をダックタイピングと呼ぶ。
Integer整数のクラス
Float浮動小数点数のクラス
Rational有理数のクラス
Complex複素数のクラスString文字列のクラス
Array配列のクラス
Hashハッシュのクラス
Range範囲オブジェクトのクラス
NilClassnil (偽) のクラス
FalseClassfalse (偽) のクラス
TrueClasstrue (真) のクラス
Regexp正規表現のクラス
IO基本的な入出力のためのクラス
Fileファイルアクセスのためのクラス
今のところ意識しなくても問題はないが、クラスには継承関係8がある。Ruby
では、例えば、Integer クラスのスーパークラスは Numeric クラスであり、
Integer クラスのオブジェクトは、Numeric クラスに対して定義されている
メソッドにも応答する。
オブジェクトは属するクラスのスーパークラスのメソッドを利用できるが、
その他にもモジュールをインクルードすると、そのモジュールに定義されて
いるメソッドも利用できるようになる。特に重要なものを以下にあげる。
モジュール説明
Kernelすべてのクラスから参照できるメソッドを定義している
Enumerable繰り返しを行うクラスのためのモジュール
8例えば、「正方形クラス」と「長方形クラス」があったとすると、正方形は長方形でもあるから、このようなとき、正方形クラスは長方形クラスのサブクラスであると言い、逆に、長方形クラスは正方形クラスのスーパークラスであると言う。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 27
(3.2)class メソッドRuby のオブジェクトの属するクラスを知るには、
class メソッドを用いる。
class の例
1puts 1.class , "2".class
FixnimString��
(3.3)to i と to s「1」と「”2”」はクラスが Integer と String で異な
るため和を計算できない。String クラスのメソッド to i を用いると、整数
に変換される。下の例で、単に、a+b としても型エラーになる。
to i の例
1a = 1
2b = "2"
3puts a + b.to_i
逆に、Integer クラスのオブジェクトは to s メソッドで String 型に変換
できる。下の例では、String オブジェクトに対する演算子+は文字列の連結を
する ((5.2) 参照)。
to s の例
1a = 1
2b = "2"
3puts a.to_s + b
§4数値のクラス (Integer, Float)
(4.1)IntegerRuby で扱える整数には桁数の制限がない。
Integer の例
1a = 2**62
2b = a-1
3puts a, b, a.class , b.class
46116860184273879044611686018427387903IntegerInteger��
環境により結果が異なるが、上の結果は ruby 2.6.3p62 (2019-04-16
revision 67580) [universal.arm64e-darwin20] のものである。
(4.2)Float クラスと数値の演算2.0 など小数点を含む数値は浮動小数点
数のクラス Float に属する。整数を Float に変換するときは、to f メソッド
を用いる。その逆は to i メソッドである。和や商など Integer と Float に
共通する演算は多いが、クラスによって結果が異なる。具体的には、整数ど
うしならば結果も整数、Float が混じれば結果も Float である。
Float の演算の例
1puts 2.class , 2.0. class , 2. to_f.class
2a = 5/2
3b = 5/2.0
4puts a, b
IntegerFloatFloat22.5��
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 28
(4.3)数値のクラスの主なメソッド数値オブジェクトが応答できる主なメ
ソッドをあげる。
5.6.abs5.6
5.6.floor5
5.6.ceil6
5.6.round65.6.to i5
-5.6.abs5.6
-5.6.floor-6
-5.6.ceil-5
-5.6.round-6-5.6.to i-5
−∞ 方向への丸め
+∞ 方向への丸め
四捨五入0 方向への丸め
(4.4)Float の誤差Float クラスには、10 進法と 2 進法の変換に起因する
誤差がある。下のように、ruby 内部では 0.3 ではないのに、表示では丸めら
れて 0.3 となる場合もある。このような場合を警戒して、Float を比較すると
きは==や!=を用いるのではなく、差の絶対値が十分小さいかどうかを調べる
べきである。
Float の誤差の例
1a = 0.1 + 0.1
2b = 0.1 + 0.2
3puts a, b
4puts a == 0.2
5puts b == 0.3
0.20.3 #こ こ は 環 境 に よ っ て 異 な り ま す
truefalse��
§5文字列のクラス (String)
(5.1)String のリテラル 9"abc"のように二重引用符で囲んでもよいし、
’def’ のように一重引用符で囲んでもよい。両者の違いは式展開10 と、バッ
クスラッシュ記法が使えるかどうかである。バックスラッシュ記法を用いる
と、通常キーボードから入力できない文字を指定できる。主なものを以下に
記法式結果説明
\n"a\nb"a, 0x0a, b改行文字 (0x0a)
\""a\"b"a, ", b二重引用符
\\u2019"a\\u2019b"a, ’, b一重引用符
\\"a\\b"a, \, bバックスラッシュ
一重引用符で囲んだ String のオブジェクトの場合、使えるバックスラッシュ
記法は一重引用符とバックスラッシュのみである。
(5.2)String の演算String のオブジェクトに対して可能な演算のうち主
なものをあげる。この他、!=, >, <=, >= も利用できる。
"abc" + "def""abcdef"連結
"abc" * 3"abcabcabc"反復
"abc" == "abb"false等値
"abc" < "abb"false辞書順で比較
"ab%s" % 3"ab3"フォーマット
上記のうちフォーマットの項は、文字列中の%s を 3 で埋めるという演算であ
る。詳細は後述する。
9リテラルとは、プログラム中に直接値を記述したもののことである。Integer のリテラル 1,Float のリテラル 2.3, Array のリテラル ["a", "bc", 4] は既に見た。"abc" が String のリテラルである。また有理数 (Rational) のようにリテラルがないものもある。10二重引用符の場合は、"ab#{1+2}cd" のように#{...} で囲んだ部分が、評価され、to s されて埋め込まれる。したがって、この文字列は"ab3cd"となる。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 29
(5.3)部分文字列s を String のオブジェクトとするとき、その部分文字
列を得るには次のような方法がある。先頭から何番目の文字かを数えるとき
は、0 開始である。また、s[0] の形式は、ruby 1.8 やそれ以前のバージョン
では結果が異なるので要注意である。
s"abcd"
s[0]"a"0 番目の文字 (ruby 1.9 以降)s[1..2]"bc"1 番目から 2 番目の文字
s[1..-1]"bcd"−n は後ろから n 番目を表す
s[-4]s[-3]s[-2]s[-1]
s[0]s[1]s[2]s[3]
← s[1..2] →
←−s[1..-1]−→
また、部分文字列に別の文字列を代入することもできる。長さが異なる文
字列を代入することもできる。
部分文字列への代入の例
1s = "abcd"
2s[3] = "x"
3puts s
4s[1..2] = "yzw"
5puts s
abcxayzwx��
(5.4)String クラスの基本的なメソッドString のオブジェクトが応答で
きるメソッドのうち、基本的なものをあげる。
"abc".size3文字数
"abc".reverse"cba"逆順
"abc".index("b")1部分文字列を検索して一致した位置
reverse メソッドは破壊的ではない11 ことに注意が必要である。つまり、
元の文字列はそのまま変化しない。他方、部分文字列への代入は破壊的メソッ
ドであった。
reverse の例
1s = "abc"
2t = s.reverse
3puts s, t
abccba��
index メソッドにおいて、検索して見付からない場合は nil が返る。また、
部分文字列を検索する、より強力な方法は、正規表現を用いる方法である (§13
index の例
1s = "abcac"
2puts s.index("a"), s.index("bc"), s.index("cb")
3t = ("123".to_i / 3). to_s.reverse.index("4")
4puts t
11対応する破壊的メソッドが用意されていることがあり、その場合末尾に!が付加されたメソッド名であることが多い。例えば、reverse!メソッドは破壊的であり、s.revese!すると s が変化する。ただし、破壊的メソッドを積極的に利用する理由はない。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 210
プットエスputs すると空文字列 ("") が表示されるため、上の出力の 3 行目は空
行になっている。
(5.5)課題 04 – 条件を満たす数の探索4 桁の整数であって、逆から読ん
でも自分自身と同じであるものを全て表示するプログラムを作成し提出せよ。
100111111221:( 中 略):977998899999��
(5.6)文字列出力と入力 (print, p, gets)関数
プットエスputs は文字列を出力した
あと改行したが、代わりに関数 print を用いると改行しない。
プットエスputs と print
は、大体、Small Basic の TextWindow.WriteLine と TextWindow.Write に
対応する。また、下の例のように微妙に挙動が異なる。関数 p も文字列を出
力し改行するが、オブジェクトを引数に渡すと、人間が読み易い形式で出力
print と p の例
1print [1, "2", "a"] #改 行 し な い
2puts [1, "2", "a"]#各 要 素 を puts す る
12[1, 2, "a"] は少し後に学ぶ配列である。
3p [1, "2", "a"]#見 易 い 。 改 行 す る
[1, "2", "a"]12a[1, "2", "a"]��
ゲットエスgets は文字列を 1 行キーボードから入力する組み込みの関数である (Small
Basic の TextWindow.Read に相当)。返り値は String のオブジェクトで、末
尾に改行文字 (\n) が付加されている。末尾の改行文字を除去したいときは、
String クラスの chomp メソッドを用いるとよい。
gets の例
1s = gets
2puts s
4p s.chomp
p を用いると、
プットエスputs や print では見えなくなってしまう、文字列中の改行
文字 (\n) なども、下のように表示される。
abc と入力したときの実行例��
abcabc"abc\n""abc"��
ただし、実行例の最初の 1 行は人間がキーボードから入力したものである。
§6真偽値のクラス (TrueClass, FalseClass, NilClass)
(6.1)true, false, nilRuby で真と偽を意味する組み込みの値、true と
false がある。これらは、TrueClass と FalseClass の、それぞれ唯一のオ
ブジェクトである。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 211
既に学んだ nil は NilClass の唯一のオブジェクトであり、これも偽とし
て扱われる。例えば、String クラスの index メソッドで検索が不成功だった
ときなど、偽を表す false とはやや違う「失敗」の意味を持つ場合に、「偽」
として扱われる返り値となることが多い。
Ruby では、「偽」として扱われるのは false と nil のみであり、他のすべ
てのオブジェクト「真」として扱われる。例えば、整数の 1 も真として扱わ
れる。実は、if 文の条件の箇所13には、どんな式を置いても構わない。a <
b という条件を表す式も、単に、true または false を返す式にすぎない。
1puts 1 < 2
2puts 1 == 2
3if 3 #f a l s e と n i l 以 外 は 真
4puts "真"
truefalse真��
(6.2)課題 05 – 入力と真偽値キーボードから文字列を 2 つ入力させて、
両者の長さ (文字数) が一致すれば true を、一致しなければ false を出力す
るプログラムを作成し提出せよ。ただし、if 文は用いないこと。
smallbasictrue��
ただし、実行例の最初の 2 行は人間がキーボードから入力したものである。
13if 文に限らず、条件を書くべき箇所は、実はどんな式も受け付ける
§7配列のクラス (Array)
(7.1)配列のリテラル配列とはオブジェクトを 1 列に並べたデータ構造
である。角かっこで囲み、各要素はカンマで区切り、[1, 2] とか、[1, 2,
"ab", nil] のようにして14記述する。1 つも要素を持たない配列は [] と
(7.2)Array の演算Array のオブジェクトに対して可能な演算のうち主な
ものをあげる。この他、辞書順で比較する演算として、!=, >, <=, >= も利用
でき、また、集合算として、| (和集合)、- (差集合) も利用できる
[1, 2] + [8, 9][1, 2, 8, 9]連結
[1, 2] * 3[1, 2, 1, 2, 1, 2]反復
[1, 2] == [1, 3]false等値
[1, 2] < [1, 3]true辞書順で比較
[1, 2] & [1, 3][1]共通部分
(7.3)配列の文字列への変換to s や join というメソッドで String のオブ
ジェクトに変換できる。
[1, 2, 3].to s"[1, 2, 3]"String に変換
[1, 2, 3].join("--")"1--2--3"間に文字列を挟む
配列の出力の例
1a = [1, "2"]
14[1,2,] のように最後の要素の後にカンマを付けてもよい。例えば、a = [1,2,]と 1 行に 1 要素を記述したとき、要素の順序を交換してもカンマの付けはずしが不要になる。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 212
2puts a#各 要 素 ご と に 改 行
3print a# 1 行 に 出 力 し て 改 行 し な い
4p a# 1 行 に 出 力 し て 改 行 す る
5puts a.to_s
6puts a.join(",")
12[1, "2"][1 , "2"][1, "2"]1,2��
(7.4)部分配列a を Array のオブジェクトとするとき、その部分配列を得
るには次のような方法がある。先頭から何番目の要素かを数えるときは、0 開
a[3, 1, 4, 1, 5]
a[0]30 番目の要素
a[1..2][1, 4]1 番目から 2 番目の要素
a[1..-1][1, 4, 1, 5]−n は後ろから n 番目を表す
a[-5]a[-4]a[-3]a[-2]a[-1]
a[0]a[1]a[2]a[3]a[4]
3,1,4,1,5
← a[1..2] →
←−a[1..-1]−→
また、配列の一部を別の要素で置き換えることもできる。配列の一部の範
囲を複数の要素で置き換えるときは、右辺の要素をカンマで区切る。こういっ
た要素の置き換えは破壊的メソッドである。
配列の一部の置き換えの例
1a = [1, 9, 9, 5, 2, 2, 4]
2a[0] = 9
4a[4..6] = 1, 0
[9, 9, 9, 5, 2, 2, 4][9, 9, 9, 5, 1, 0]��
(7.5)Array クラスの基本的なメソッドArray のオブジェクトが応答でき
るメソッドのうち、基本的なものをあげる。
[1, 9, 9, 5].size4要素数
[1, 9, 9, 5].reverse[5, 9, 9, 1]逆順
[1, 9, 9, 5].index(9)1最初に出現する位置
[1, 9, 9, 5].sort[1, 5, 9, 9]整列
[1, 9, 9, 5].max9最大値
[1, 9, 9, 5].uniq[1,9,5]重複要素を省略
String のときと同様に、reverse メソッドは破壊的ではないことに注意が
必要である。さらに、sort と uniq も破壊的ではない。つまり、元の配列は
そのまま変化しない。また、最小値は min メソッドで求められる。
reverse, sort, uniq の例
1a = [1, 9, 9, 5]
2b = a.reverse
3c = a.sort
4d = a.uniq
5p a, b, c, d
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 213
[1, 9, 9, 5][5, 9, 9, 1][1, 5, 9, 9][1, 9, 5]��
String のときと同様に、index メソッドで要素が見付からない場合は nil
(7.6)配列の末尾と先頭への追加と取り出しpush と pop の 2 つのメソッ
ドは、それぞれ、配列の末尾への追加と取り出しを行う。どちらも破壊的、つ
まり、実行後に元の配列が変更される。push メソッドの返り値は (変更され
た) 配列自身であり、pop メソッドの返り値は取り出した要素である。
push, pop の例
1a = [1, 2, 3]
2a.push (9)
4x = a.pop
5p a, x
[1, 2, 3, 9][1, 2, 3]9��
push と for 文を組み合わせると、配列の構築に使える。
push を用いた配列の構築
1a = []
2for i in (1..4)
3str = gets.chomp
4a.push(str)
abc12def["abc", "1", "2", "def"]��
ただし、実行例の最初の 4 行は人間がキーボードから入力したものである。
また、unshift と shift の 2 つのメソッドは、それぞれ、配列の先頭への
追加と取り出しを行う。どちらも破壊的、つまり、実行後に元の配列が変更
される。unshift メソッドの返り値は (変更された) 配列自身であり、shift メ
ソッドの返り値は取り出した要素である。
(7.7)課題 06 – 配列の構築キーボードから文字列を 4 つ入力させて、辞
書順に出力するプログラムを作成し提出せよ。
HokkaidoUniversityEducationKushiroEducationHokkaidoKushiroUniversity��
ただし、実行例の最初の 4 行は人間がキーボードから入力したものである。
(7.8)要素の削除delete at メソッドは指定した位置の要素を削除し、
delete メソッドは指定した要素と等しい要素をすべて削除する。どちらも
破壊的なメソッドである。また、返り値についてはどちらのメソッドも、要
素を実際に削除できたらその要素を返し、そうでなければ nil を返す。
delete at, delete の例
1a = [1, 9, 9, 5, 2, 2, 4]
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 214
2x = a.delete_at 3
3p a, x
4x = a.delete 2
5p a, x
[1, 9, 9, 2, 2, 4]5[1, 9, 9, 4]2��
§8繰り返しと配列 (Array)・範囲 (Range)
(8.1)配列の上を繰り返す for 文既に学んだ for 文
for 文の文法
for < 変 数 > in < オ ブ ジ ェ ク ト >
< 処 理 > ( 複 数 行 で も よ い)
の〈オブジェクト〉には、(1..10) のようなオブジェクトの他に、Array の
オブジェクトも利用できる。
for 文の例
1for x in [2, "4", 6]
2print x.class , " "
3puts x
上の例では、変数 x が [2, "4", 6] の各要素を変化しながら、2 行目の「print
x.class, " "」と 3 行目の「puts x」を実行するので次のような出力になる。
Integer 2String 4Integer 6��
(8.2)課題 07 – 配列キーボードから文字列を 4 つ入力させて、辞書順の
逆順に出力し、さらに、表示するときの行頭に、文字数も出力するプログラ
ムを作成し提出せよ。
HokkaidoUniversityEducationKushiro10 University7 Kushiro8 Hokkaido9 Education��
ただし、実行例の最初の 4 行は人間がキーボードから入力したものである。
(8.3)範囲 (Range)∗for 文にも用いた (1..10) は、範囲を表す Range
クラスのオブジェクトである。
Range のリテラルの文法
(a..b)(a...b)
どちらも a から b までの範囲を表すが、(a..b) は終点を範囲に含み、(a...b)
は終点を範囲に含まない。a や b は、Integer や String などのオブジェク
ト15を使用できる。
Range のオブジェクトは to a メソッドで配列に変換できる。
to a の例
1r = (3...6)
2a = r.to_a
15正確には、<などで互いに比較可能なオブジェクトであって、succ メソッドに応答するオブジェクトである。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 215
[3, 4, 5]��
(8.4)while 文for 文は反復回数が事前にわかっている繰り返し構造だが、
指定された回数で終了するのではなく、条件によって繰り返しを終了するよ
うな繰り返し構造が while 文である。
while 文の文法
while <式 >
< 処 理 > ( 複 数 行 で も よ い)
まず繰り返しの先頭で〈式〉を評価して、偽ならば繰り返しを終了する。真
ならば〈処理〉を実行し、再び 1 行目に戻って〈式〉を評価して偽ならば繰
り返しを終了する。こうして、〈式〉が偽になるまで〈処理〉を繰り返し実行
while 文の例
1a = 0
2while a**2 < 10
3puts a
4a = a + 1
上の例では、変数 a をまず 0 に設定してから、a の 2 乗が 10 未満の間、a を
表示して 1 加算することを繰り返すので、次のような出力になる。
0123��
(8.5)break 文break 文は、for や while の繰り返し構造から強制的に脱
break 文の例
1texts = []
2whiletrue
3s = gets
4if s == "\n" #E n t e r の み 入 力 し た 場 合
5break
7texts.push s
9p texts
上の例では、while 文の条件式が true で常に真なので、ここの判定で繰り
返しを終了することはないが、
ゲットエスgets で何もタイプせずに Enter を入力したと
き16に、break 文で while ループを脱出する。
123abxyz
["123\n", "ab\n", "xyz\n"]��
ただし、実行例の最初の 4 行は人間がキーボードから入力したものである。
(8.6)無限ループ無限ループ while true ...end は、loop {...} と
も書くことができる。
loop 文の例
1loop {
2s = gets.chomp
ゲットエスgets によりキーボードから文字列を入力したときは、文字列末尾が必ず改行文字 (0x0a)
になるため、何もタイプせずに Enter を入力したときは、ゲットエスgets の返り値は改行文字 1 文字からなる String のオブジェクトである。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 216
3if s == ""
4break
6puts s.size
8puts "おわり"
1233ab2
お わ り��
ただし、実行例の 1 行目、3 行目、5 行目は人間がキーボードから入力したも
(8.7)課題 08 – 入力データを逆順に表示文字列を繰り返しキーボードか
ら入力させ、Enter のみ入力されたときに終了する。入力がすべて完了した後
に、文字列を入力されたのとは逆順に表示するプログラムを作成し提出せよ。
a, Enter, b, Enter, c, Enter, Enter と入力したときの実行例��
ただし、実行例の最初の 4 行は人間がキーボードから入力したものである。
(8.8)課題 09 – 入力データが重複を除いていくつあるか表示文字列を繰
り返しキーボードから入力させ、Enter のみが入力されるまで続ける。入力が
すべて完了した後に、入力された文字列から重複したものを除くといくつの
データがあったか表示するプログラムを作成し提出せよ。ただし最後の Enter
のみの入力は、個数に含めない。
a, Enter, b, Enter, a, Enter, Enter と入力したときの実行例��
ただし、実行例の最初の 4 行は人間がキーボードから入力したものである。
(8.9)課題 10 – 入力データの最大値数値を繰り返しキーボードから入力
させ、Enter のみが入力されるまで続ける。その後、入力された数値の最大値
を表示するプログラムを作成し提出せよ。配列の最大値を求める max メソッ
ドがあるが、用いても用いなくてもよい。
ただし、実行例の最初の 4 行は人間がキーボードから入力したものである。
§9関数定義
(9.1)関数定義の利点何度も同じ処理をする場合や、まとまった意味のあ
る処理をする場合は、その処理を行う関数を定義するとよい。まず、同じコー
ドを何度も書くことが避けられるから、プログラムが短くなる利点がある。
その処理を変更する場合も関数定義の部分だけ修正すればよく、作業量が減
る利点や、修正し忘れによるミスを防ぐ利点もある。意味のある処理のまと
まりで関数を定義すれば、(例えば関数名を見るだけで) 何の処理をしている
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 217
かすぐにわかり、プログラムの処理内容を把握しやすくなる利点がある。モ
ジュール化17できるという利点もある。つまり、一旦関数を定義してしまえ
ば、どういう入力に対してどういう返り値が返るか (インターフェイス) だけ
知れば関数を利用でき、インターフェイスを変更しない限りは、関数を改良
してもプログラムの他の部分には影響を与えない。変数名の衝突も気にしな
くてよいので、他のプログラムで関数を再利用することができる。
(9.2)関数定義の方法ここで定義する関数は、ruby では「関数形式で呼び
出せるメソッド」である。つまり、ruby では関数もメソッドである。
関数定義の文法
def < 関 数 名 >( < 仮 引 数1 > , < 仮 引 数2 > ,...)
< 処 理 > ( 複 数 行 で も よ い)
かりひきすう仮引数〉18はひとつもなくてもよく、その場合は丸かっこの対も不要である。
関数定義と呼び出しの例
1def puts1(n)
2puts n+1
45puts1 2
6puts1 (3)
上の例では、引数 n に 1 を加えたものを表示する関数 puts1 を定義している。
それを利用して、引数に 2 を渡して呼び出し、次に引数に 3 を渡して呼び出
している19。
17(3.1) で述べた、Enumerable モジュールなどの ruby の組み込みクラスの Module の意味ではなく、まとまった機能を持つ単位という一般名詞的な意味である。
ひきすう引 数とは関数に渡されるパラメータのことである。関数定義中での引数は、まだ実行時の値が決まっていないというような意味で、仮引数と呼ばれ、下の例の puts1(3) の 3 のような、実行時関数に渡されるものを実引数と呼ぶ。ただし、両方とも単に引数と呼んでも実害はあまりない。19関数呼び出しのとき、引数を囲む丸かっこは、誤解が生じないときは省略できる。
(9.3)関数の返り値 (戻り値)擬似乱数を返す ruby の組み込みの関数 rand
がある。m が正整数のとき、rand(m) は 0 以上 m 未満の整数をランダムに返
す。このような、関数が返す値を返り値 (戻り値) と呼ぶ。ユーザーが定義し
た関数の返り値は、最後に実行した命令の値である。
関数の返り値の例
1def rev(x) #x を 逆 か ら 読 ん だ 整 数 を 返 す
2y = x.to_s
3y.reverse.to_i
56puts rev (13) , rev (25) , rev (13)+ rev (25)
上の関数 rev は、引数の整数を逆から読んだ数を返り値として返す。
315283��
(9.4)例引数を 2 つ受け取り、比較して大きい方 (正確には小さくない方)
を返す関数 big を定義して使用してみる。
関数定義と利用の例
1def big(a, b) #a と b の 最 大 値 を 返 す
2if a > b
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 218
89puts big(2, 3), big("ab", "ac")
(9.5)例数値の引数を 1 つ受け取り、1 からその数までの総和を返す関数
sum を定義して使用してみる。
関数定義と利用の例
1def sum(n) # 1 か ら n ま で の 総 和 を 返 す
2total = 0
3for i in (1..n)
4total = total + i
6total
89puts sum (10), sum (100)
555050��
(9.6)関数定義中の変数のスコープ上の総和を求める関数 sum を次のよう
に書いても、エラーが出て動作しない。
関数定義の失敗例
1def sum() # 1 か ら n ま で の 総 和 を 返 す 失 敗 例
2total = 0
3for i in (1..n)
4total = total + i
78n = 10
9sum()
10putstotal
これは関数定義中、そこで現れた引数も含めた変数 (1 行目から 6 行目までの
total や n) は、その関数定義中でのみ有効であり、呼び出し元に同名の変数
があったとしても別のものとして扱われるからである。このような、変数が
有効な範囲をスコープと言う20。上の例だと、3 行目の n は、8 行目の n と別
物なので、値がないというエラーが 3 行目で発生する。もし、そのエラーが
なかったとしても、10 行目の total は、2, 4 行目の total と別物なので、10
行目でもエラーが発生する。
逆に、スコープのおかげで、関数定義の内外での変数名の衝突が避けられる。
(9.7)課題 11 – 3 要素の最小値引数を 3 つとり、その最小値を返す関数
small(a, b, c) を定義し、それを用いて、数を 3 つキーボードから入力さ
せ、その最小値を表示するプログラムを作成し提出せよ。ただし、配列の最
小値を求めるメソッド min は用いても用いなくてもよい。
�1, Enter, 2, Enter, -1, Enter と入力したときの実行例�
12-1-1��
最初の 3 行分は人間の入力であり、最後の 1 行が ruby の出力である。
(9.8)課題 12 – 階乗階乗を計算して返す関数 fact(n) を定義し、それを
用いて、数を 1 つキーボードから入力させ、その階乗を表示するプログラム
を作成し提出せよ。ただし、(11.1) のような再帰は用いないこと。
36, Enter と入力したときの実行例��
20Small Basic にはスコープがなかったので、このようなコードでも期待通りに動作した
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 219
36371993326789901217467999448150835200000000��
最初の行は人間の入力であり、次の行が ruby の出力である。
§10関数定義の例
(10.1)return 文関数 (メソッド) の実行を中断し呼び出し元へ戻る。
return 文の文法
returnreturn <式 >
その関数の返り値は〈式〉で指定するが、〈式〉を省略すると返り値は nil に
(10.2)素数判定引数で与えられた整数が素数かどうか判定する関数
prime?を作る。そして、これを用いて、入力された整数が素数かどうか表
示するプログラムを作ってみる。
素数判定の例
1def prime ?(n) #n が 素 数 な ら t r u e 、 他 は f a l s e を 返 す
2if n == 1
3returnfalse
5for a in (2..n-1)
6if n % a == 0
7returnfalse
10true
1213putsprime ?( gets.to_i)
ここでは、1 は素数ではないから直ちに false を返し、2 以上 n 未満の整数
で割り切れたら直ちに false を返し、一度も割り切れなかったら true を返
すというアルゴリズムを採用した21。
17 を入力したときの実行例��
17true��
ただし、実行例の 1 行目は人間がキーボードから入力したものである。
(10.3)課題 13 – 素数列挙1 から 100 までの素数からなる配列を作成し、
出力するプログラムを作成し提出せよ。ただし、(10.2) の関数 prime?を変更
なしに再利用せよ。
実行例 (長いので途中で折り返して例示している)��
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]��
(10.4)約数のリスト引数で与えられた整数に対して、その整数の約数か
らなる配列を返り値として返す関数 divisors を定義する。そして、これを
用いて、入力された整数の約数の配列を表示するプログラムを作ってみる。
約数列挙の例
1defdivisors(n) #n の 約 数 の 配 列 を 返 す
2divs = []
3for a in (1..n)
4if n % a == 0
5divs.push a
1011p divisors(gets.to_i)
21n-1 まで割り切れるか試す必要はなく、√n までで十分である。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 220
関数 divisors では、1 以上 n 以下の整数が、n を割り切ったならば、配列
divs に追加する。そして、最後に、配列 divs を返り値として返している。
72 を入力したときの実行例��
72[1, 2, 3, 4, 6, 8, 9, 12, 18, 24, 36, 72]��
ただし、実行例の 1 行目は人間がキーボードから入力したものである。
(10.5)課題 14 – 素数である約数引数で与えられた整数に対して、そ
の整数の約数のうち素数であるものからなる配列を返り値として返す関数
primedivisors を定義せよ。そして、それを用いて、キーボードから入力さ
れた整数の約数のうち、素数であるものを表示するプログラムを作成し提出
72 を入力したときの実行例��
72[2, 3]��
ただし、実行例の 1 行目は人間がキーボードから入力したものである。
解くにあたり、(10.4) の例を参考にし、かつ、素数判定関数として、(10.2)
の prime?を変更なしに再利用すること。
(10.6)課題 15# – 公約数2 つの整数を引数にとり、それらの公約数から
なる配列を返す関数 commondivisors(m, n) を定義せよ。そして、それを用
いて、2 数をキーボードから入力し、それらの公約数の配列を表示するプロ
グラムを作成し提出せよ。解くにあたり、(10.4) の関数 divisors を再利用す
ること。また、Array クラスの演算子& (集合としての共通部分) を用いよ。
72 と 60 を入力したときの実行例��
7260[1, 2, 3, 4, 6, 12]��
ただし、実行例の最初の 2 行は人間がキーボードから入力したものである。
(10.7)課題 16# – 最大公約数2 つの整数を引数にとり、それらの最大公
約数を返す関数 gcd(m, n) を定義せよ。そして、それを用いて、2 数をキー
ボードから入力し、それらの最大公約数を表示するプログラムを作成し提出
72 と 60 を入力したときの実行例��
726012��
ただし、実行例の最初の 2 行は人間がキーボードから入力したものである。
解くにあたり、(10.4) の関数 divisors を変更なしに再利用すること。ま
た、(10.6) を参考にしてもよい。
(11.1)再帰呼び出し関数が自分自身を呼び出すことを再帰呼び出しと呼
んだり、その関数が再帰的に定義されていると言う。数学でも再帰的な定義
はよく見られる22。
1(n = 0)
n × (n − 1)!(n ≥ 1)
この階乗の定義をそのまま ruby の関数にすると以下のようになる23。
階乗関数の再帰による定義
1def fact(n) #n の 階 乗 を 返 す
2if n == 0
5n * fact(n-1)
22n が負の場合は n! を定義していないことに注意。23n が非負整数以外で呼び出されることは想定していないが、仮に n に負の数や、整数以外を与えて呼び出すとどうなるだろうか。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 221
実際に fact(4) を呼び出したときの動作は以下のようになるが、ここでは
(11.2)配列の総和数値を要素に持つ配列の総和を求める関数 sum を、繰
り返しを用いて定義すると次のようになる。
配列の総和 sum の繰り返しによる定義 その 1
1def sum(ary) #配 列 a r y の 要 素 の 総 和 を 返 す
2total = 0
3for i in (0... ary.size)
4total = total + ary[i]
6total
89puts sum [2, 3, 5, 7]
あるいは、配列の上を繰り返すこともできるので、次のようにも定義できる24。
配列の総和 sum の繰り返しによる定義 その 2
1def sum(ary) #配 列 a r y の 要 素 の 総 和 を 返 す
2total = 0
3for x in ary
4total = total + x
6total
89puts sum [2, 3, 5, 7]
24こちらの方が、配列の添字 i や配列のサイズという、総和を求めるのに不要なものをプログラムから排除できるので、結果として読み易いプログラムになる。
ところで、総和は、
ary の総和 =
0(ary が空)
ary[0] +「ary[1..-1] の総和」 (ary が空ではない)
と再帰的にも定義できるので、これを ruby の関数にすると以下のようにな
配列の総和 sum の再帰による定義の例
1def sum(ary) #配 列 a r y の 要 素 の 総 和 を 返 す
2if ary.size == 0
5ary [0] + sum(ary [1.. -1])
89puts sum [2, 3, 5, 7]
(11.3)課題 17 – 配列の要素の積数値を要素に持つ配列 ary を引数にと
り、その要素の積を求める関数 mul(ary) を、再帰を用いて定義せよ。ただ
し、空配列に対しては 1 を返すこと。そして、関数 mul(ary) を用いて、puts
mul([2, 3, 5, 7]) (数値は任意) などとして適当な配列の要素の積を表示
するプログラムを作成せよ。
puts mul([2, 3, 5, 7]) としたときの実行例��
25if ary.size == 0 は、if ary.empty? と書き換えることができる。この empty?は、配列が空なら真、そうでなければ偽を返すメソッドである。配列が空かどうか知りたいだけなので、empty?メソッドを用いると、配列のサイズの計算がプログラムから消えて読み易いプログラムになる。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 222
(11.4)二項係数二項係数は、整数 0 ≤ r ≤ n に対して、(nr
)= n(n − 1) · · · (n − r + 1)
r!(n − r)!
で定義された。これをそのまま ruby の関数にすると以下のようになる。ただ
し、(11.1) で定義した関数 fact をそのまま用いる。
二項係数の定義の例
1def fact(n) #n の 階 乗 を 返 す
2if n == 0
5n * fact(n-1)
89def binom(n, r) #二 項 係 数 n C r を 返 す
10fact(n) / fact(r) / fact(n-r)
1213putsbinom (10, 3)
他方、二項係数は、整数 0 ≤ r ≤ n に対して、
1(r = 0 または r = n)(n−1r−1)+(n−1r)(0 < r < n)
と再帰的にも定義できた26。これを ruby の関数にすると以下のようになる。
二項係数の再帰による定義の例
1def binom(n, r) #二 項 係 数 n C r を 返 す
2if r == 0 || r == n
5binom(n-1, r-1) + binom(n-1, r)
26パスカルの三角形を作る関係式である
89putsbinom (10, 3)
(11.5)課題 18 – フィボナッチ数列フィボナッチ数列とは、
F1 = 1,
F2 = 1,
Fn+2 = Fn+1 + Fn
で再帰的に27定義される数列である。1 つの整数 n を引数にとり、フィボナッ
チ数列の第 n 項を返す関数 fib(n) を定義し、それを用いて、数を 1 つキー
ボードから入力させ (n とする)、フィボナッチ数列の第 n 項を表示するプロ
グラムを作成し提出せよ。
30 を入力したときの実行例��
30832040��
ただし、実行例の 1 行目は人間がキーボードから入力したものである。計算
には意外に時間がかかるので注意。
(11.6)課題 19# – ユークリッドの互除法2 つの整数を引数にとり、それら
の最大公約数を返す関数 gcd(m, n) を (10.7) で定義したが、ここでは、ユー
クリッドの互除法を用いて再帰的な関数を定義する。a と b の最大公約数を求
めるユークリッドの互除法は以下のような再帰的アルゴリズムである。
(1) b = 0 ならば、a を最大公約数として返して終了する。
27数学では帰納的にと言う。同じことである。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 223
(2) そうでないなら、a を b で割った余りを r として、b と r (b > r に注意)
の最大公約数を求める。
2 つの整数を引数にとり、それらの最大公約数を返す関数 gcd(m, n) を、ユー
クリッドの互除法を用いて定義し、それを用いて、数を 2 つキーボードから
入力させ、それらの最大公約数を表示するプログラムを作成し提出せよ。
72 と 60 を入力したときの実行例��
726012��
ただし、実行例の最初の 2 行は人間がキーボードから入力したものである。
(11.7)課題 20# – ハノイの塔ハノイの塔というゲームがある。互いに大
きさの異なる円板が n 枚あり、最初は場所 A に下ほど大きくなるように積み
上げられている。他に場所 B, C がありそこには円板は置かれていない。ゲー
ムの目的は n 枚の円板を場所 C に移動することである。
円板の移動では、最も上に積んである 1 枚だけが移動でき、移動した先で
も下ほど大きくなるように積み上げられていなくてはならない。
円板が 2 枚のとき: A→B, A→C, B→C
円板が 3 枚のとき: A→C, A→B, C→B, A→C, B→A, B→C, A→C
という手順となる。つまり、
(1) A から B へ、上から n − 1 枚を移動する
(2) A から C へ円板を 1 枚移動する (大きさ最大のものである)
(3) B から C へ、n − 1 枚を移動する
n − 1 枚を移動するには再帰の考えを用いる。
ハノイの塔の解を表示する関数 hanoi(start, goal, other, n) を再帰
を用いて作成せよ。ここで、n は移動する円板の枚数、start, goal, other
は、それぞれ円板の移動元、移動先、残りの場所の名前である。それを用い
て、キーボードから正整数 n 入力させて、円板 n 枚のハノイの塔の解を表示
するプログラムを作成し提出せよ。
4 をを入力したときの実行例��
4A->BA->CB->CA->BC->AC->BA->BA->CB->CB->AC->AB->CA->BA->CB->C��
ただし、実行例の最初の行は人間がキーボードから入力したものである。
§12コンテナの要素の反復操作 (Enumerable)
(12.1)Enumerable モジュールRubyには配列 (Array) やハッシュ(Hash)
のようなコンテナクラス28がいくつかある。これらは、他のオブジェクトを
「格納」しているという共通点があるため、行いたい操作も共通したものが多
いといえる。例えば、配列やハッシュの各要素を表示したいとか、配列やハッ
シュの要素を小さい順に整列したいだとかである。Array クラスや Hash クラ
スにそういった機能を追加するのが Enumerable モジュールであり、Array
クラスには Enumerable モジュールが Mix-in されている、などと言う。多
28コンテナとは、配列 (Array) オブジェクトのように、他のいくつかのオブジェクトを「格納」しているオブジェクトのことを指す。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 224
くのコンテナに共通に Enumerable モジュールが Mix-in されているため、そ
れらのコンテナに対する整列などの操作は共通の記述で行える。
(12.2)each メソッドコンテナの各要素を繰り返し訪れるのが each メソッ
ドである。配列などのコンテナオブジェクト container に対する each メソッ
ドの文法は、
each メソッドの文法
container.each {|x|
< x を 用 い た 処 理 >
となる。下の例では、配列の各要素を表示する。
each メソッドの例
1[2, 4, 5, 7]. each {|x|
2puts x
これは、次の for 文を用いた例とほぼ等価である29。
for 文を用いた等価な例
1for x in [2, 4, 5, 7]
2puts x
2457��
29唯一の違いは、each メソッドでは変数のスコープが導入されるが、for 文だと導入されないことである。つまり、each メソッドの外側にあるかも知れない変数 x は変更されないが、for文だと変更される。
(12.3)ブロックeach メソッドの文法にあるブレース ({}) で囲まれた部
分をブロックと呼ぶ。
ブロックの文法
{|x1 , x2 , .., xn|< 処 理 > }
ブロックは、x1 から xn を引数とする関数の役割をし、最後に実行した式が
ブロックの返り値となる。しかし、通常の関数定義のように関数名を付ける
わけではないので、無名関数と呼ばれることもある。
Ruby では for 文のような形式よりも、each メソッドのようなブロックを
用いた形式で、さまざまな操作を記述することが多い。
(12.4)Enumerable#mapEnumerable モジュールには、map メソッ
ド30 が定義されているので、Enumerable モジュールを Mix-in しているど
のクラスでも、map メソッドを利用できる。map メソッドは、コンテナの各要
素を写像して、新しい配列を返すメソッドである。
Enumerable#map の文法
container.map {|x|
< x を 用 い た 式 >
次の例では、配列の各要素を平方して新しい配列を作成している。
Enumerable#map の例
1a = [2, 4, 5, 7]
2b = a.map {|x|
30あるクラスやモジュールで、あるメソッドが定義されているとき、そのメソッドを「クラス名#メソッド名」や「モジュール名#メソッド名」のように表す。同名メソッドでもクラスにより動作が異なる場合があるので、クラスやモジュール名を明示したい時や、どのクラスやモジュールで利用できるのかを明示したい時に便利である。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 225
[4, 16, 25, 49]��
また、Enuberable#map は破壊的ではない。つまり、上の例では、a は map
メソッド実行後も、[2, 4, 5, 7] のままである。
(12.5)Enumerable#ﬁndEnumerable#find は、ブロックの返り値が真
になった最初の要素を返す。
Enumerable#find の例
1a = [2, 4, 5, 7]
2t = a.find {|x|
3x % 3 == 1
5puts t
(12.6)Enumerable#selectEnumerable#select は、ブロックの返り値
が真になる要素を集めた配列を返す。
Enumerable#select の例
1a = [2, 4, 5, 7]
2b = a.select {|x|
3x % 3 == 1
[4, 7]��
また、Enuberable#select は破壊的ではない。つまり、上の例では、a は
select メソッド実行後も、[2, 4, 5, 7] のままである。
(12.7)Enumerable#sort byEnumerable#sort by メソッドは、コン
テナの要素どうしを直接比較するのではなく、コンテナの各要素を一旦写像
したもの (ソートキーと呼ぶ) を比較してソートする。次の例では、数値をそ
の絶対値の小さい順にソートしている。
Enumerable#sort by の例
1a = [4, -3, 2, -5, 1]
2b = a.sort_by {|x| x.abs }
[1, 2, -3, 4,-5]��
絶対値はあくまでソートキーであって、整列されるのは元の要素である。sort
メソッドと同様に、sort by メソッドも破壊的ではない。
(12.8)例 (偶数からなる配列)正整数 n が与えられたときに、[2, 4, 6,
.., 2n] という配列をいくつかの方法で作成してみる。
for 文を用いた例
1n = 4
2a = []
3for i in (1..n)
4a.push(i*2)
each メソッドを用いた例
1n = 4
2a = []
3(1..n). each {|x|
4a.push(x*2)
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 226
map メソッドを用いた例
1n = 4
2a = (1..n).map {|x|
select メソッドを用いた例
1n = 4
2a = (1..n*2). select {|x|
3x % 2 == 0
[2, 4, 6, 8]��
(12.9)例 (異なる方法での整列)3 人に対して、算数と国語の試験をした。
名前算数国語
1 人の名前と算数と国語の試験の点数を、配列で ["A", 78, 74] のように表
すことにし、それらを 3 人分集めて配列を作ると、[ ["A", 78, 74], ["B",
69, 85], ["C", 77, 78] ] となる。この配列を名前、算数の得点、国語の
得点、合計得点でそれぞれ整列すると次のようになる。
異なる方法での整列の例
1a = [["A" ,78,74], ["B" ,69,85], ["C" ,77 ,78]]
2a0 = a.sort_by {|name , math , jpn| name }
3a1 = a.sort_by {|name , math , jpn| math }
4a2 = a.sort_by {|name , math , jpn| jpn }
5a3 = a.sort_by {|name , math , jpn| math + jpn }
6p a0 , a1 , a2 , a3
[["A", 78, 74], ["B", 69, 85], ["C", 77, 78]][["B", 69, 85], ["C", 77, 78], ["A", 78, 74]][["A", 78, 74], ["C", 77, 78], ["B", 69, 85]][["A", 78, 74], ["B", 69, 85], ["C", 77, 78]]��
(12.10)課題 21 – Enumerable#map数を 4 つキーボードから入力さ
せて、その 4 数を要素に持つ配列をまず作り、次に、4 数をそれぞれ平方した
要素を持つ配列を作り、表示するプログラムを作成し提出せよ。
1, 3, 5, 7 の順に入力したときの実行例��
1357[1, 9, 25, 49]��
ただし、実行例の 1 行目から 4 行目は人間がキーボードから入力したもので
(12.11)課題 22 – Enumerable#select正整数を 1 つキーボードから入
力させて、それを n とするとき、1 以上 n 以下の整数のうち、3 の倍数でも 4
の倍数でもない整数からなる配列をまず作り、表示するプログラムを作成し
提出せよ。ただし、for 文は用いないこと。
14 を入力したときの実行例��
14[1, 2, 5, 7, 10, 11, 13, 14]��
ただし、実行例の最初の行は人間がキーボードから入力したものである。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 227
(12.12)課題 23 – 文字数によるソート文字列を 4 つキーボードから入力
させて、それらを文字数の短い順に整列して表示するプログラムを作成し提
HokkaidoUniversityEducationKushiroKushiroHokkaidoEducationUniversity��
ただし、実行例のはじめの 4 行は人間がキーボードから入力したものである。
(12.13)課題 24 – 素数の配列1 から 100 までの素数からなる配列を (10.2)
の prime? と select メソッドを利用して作成し、その配列を表示するプロ
グラムを作成し提出せよ。
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]��
上の出力では、行が長いので途中で折り返して例示している。
§13正規表現 (Regexp)
(13.1)正規表現正規表現とは、文字列の比較や照合に用いる「パターン」
を表す非常に強力な方法である。Ruby に限らず多くの言語31で利用できる。
正規表現といっても言語ごとに方言があり、すべをここで網羅するわけには
いかないが、どの言語でもほぼ共通に使える正規表現記号を以下に記す。ま
31例をあげると、Perl, Python, PHP, Java, JavaScript, いわゆる.NET, awk, sed などがあり、文字列検索に正規表現が使えるエディタには、Microsoft Word, Emacs (Meadow), vi,サクラエディタ、秀丸などがある
た、正規表現記号ではない文字、例えば「a」とか「"」などは、単にその文
字そのものにマッチする正規表現になる。
主な正規表現記号 (メタ文字)
.改行 (\n) を除く任意の 1 文字にマッチする
^行頭 (文字列先頭や改行直後) にマッチする。幅は 0
$行末 (文字列末尾や改行直前) にマッチする。幅は 0[]角かっこ内のどれか 1 文字にマッチする
[^]角かっこ内に含まれない 1 文字にマッチする
+直前の表現の 1 回以上の繰り返し (最長一致)
*直前の表現の 0 回以上の繰り返し (最長一致)
?直前の表現の 0 回または 1 回の繰り返し (最長一致)
||の前か後ろどちらかの表現にマッチする
()後方参照などのためのグループ化
\1, \2,..グループ化した文字列の後方参照
(13.2)Regexp クラスRuby では正規表現は Regexp クラスのオブジェ
クトである32。Regexp オブジェクトは正規表現をスラッシュで囲んで作成で
文字列とのマッチには、演算子=~を用いる。この演算子の否定は!~である。
演算の結果、照合する文字列の一部とマッチしたなら、文字列の何文字目か
らマッチしたかが返り、マッチしなかったならば nil が返る。複数の位置で
マッチする場合もありうるが、位置は最も左のものが返る。また、マッチし
た文字列は、ruby の組み込み変数$&に自動的に設定される。
Regexp オブジェクトの作成の例
1re = /bc/
2p re =~ "abcd abcd"
3p re =~ "b cb c"
32正規表現を扱える言語は多いが、正規表現がオブジェクトである言語はほとんどない。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 228
1nil��
(13.3)メタ文字「.」 (任意の 1 文字)メタ文字「.」は改行以外の任意の
1 文字にマッチする。
メタ文字「.」の例
1re = /b.d/
2p re =~ "abcd abcd"
4p re =~ "b cb d"
1"bcd"3"b d"��
文字「.」 (ピリオド) 自身にマッチさせたいときは、バックスラッシュを前
置して、\. と記述する。他のメタ文字でも同様にバックスラッシュを前置す
れば、その文字自身にマッチする。
単なる文字「.」の例
1re = /1\.3/
2p re =~ "123 1.3"
4"1.3"��
(13.4)メタ文字「^」と「$」 (行頭、行末)メタ文字「^」と「$」は、そ
れぞれ行頭と行末にマッチする。文字列が改行 (\n) を含めば、その直後は行
頭、直前は行末と見なされる。
メタ文字「^」と「$」の例
1re1 = /^123/
2p re1 =~ "0123"
3p re1 =~ "1234"
45re2 = /123$/
6p re2 =~ "0123"
7p re2 =~ "1234"
89re3 = /^123$/
10p re3 =~ "0123"
11p re3 =~ "1234"
12p re3 =~ "123"
nil#r e 1 の マ ッ チ
01#r e 2 の マ ッ チ
nilnil#r e 3 の マ ッ チ
nil0��
(13.5)メタ文字「[]」 (文字クラス指定)メタ文字「[]」は、角かっこ内
の 1 文字にマッチするが、[a-z] や [0-9] のように文字の範囲を指定するこ
ともできる。また、角かっこ内の先頭に「^」を書くと、角かっこ内以外の 1
文字にマッチする33。
メタ文字「[]」の例
33文字クラス指定の [] 内の文字「^」は、[] 内の先頭にあるかどうかに関わらず、行頭にマッチするメタ文字「^」の働きはない。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 229
1re1 = /201[0 -3]/
2p re1 =~ "2013 -2 -24"
3p re1 =~ "2014 -2 -24"
4re2 = /201[^0123]/
5p re2 =~ "2013 -2 -24"
6p re2 =~ "1999:201b"
0#r e 1 の マ ッ チ
nilnil #r e 2 の マ ッ チ
(13.6)例 (3 桁の整数にマッチする正規表現)3 桁の整数にマッチする正
規表現を作り、入力された文字列が整数を含んでいれば、それを表示するプ
ログラムを作成する。
3 桁の整数にマッチする正規表現の例
1re = /[1 -9][0 -9][0 -9]/
2if re =~ gets
3puts $&
「合計 103 万円」と入力した場合の入力と実行例��
合 計103 万 円103��
上の実行例では、1 行目はキーボードから入力した文字列であり、2 行目がプ
ログラムの出力である34。
34この方法だと、桁数が多くなると正規表現が長くなってしまうが、メタ文字「{}」(直前の表現の繰り返し回数の指定) を用いると、例えば 8 桁の整数にマッチする正規表現は/[1-9][0-9]{7}/と書ける。
(13.7)課題 25 – 学籍番号にマッチする正規表現2013 年度入学生の学籍
番号にマッチする正規表現を作り、キーボードから入力された文字列が 2013
年度入学生の学籍番号を含むならば OK、そうでないならば NG と出力する
プログラムを作成せよ。ただし、2013 年度入学生の学籍番号は、
b4⟨3 から始まる 4 桁の整数 ⟩⟨ アルファベット小文字が 2 文字 ⟩
の形をしているとし、日本人の名前としてはあり得ないアルファベットなど
も許すこととする。
「I am b43291bx」と入力した場合の入力と実行例��
I am b43291bxOK��
� 「b49299aw has a pen.」と入力した場合の入力と実行例�
b49299awhas a pen.
(13.8)メタ文字「+」、「*」、「?」(直前の表現の繰り返し)メタ文字「+」、
「*」、「?」は、直前の表現の、それぞれ、1 回以上、0 回以上、0 または 1 回
の繰り返しにマッチする。
メタ文字「+」、「*」、「?」の例
1re1 = /ab+/
2puts re1 =~ "abbac"
3puts re1 =~ "accab"
4re2 = /ab*/
5puts re2 =~ "abbac"
6puts re2 =~ "accab"
7re3 = /ab?/
8puts re3 =~ "abbac"
9puts re3 =~ "accab"
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 230
0#r e 1 の マ ッ チ(abbに マ ッ チ)
3#(abに マ ッ チ)
0#r e 2 の マ ッ チ(abbに マ ッ チ)
0#(aに マ ッ チ)
0#r e 3 の マ ッ チ(abに マ ッ チ)
0#(aに マ ッ チ)��
1 回以上という説明では、1 回なのか 2 回なのかあいまいであるが、できる限
り回数は多くするようにマッチする (最長一致)。例えば、上の出力の 1 番目
は 2 文字 (ab) ではなく、3 文字 (abb) にマッチする。しかし、マッチ位置は
繰り返し回数とは無関係に、最も左の位置になる。例えば、上の出力の 4 番
目では、位置 0 で 1 文字 (a) にマッチしているが、より長いマッチとなる位
置 3 で 2 文字 (ab) にマッチするわけではない。
これらの繰り返しを表すメタ文字は、他のメタ文字と組み合わせて使うこ
メタ文字「+」、「*」、「?」の他のメタ文字との組み合せの例
1re1 = /[a-z]+/
2puts re1 =~ "aw9981tz"
3re2 = /[a-z]+[0 -9]*:/
4puts re2 =~ "aw9981:"
5puts re2 =~ "9981 aw:"
0#r e 1 の マ ッ チ(awに マ ッ チ)
0#r e 2 の マ ッ チ(aw9981:に マ ッ チ)
4#(aw:に マ ッ チ)��
(13.9)メタ文字「|」 (選択)∗メタ文字「|」は、「表現 1|表現 2」と用い
ると、表現 1 か表現 2 のいずれかにマッチする。しかし優先順位が低いため、
グループ化 (()) とともに用いることが多い。
メタ文字「|」の例
1re1 = /ab|xy/
2puts re1 =~ "abxy"
3re2 = /a(b|xy)/
4puts re2 =~ "abxy"
5re3 = /(ab|x)y/
6puts re3 =~ "abxy"
0# abに マ ッ チ
0# abに マ ッ チ
2# xyに マ ッ チ��
(13.10)後方参照 ∗メタ文字「()」でグループ化された表現にマッチした
文字列は、1 番目のグループが「\1」、2 番目のグループが「\2」... で参照で
きる。表現ではなく、マッチした文字列を参照することに注意が必要である。
後方参照の例
1re1 = /(a)\1/
2puts re1 =~ "aaa"
3re2 = /([a-z])\1/
4puts re2 =~ "abba"
0# aaに マ ッ チ
1# bbに マ ッ チ��
(13.11)課題 26# – 小数にマッチする正規表現整数部分は 0 のみ、また
は先頭が 0 ではない整数であり、次に小数点がきて、その次に 1 桁以上の数
字が続くような小数にマッチする正規表現を作れ。つまり、例えば下のよう
な小数にマッチするような正規表現である。
12.310.010.120.00
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 231
それを用いて、キーボードから入力された文字列が該当する小数を含むなら
ば、その小数を表示するプログラムを作成し提出せよ。
「9m012.340w」と入力した場合の実行例��
9m012 .340w12.340��
「9m012.w34」と入力した場合の実行例��
9m012.w34( こ の 行 は 空 行)��
ただし、ともに、1 行目は人間がキーボードから入力したものである。
(13.12)課題 27# – 数にマッチする正規表現整数または小数にマッチす
るような正規表現を作れ。ただし、整数とは 0 かまたは先頭が 0 ではない 1
桁以上の整数であり、小数とは、(13.11) と同じ意味である。つまり、例えば
下のような数にマッチするような正規表現である。
0112312.310.010.120.00
それを用いて、キーボードから入力された文字列が該当する数を含むならば
それを表示するプログラムを作成し提出せよ。
「x9m012.w34」と入力した場合の実行例��
x9m012.w349��
「m012.34」と入力した場合の実行例��
m012 .340��
「m12.y34w」と入力した場合の実行例��
m12.y34w12��
「m12.340w」と入力した場合の実行例��
m12 .340w12.340��
ただし、いずれも、1 行目は人間がキーボードから入力したものである。
§14文字列操作
(14.1)文字列末尾の削除
ゲットエスgets で文字列を入力すると、末尾には改行文字
が付加されている。これを削除するには、末尾の改行文字を取り除いた新し
い文字列を返す、String#chomp メソッドを使えばよい35。
String#chomp の例
1s = gets
2t = s.chomp
3p s, t
bcg と入力したときの実行例��
"bcg\n""bcg"��
(14.2)進法変換文字列 (String のオブジェクト) を数値 (Integer などの
オブジェクト) に変換するには、to i メソッドを用いた。実は、to i は省略
可能な引数を 1 つとり、変換するときの進法を指定できる。この引数は、省
略すれば 10 となる。
String#to i(base) の例
1s = "12"
2puts s.to_i
3puts s.to_i (7)
35末尾に改行のない文字列に対して chomp を実行すると、その文字列の単なるコピーが返る。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 232
変換するときの進法を指定するのであって、得られた数値を
プットエスputs で表示する
ときは 10 進法となる。
反対に、数値 (Integer などのオブジェクト) を、文字列 (String のオブ
ジェクト) に変換するには、to s メソッドを用いた。実は、to s も省略可能
な引数を 1 つとり、変換するときの進法を指定できる。
Intger#to s(base) の例
1a = 12
2puts a.to_s
3puts a.to_s (7)
1215��
(14.3)フォーマットFloat クラスの数値 (浮動小数点数) の小数点以下が
必要以上に長く表示されてしまう、だとか、数値が 2 桁か 3 桁かわからない
けれど、3 桁右揃えで表示したいといったときは、String クラスのオブジェ
クトが利用できる演算子%を用いる。
String#%の文法
< 文 字 列 > % < 引 数 >#引 数 が1 つ の 場 合
< 文 字 列 > % [< 引 数1 > , < 引 数2 > , ..]#複 数 の 場 合
この演算をすると、小数点以下の桁数などの書式を指定した上で、引数を文
字列の中に埋め込み、その結果を演算の結果とする。下の例では、str の中
の%s というフォーマット文字列に、数値 a を文字列化したものが埋め込まれ
ている36。
1a = 1 / 3.0
2str = "埋め% s 込 め ま す " % a
3puts str
埋 め0.3333333333333333 込 め ま す��
(14.4)フォーマット文字列%s の他にもさまざまなフォーマット文字列が
フォーマット文字列の文法
%[ 引 数 指 定 $][ フ ラ グ][ 幅][. 精 度] 指 示 子
引数指定、フラグ、幅、精度、指示子のうち、指示子 (と先頭の%) が省略不
可能で、その他は省略可能である (つまり、%s というフォーマット文字列は、
必要最小限のもののみで構成されている)。これらを順に、主なもののみ解説
するが、引数指定は使用頻度が少ないので解説を省略する。
主な「フラグ」
+埋め込むものが正の数値の場合先頭に + を付加する
-幅指定がある場合、左詰めにする
0幅指定があり右詰めの場合、余った部分を 0 で埋める
以下の幅と精度において、記号の欄に ⟨ 数値 ⟩ と記してあるものは、先頭が 0
であってはならない。
36この例では 1 つの引数が数値だから問題はないが、もし 1 つの配列を埋め込みたいときは、単に配列を引数にしてしまうとうまくいかない。複数の引数を渡しているものと解釈されてしまうからである。この場合、その配列を [] でくるんで引数とするのが最も容易な解決策である。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 233
<数値>引数を埋め込むときの幅の指定
次の精度の指定は省略すると 6 とみなされる。
主な「精度」
.<数値>浮動小数点数の小数点以下の桁数
主な「指示子」
s文字列。String でないものは to s される
f浮動小数点数
(14.5)フォーマットの例いくつかの実例をあげる。
幅と詰めの指定の例
1str = "abc"
2puts "(%s)" % str出 力 は(abc)
3puts "|%6s|" % str出 力 は|abc|
4puts " <%2s>" % str出 力 は<abc >
5puts "!%-6s!" % str出 力 は!abc!
上のように幅が不足するとき、幅指定は無視される。また、上の例ではすべ
て括弧等でくるんでいるが、右寄せや左寄せがわかるようにしているだけで、
常に必要なわけではない。
1puts "あ%2 sい % dう %+-3 dえ " % [111,-2, 3]
あ111 い -2 う+3え��
上のように、フラグは複数指定可能である。
浮動小数点数の例
1a = 100 / 3.0
2puts "[%f]{%.2f}<%4f >(%6.1f)" % [a, a, a, a]
[33.333333]{33.33} <33.333333 >(33.3)��
上の 3 つ目では、幅 4 を指定しても、精度の指定がないため 6 とみなされ、
結果として幅が不足するので幅指定が無視されている。4 つ目では幅が不足
しないので、幅指定が有効になっている。
(14.6)課題 28 – 進法変換キーボードから数字の列を入力すると、それ
を 7 進法で表された数値とみなして 10 進法に変換し、下の例のように表示す
るプログラムを作成し提出せよ。ただし、7 進法で許されていない文字が入
力されたとき、つまり、0 から 6 以外の文字が存在したときは、「エラー」と
だけ表示すること。
164 と入力した時の実行例��
164164 (7 進 法)= 95 (10 進 法)��
174 と入力した時の実行例��
174エ ラ ー��
ただし、ともに、1 行目は人間がキーボードから入力したものである。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 234
(14.7)置換String#sub メソッド、String#gsub メソッドを使うと、正規
表現にマッチする部分を置換できる。sub は、文字列中の最初にマッチした
部分のみ置換し、gsub は、マッチした部分すべてを置換する37。
String#sub と String#gsub の文法
< 文 字 列 >. sub(< 正 規 表 現 > , < 置 換 文 字 列 >)< 文 字 列 >. gsub(< 正 規 表 現 > , < 置 換 文 字 列 >)
String#sub と String#gsub の例
1str = "Sep. 29, 1970"
2puts str.sub (/[789]/ , "X")
3puts str.gsub (/[789]/ , "X")
4puts str.sub (/[a-z]+/, "-")
Sep. 2X, 1970Sep. 2X, 1XX0S-. 29, 1970��
(14.8)分解String#split メソッドを使うと、正規表現にマッチする部分
で文字列を分解し、それらを配列が返る。
String#split の文法
< 文 字 列 >. split(< 正 規 表 現 >)
String#split の例
1str = "Sep. 29, 1970"
2a = str.split (/ /)
37例えば、7 とマッチしたら X、8 とマッチしたら Y、9 とマッチしたら Z に置換したいというように、マッチした結果を置換に反映させたい場合は、<文字列>.sub(<正規表現>) { ブロック } という構文が利用できる。ブロックの引数にマッチした文字列が設定されるので、それを利用して式を計算する。ブロックの返り値が置換文字列として扱われる。また、単に、String#trメソッドで処理できる場合もある。
4b = str.split (/[^a-zA -Z0 -9]/)
["Sep.", "29,", "1970"]["Sep", "", "29" , "", "1970"]��
正規表現を与える代わりに文字列を与えると、その文字列に一致する箇所
で分解される。正規表現を与える代わりに空白文字 1 文字" "を与えると、文
字列の先頭と末尾の空白を除去した上で、空白文字 (スペースやタブなど) の
連続で分解する。正規表現を与える代わりに空文字列""を与えると、文字列
を 1 文字ずつに分解する。
String#split の例
1str = "a bc"
2a = str.split("b")
4b = str.split(" ")
["a ", "c"]
["a", "b", "c"]��
(14.9)課題 29 – 置換と分解キーボードから英文 (単語、スペース、 カン
マ、ピリオドからなる列) を入力すると、すべてのピリオドを感嘆符「!」に
置換した英文を表示し、さらに、単語数を下の例のように表示するプログラ
ムを作成し提出せよ。
We see...という入力に対する実行例��
We see a full moon the night of a lunareclipse.
We see a full moon the night of a lunareclipse!
単 語 数11��
ただし、1 行目は人間がキーボードから入力したものである。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 235
(14.10)課題 30 – フォーマットキーボードから、いくつかの数値をスペー
ス区切りで入力すると、その平均を表示するプログラムを作成し提出せよ。た
だし、平均はフォーマットの機能を利用して小数点以下 3 桁までを表示する
1 23 45 67 8 89平 均 は38.833��
ただし、1 行目は人間がキーボードから入力したものである。
§15クラス #
(15.1)クラスコンピュータ言語におけるクラスとは、同じ種類のオブジェ
クトの集まりに名前を付けたものというような意味である38。あるクラスに
属するオブジェクトを、そのクラスのインスタンスと呼ぶ39。
主なクラスとそのインスタンスの例
クラス意味インスタンス
Integer整数1, -3, 1073741823
String文字列"a", "あいう"
Float浮動小数点数1.1, -3e+2
Array配列[1,2], ["a", 1.1, [1,2]]
Range範囲(1..10), ("a".."z")
Regexp正規表現/abc/, /[1-9]+[a-z]*/
クラスシステムの利点には、モジュール化 (再利用の容易さ)、カプセル化
(実装の隠蔽による保守の容易さ)、多態性 (同一の機能を同一の名前で実装で
きる) などがあり、Ruby のプログラムを作成する場合、意識せずともこれら
38class という英単語の和訳で言えば「類」が相当すると思われる。39そのクラスのオブジェクトと呼んでも意味は通じる。オブジェクトという語はどのクラスかあまり気にしておらず、インスタンスという語はどのクラスかを強調したいような印象を与える。
のクラスシステムの利点の恩恵を受けることになる40。例えば、どのクラス
のオブジェクトでも to s で文字列に変換できるだとか、
プットエスputs で表示できる
だとかは、多態性の利点である。
(15.2)クラスの作成Ruby では多くのオブジェクト指向言語と同様に、自
分でクラスを作成できる41。
簡単な例として、名前と生年月日をデータに持つような Person クラスを作
成してみる。クラス名はアルファベット大文字で開始しなくてはならない。
クラス定義の文法
class < ク ラ ス 名 >
< 処 理 >
クラスがあるとき、そのインスタンスは new メソッドで作成する42。
クラスのインスタンス作成の文法
< ク ラ ス 名 >. new(< 引 数 > , ..)
クラス定義の文法の<処理>の部分に関数定義のように書くと、そのクラス
のメソッドが定義される。initialize メソッドは特別であり、new メソッド
を呼んだときに実行される。
Person クラスの定義の例
1classPerson
2definitialize(person_name , person_birth)
3@name = person_name
4@birth = person_birth
40Ruby で「気軽に」プログラムを組む場合は、組み込みクラスを利用するだけでも、十分クラスシステムの利点を享受できる。クラスの作成 (後述) まで必要になるのは、ある程度の大きさを持つプログラムである41クラスシステムを備えた言語においては、大規模なプログラムの作成は、クラスを設計することと言ってもよい。42これは組み込みも含めてほとんどのクラスに共通である。例えば、a = Array.new は a =[] と等価であり、re = Regexp.new("b") は re = /b/ と等価である。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 236
67def to_s
8"% s さ ん は % s 生 ま れ " % [@name , @birth]
@が先頭についた変数はインスタンス変数と呼ばれ、インスタンスごとに (名
前や生年月日のように) 異なるが、1 つのインスタンスの各メソッドの間では
共通な変数である。また、to s メソッドを定義しておくと、
プットエスputs で表示す
るときに利用される。
Person クラスの利用の例
1man = Person.new("藤井猛", "1970/9/29")
2woman = Person.new("クルム伊達", "1970/9/28")
3puts man , woman
藤 井 猛 さ ん は1970/9/29 生 ま れク ル ム 伊 達 さ ん は1970/9/28 生 ま れ��
(15.3)オープンクラスRuby では、1 度定義し終わったクラスに定義を追
加することができる。この概念をオープンクラスと呼ぶ。これは組み込みク
ラスにもあてはまる43。
例えば、String クラスに、あいさつを表示するメソッドを追加してみる。
String#hi の例
1classString
2def hi
3puts "% s さ ん こ ん に ち は " % self
67a = "藤井猛"
43これにより、組み込みのクラスを破壊することも可能であり、Ruby の柔軟性を示している
藤 井 猛 さ ん こ ん に ち は��
self は、自分自身 (上の例では、文字列そのもの) を表す組み込みの値である。
(15.4)課題 31# – クラス縦と横の長さをインスタンス変数として持ち、
to s メソッドと面積を返す area メソッドを持つ長方形のクラスを定義せよ。
具体的には、次のように利用できるクラス Rect を定義せよ。
クラス Rect の利用例
1r = Rect.new (10 ,20)
2puts r
3puts r.area
縦10 横20 の 長 方 形200��
Rect クラスの定義と上の利用例 (数値 10 と 20 は任意でよい) を、1 つのファ
イルに順に記述して提出せよ。
§16連想配列 (Hash)#
(16.1)連想配列のリテラルと値へのアクセス配列では、要素のインデッ
クスが 0 から始まる連続した整数であった。連想配列は任意のオブジェクト
をインデックスに用いることのできるコンテナである。連想配列のインデッ
クスをキーと呼び、キーに対応する要素を値と呼ぶ44。
連想配列のリテラルの文法
{< キ ー1 > => <値1 > , < キ ー2 > => <値2 > , ..}
44連想配列からキーに対応する値を検索するときに、ハッシュ関数と呼ぶ関数を利用することが、クラス名の由来である。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 237
連想配列の値を得るには、下のように角かっこで囲んでキーを渡す。
連想配列の利用例
1h = {1 => "藤井", "森下" => "システム"}
2puts h[1], h["森下"]
藤 井シ ス テ ム��
(16.2)キーの存在の判定キーが連想配列に存在しないとき、その値を求
めると nil になる。これを利用してキーの存在を判定することもできる。値
が nil である可能性があれば、この方法では判定できないが、その場合は
Hash#has key? メソッドを用いるとよい。
キーの存在判定の例
1h = {"藤井" => "猛", "羽生" => "善治"}
2if h["伊達"] == nil
3puts "なし"
5if h.has_key ?("伊達")
6puts "あり"
(16.3)要素の上書きと追加連想配列 hash があるとき、hash[<キー>] に<
値>を代入すると、要素が上書きされる。また、そのキーが存在しなかったと
きは、新たな要素として追加される。
連想配列の要素の上書きと追加の例
1h = {"藤井" => "猛", "羽生" => "善治"}
2h["藤井"] = "システム"
3h["クルム伊達"] = "公子"
4puts h["藤井"], h["クルム伊達"]
猛公 子��
(16.4)連想配列の要素の反復操作連想配列に each メソッドを使用する
と、キーと値の 2 引数がブロックに渡る。
Hash#each の例
1h = {"藤井" => "猛", "羽生" => "善治"}
2h.each {|k, v|
3puts "%s %s" % [k, v]
羽 生善 治��
(16.5)課題 32# – 単語数のカウントキーボードから入力した文字列を英
文とみて、単語ごとの出現回数を表示するプログラムを作成し提出せよ。
We see a full moon the night of a lunareclipse.
lunar1
night1
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 238
eclipse1
see1��
ただし、1 行目は人間がキーボードから入力したものである。
§17数値計算
(17.1)自然対数の底 e の計算自然対数の底 e = 2.718281828 · · · を、
e = 1 + 1
1! + 1
2! + 1
3! + · · ·
を用いて Float (組み込みの浮動小数点数) の精度で計算してみる。
e の計算の例
1def fact(n) #n の 階 乗 を 返 す
2if n == 0
5n * fact(n-1)
89e = 0.0
10(0..20). each {|n|
11e = e + 1.0 / fact(n)
13puts e
2.7182818284590455��
上の例では 1/20! までを加えているが、級数をどこで打ち切るかで精度が違っ
上の例では、わかり易さを優先したため効率は悪い45。
45まず、階乗を求めるなら再帰よりは繰り返しの方が効率が良い。また、階乗を毎回 1 から nまで掛けているが、n の階乗を計算した次の繰り返しでは n + 1 の階乗を計算するわけだから、n! を変数に保存しておいて、それに n + 1 を掛けるだけで (n + 1)! を求めた方が効率が良い。
(17.2)BigDecimalFloat よりも精度が必要な場合は、いくつか方法が
考えられるが、Ruby の添付ライブラリの BigDecimal クラスを用いるのが簡
便である。BigDecimal は、任意の精度を持つ 10 進表現された浮動小数点数の
クラスである。ただ、初期状態では Ruby に読み込まれていないため、利用す
るにはプログラムの冒頭で require "bigdecimal" と記述して BigDecimal
クラスを読み込む必要がある。BigDecimal クラスの数を作成するには、専用
のリテラルがないので、
BigDecimal の数の作成の文法
a = BigDecimal("1.2")
のようにする。BigDecimal の精度を保って演算するには、
BigDecimal の演算の文法
b = a.mult(3, 100)c = a.div(7, 100)
のように、メソッド BigDecimal#mult や BigDecimal#div などを用いて、精
度も指定すればよい。BigDecimal クラスを用いて自然対数の底 e を計算して
BigDecimal を利用した e の計算例
1require "bigdecimal"
2zero = BigDecimal("0.0")
3one = BigDecimal("1.0")
45def fact(n) #n の 階 乗 を 返 す( 階 乗 は Integer で 十 分 )
6if n == 0
9n * fact(n-1)
1213e = zero
14(0..20). each {|n|
15e = e + one.div(fact(n), 100)
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 239
17puts e
0.27182818284590452353397844906664158861464034345402617207765517901788134377596413222879533900368485014923465960754714514 E1 #長 い の で 改 行 し た��
出力の最後の「E1」は、「×101」の意味である。また、ruby のバージョンな
どの環境によっては、表示結果が異なる。
(17.3)課題 33 円周率の計算円周率 π を、
π = 4(1
11 + · · ·)
を用いて計算し、表示するプログラムを作成し提出せよ。利用するのは Float
でも BigDecimal でも構わないが、小数第 4 位までは正確な値が求まるよう
(17.4)課題 34# 円周率の計算その 2円周率 π の、より効率のよい公式
π = 16 tan−1 1
5 − 4 tan−11239
ただし、tan−1 x = 1
1x − 1
3x3 + 1
5x5 − 1
7x7 + · · ·
を用いて、計算し表示するプログラムを作成し提出せよ。少くとも小数第 20
位までは正確な値になるようにせよ。
(17.5)ニュートン法数値計算の代表的な方法として、関数 f(x) の零点、
つまり、方程式 f(x) = 0 の解を求めるためのニュートン法がある。
関数 y = f(x) が零点を持ち、その零点の近くでは f(x) は微分可能で、導
関数 f ′(x) は 0 にならないとする。零点に十分近いと思われる x = x0 をとる
と、y = f(x) の x = x0 における接線の方程式は、
y − f(x0) = f ′(x0)(x − x0)
となり、この直線の x 切片を求めると、y = 0 とおくことより、
x = x0 − f(x0)
f ′(x0)(#)
となる。この x 切片は、f(x) の零点に近いと考えられる46。
つまり、上の (#) 式を用いて、x0 を x に取り替えることを反復すると、徐々
に真の零点に近付いていく。取り替えても変化しないならば、真の零点に到
達したと考えてよい。実際には誤差があるので、f(x0)/f ′(x0) が十分小さく
なったら、真の零点の近似値が得られたと考えてよい。√
2 は x2 − 2 の正の零点だから、ニュートン法で計算するプログラムは以
下のようになる。小数点以下 6 桁は正しく求まるように計算している。
ニュートン法による√
2 の計算例
1def f(x)
2x**2 - 2
45def df(x)
46一般的な関数ならば x0 よりも真の零点に近くなるが、そうならないこともある。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 240
9x = 2.0
10whiletrue
11dx = f(x) / df(x)
12if dx.abs < 0.00000001
13break
15x = x - dx
17puts x
1.4142135623746899��
環境により、多少結果が異なる可能性がある。
(17.6)課題 35 ニュートン法その 1ニュートン法を用いて、小数第 6 位ま
で正確に、3√
3 を求めよ。
1.4422495703074079��
(17.7)課題 36# ニュートン法その 2整数 n をキーボードからすると、
ニュートン法を用いて、√n を求め、表示するプログラムを作成し提出せよ。
31.7320508075688772��
ただし、1 行目は人間がキーボードから入力したものである。
(17.8)課題 37# ニュートン法その 3ニュートン法を用いて、3 次方程式
x3 − 3x + 1 = 0 の実数解をすべて求めよ。ニュートン法を 1 度実行するだけ
では、零点は 1 つしか求まらないので、x の初期値を変更して 3 度ニュート
ン法を実行すること。
0.8944271909999163.60555127546399-1.18321595661992��
ただし、上の例の値は適当です。
(17.9)台形公式 #台形公式とは、以下のように、定積分をいくつかの台
形の面積で近似する方法である。関数 y = f(x) が、閉区間 a ≤ x ≤ b で定積
分可能であるとする。この閉区間を n 等分し、グラフと x 軸の間の領域を n
個の台形で近似してその面積を求めることで、定積分∫ ba f(x) dx の近似値と
することができる。
台形の底辺の長さを d とすると、d = (b − a)/n であるから、定積分を図の
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 241
n 個の台形の面積の和で近似すると以下のようになる。∫ b
af(x) dx
≑ d(f(a) + f(a + d))
2+ d(f(a + d) + f(a + 2d))
2+ · · ·
+ d(f(a + (n − 1)d) + f(a + nd))
(f(a) + 2f(a + d) + 2f(a + 2d) + · · · + 2f(a + (n − 1)d) + f(b))
台形公式を用いて、単位円の面積のうち、第 1 象限にある部分の面積を求
めて、その 4 倍を表示してみる。
台形公式による π の計算例
1def f(x)
2(1-x**2)**0.5
45a = 0.0
6b = 1.0
7n = 1000
8d = (b-a) / n
10area = f(a) + f(b)
11for i in 1..(n-1)
12area = area + 2 * f(a+i*d)
14area = area * (d/2)
1516puts area * 4
3.141555466911023��
(17.10)課題 38# 台形公式台形公式を用いて、短軸半径 1、長軸半径 2 で
ある楕円
x = cos t
y = 2 sin t
の周の長さを求め、表示せよ。ただし、この楕円の第 1 象限にある部分の周
sin2 t + 4 cos2 t dt
で計算できる。三角関数は、Math.sin(x), Math.cos(x) を、円周率は、
Math::PI を用いよ。
9.688448220547674��
ただし、積分区間をいくつに分割するかで、出力は異なる。
§18アルゴリズム
(18.1)アルゴリズム計算機に何かの処理をさせるときの、処理の手順の
ことをアルゴリズムと呼ぶ。
2 つの正整数の最大公約数を求めるには、(10.6) や (10.7) のときのように、
約数を列挙して、共通なもののうち最大のものを求めるアルゴリズムもあれ
ば、(11.6) のユークリッドの互除法もある。紀元前からあるユークリッドの
互除法は、現在でも最速のアルゴリズムである。
また、方程式の解の近似値を求めるニュートン法も、効率の良いアルゴリ
ズムである。
(18.2)単純な探索数値の配列に、特定の数 x が属するかどうかを調べる
とき、基本的には先頭の要素から順に x と一致するかどうか調べるしか手段
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 242
はない。ただし、Ruby の配列では、include? というメソッドで、配列に属
するかどうかを調べられるから、このコードはアルゴリズムの練習のためで
1def search(x, ary) #x が a r y に 属 す る な ら t r u e を 返 す
2for a in ary
3if x == a
4returntrue
7false
10ary = [3, 1, 4, 1, 5, 9, 2, 6, 5]
11x = gets.to_i
12putssearch(x, ary)
実行例その 1��
6true��
実行例その 2��
7false��
ただし、ともに 1 行目は人間がキーボードから入力したものである。
(18.3)二分探索配列が整列済みならば、探索範囲を半分ずつに絞ってい
く、二分探索と呼ばれるアルゴリズムがある。配列に属するかどうか調べた
い x を先頭ではなく、まず中央の要素 y と比較して、x の方が小さければ、配
列の前半半分を調べればよいし、大きければ後半半分を調べればよい、とい
う原理のアルゴリズムである。
二分探索による探索
1defbsearch(x, ary) #x が a r y に 属 す る な ら t r u e を 返 す
2if ary.size == 0
3returnfalse
5center = ary.size / 2
6y = ary[center]
7if x == y
9elsif x < y
10bsearch(x, ary [0... center ])
11else
12bsearch(x, ary[center +1.. -1])
1516ary = [3, 1, 4, 1, 5, 9, 2, 6, 5]. sort
17x = gets.to_i
18putsbsearch(x, ary)
実行例は単純な探索と同じである。また、0...center は 0...center-1 と
同じ意味である。配列の要素数が小さいうちは、単純な探索と二分探索の実
行速度に大差はないが、要素数が巨大になれば決定的な差が開く47。
(18.4)計算量単純な探索と二分探索を比べると、二分探索の方が高速な
アルゴリズムと言えるが、その速さを定式化したものが計算量である。計算
量といっても、実行時間、実行される命令数、消費されるメモリ量など、何
をカウントするかで種類があるが、ここでは、大小比較の回数に基いた計算
量を考える。
単純な探索では、配列の長さが n ならば、探索が成功する場合は最悪 n 回
の大小比較がなされる。二分探索では、配列の長さが n = 2m ならば、長さ
が m 回半分になれば要素が 1 つになるので、最悪 m + 1 = log2 n + 1 回の大
47実行速度のことを考えるならば、掲げたコード例はまだ効率が悪い。特に半分の長さの配列を作成している所と、再帰をしている所が効率が悪い (再帰は、繰り返しと比べて一般にはメモリ効率が悪い)。配列を作成する代わりにどの範囲を探索中かを変数で管理すれば、配列を作成する必要はなくなる。また、再帰はこの場合は繰り返しに書き換えることができる。Ruby ではサポートされていないが、このコードのような再帰 (末尾再帰) を、内部で自動的に繰り返しに変換して実行する言語もある。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 243
小比較がなされる。n が大きくなったときに無視できる項や、比例定数を無視
して、それぞれ、(最悪) 計算量が O(n), O(log n) であると言う。
アルゴリズム単純な探索二分探索
最悪計算量O(n)O(log n)
(18.5)整列アルゴリズムRuby の配列の sort メソッドに相当する、配列
の整列のアルゴリズムを考える。主なアルゴリズムとしては、バブルソート、
選択ソート、挿入ソート、シェルソート、マージソート、ヒープソート、ク
イックソートなどがある。これらの (最悪) 計算量は以下の通りである。
アルゴリズムバブル選択挿入シェル
最悪計算量O(n2)O(n2)O(n2)O(n(log n)2)
マージヒープクイック
O(n log n)O(n log n)O(n2)
以下では、これらの一部を扱う。
(18.6)バブルソート長さ n の配列 a があるとする。バブルソートのアル
ゴリズムは以下の通りである。バブルソートは効率の悪いソートの代名詞で
第 1 段(1) a[0] と a[1] を比較して、前者が大きければ両者を交換する。
(2) a[1] と a[2] を比較して、前者が大きければ両者を交換する。(3) これを、a[n-2] と a[n-1] の比較・交換まで行う。
第 2 段 再び、a[0] と a[1] の比較・交換をし、今度は、a[n-3] と a[n-2] の
比較・交換まで行う。
第 3 段以降 これを、比較・交換の回数を 1 ずつ減じつつ、n − 1 段まで繰り
第 1 段が終了すると、最後の要素が最大値になっている。同じ理屈で、第 2
段が終了すると、最後から 2 番目の要素が、大きい方から 2 番目の要素にな
る。これを n − 1 段まで実行すると整列が完了する。下の図ははバブルソー
トの過程の例である。
⃝5 ⃝3 2 8 9 1 7 隣接要素で大小が逆転しているものを交換していく
3 ⃝5 ⃝2 8 9 1 7
3 2 5 8 ⃝9 ⃝1 73 2 5 8 1 ⃝9 ⃝7
⃝3 ⃝2 5 8 1 7 9 最大値が末尾に来た。再び先頭から比較・交換する
2 3 5 ⃝8 ⃝1 7 9
2 3 5 1 ⃝8 ⃝7 9
2 3 ⃝5 ⃝1 7 8 9 2 番目に大きい値が末尾から 2 番目に来た。以下同様
2 ⃝3 ⃝1 5 7 8 9
⃝2 ⃝1 3 5 7 8 9
1 2 3 5 7 8 9
バブルソート
1defbubblesort(ary)
2(ary.size -2). downto (1) {| tail|
3for i in (0.. tail)
4if ary[i] > ary[i+1]
5ary[i], ary[i+1] = ary[i+1], ary[i]
1112ary = [5, 3, 2, 8, 9, 1, 7]
13p bubblesort(ary)
[1, 2, 3, 5, 7, 8, 9]��
上のコードにおいて、
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 244
downto
x.downto(y) {|i|ブ ロ ッ ク}
は、カウンタ変数 i が x から y まで 1 ずつ減りながら、ブロックを繰り返す
命令である。つまり、逆順の for や each に相当する。
x, y = a, b
は、x と y に、それぞれ、a と b を代入する命令である。
(18.7)選択ソート長さ n の配列 a があるとする。選択ソートのアルゴリ
ズムは以下の通りである。
(1) 最小値を探し、a[0] と交換する。
(2) a[1] 以降の要素の最小値を探し、a[1] と交換する。
(3) これを最後まで反復する。
下の図は選択ソートの過程の例である。
53289⃝17最小値 ⃝1 を先頭と交換
13⃝28957a[1] 以降の最小値 ⃝2 を a[1] と交換
12⃝38957a[2] 以降の最小値 ⃝3 を a[2] と交換
12389⃝57以下同様
123598⃝7
12357⃝89
1235789
1defselectionsort(ary)
2for i in (0.. ary.size -2)
3min = ary[i]
4min_pos = i
5for j in (i+1.. ary.size -1)
6if min > ary[j]
7min = ary[j]
8min_pos = j
11ary[i], ary[min_pos] = ary[min_pos], ary[i]
1516ary = [5, 3, 2, 8, 9, 1, 7]
17p selectionsort (ary)
(18.8)課題 39# 選択ソート上のプログラムでは、最小値を求めるのに
Array#min メソッドを用いていない。Array#min メソッドを用いて書き直し
たプログラムを作成し提出せよ。また、最小値の位置も知る必要があるが、そ
れには Array#index メソッドを用いよ。
[1, 2, 3, 5, 7, 8, 9]��
(18.9)挿入ソート長さ n の配列 a があるとする。挿入ソートのアルゴリ
ズムは以下の通りである。
(1) a[0] と a[1] を比較し整列する。
(2) a[0..i] が整列されたとして、a[i+1] を、a[0..i] の適切な位置に挿入
し、a[0..i+1] を整列済みにする。
(3) これを最後まで反復する。
下の図は挿入ソートの過程の例である。丸数字を、それより左にある整列
済みの列に挿入することを反復する。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 245
5⃝32891735⃝28917
235⃝8917
2358⃝917
23589⃝17
123589⃝7
1235789
(18.10)課題 40# 挿入ソート挿入ソートをする関数 insertionsort を作
成し、それを用いて適当な配列 ([5, 3, 2, 8, 9, 1, 7] など) を整列して
表示するプログラムを作成し提出せよ。
[1, 2, 3, 5, 7, 8, 9]��
(18.11)マージソート長さ n の配列 a があるとする。マージソートのアル
ゴリズムは再帰的であり、以下の通りである。
(1) 配列を前半と後半に分割する。(2) それぞれをマージソートする。(3) それらを、合併する。
下の図はマージソートの過程の例である。
まず分割をする
5328917
5328917
5328917
5328917
マージを始める
5238917
2351789
1235789
マージソート
1defmergesort(ary)
2len = ary.size
3if len<= 1
4return ary
6ary1 = mergesort(ary [0... len /2])
7ary2 = mergesort(ary[len /2.. -1])
8ary3 = []
9loop {
10if ary1.size == 0
11return(ary3 + ary2)
12elsifary2.size == 0
13return(ary3 + ary1)
14elsifary1 [0]<= ary2 [0]
15ary3.push(ary1.shift)
16else
17ary3.push(ary2.shift)
2122ary = [5, 3, 2, 8, 9, 1, 7]
23p mergesort(ary)
(18.12)クイックソートクイックソートは最悪計算量は他のソートアルゴ
リズムに劣るが、平均的には最も良い性能を持つとされる。長さ n の配列 a
があるとする。クイックソートのアルゴリズムは再帰的であり、以下の通り
(1) 配列を、先頭の要素 a[0] と、a[0] 未満の要素たちと、a[0] 以上の要素
たちに 3 分割する。
(2) 「未満」と「以上」をクイックソートする。
(3) 整列した「未満」、a[0]、整列した「以上」の順に並べる。
下の図はクイックソートの過程の例である。丸数字が上の手順の a[0] に
相当し、その左右に四角く囲んだ部分が、「未満」と「以上」に相当する。ま
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 246
た、以降の再帰における整列に影響のない箇所は、下矢印で示した。
5328917
321⃝5897
21⃝3↓7⃝89
1⃝2↓↓↓↓↓
1235789
クイックソート
1defquicksort(ary)
2if ary.size<= 1
3return ary
5x = ary [0]
6ary1 = ary [1.. -1]. select {|a| a < x }
7ary2 = ary [1.. -1]. select {|a| a >= x }
8quicksort(ary1) + [x] + quicksort(ary2)
1011ary = [5, 3, 2, 8, 9, 1, 7]
12p quicksort(ary)
(18.13)課題 41# クイックソート上のプログラムでは、a[0] 未満・以上
の要素からなる配列 ary1, ary2 を作成するのに、Array#select メソッドを
用いた。これを用いずに書き直したプログラムを作成し提出せよ。
[1, 1, 2, 3, 4, 5, 5, 6, 9]��
(18.14)各アルゴリズムの速度比較これまでに紹介した 4 つのアルゴリズ
ムによる整列関数で、1 万要素のランダムな浮動小数点数からなる配列を整
列するのにかかった時間は、手元の環境では以下の通りである。参考のため、
Array#sort メソッドに要した時間も記す。
アルゴリズムバブル選択マージクイックsort
時間 (秒)18.696.050.070.050.01
§19より進んだ課題
これまでに学んだことを踏まえて、進んだ課題を与える。この節の課題は
シャープ 2 個 (##) 付きである。これまでのシャープ 1 個の「義務ではない
課題」とは異なり、成績への算入方法も別である。
(19.1)課題 42## 分数の和最大公約数が 1 である、1 以上 99 以下の整数
a, b, c (a ≤ b) に対して、
1a + 1
を満たすものをすべて下のように表示するプログラムを作成し提出せよ。た
だし、表示の順序は下の例と同じ順序でなくても構わない。
1/2 + 1/2 = 1/11/3 + 1/6 = 1/21/4 + 1/12 = 1/31/5 + 1/20 = 1/41/6 + 1/30 = 1/51/7 + 1/42 = 1/61/8 + 1/56 = 1/71/9 + 1/72 = 1/81/10 + 1/15 = 1/61/10 + 1/90 = 1/91/14 + 1/35 = 1/101/18 + 1/63 = 1/141/21 + 1/28 = 1/121/22 + 1/99 = 1/181/24 + 1/40 = 1/151/30 + 1/70 = 1/211/33 + 1/88 = 1/24
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 247
1/36 + 1/45 = 1/201/44 + 1/77 = 1/281/55 + 1/66 = 1/301/60 + 1/84 = 1/351/78 + 1/91 = 1/42��
(19.2)課題 43## チャンパーノウン定数「0.」に続けて、正整数を小さ
い順に書いて連結した数
0.123456789101112131415161718192021222324252627282930 · · ·
をチャンパーノウン定数と呼ぶ。この小数部分を 1 桁ずつ取り出した数列
1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, . . .
を {cn} と表す。キーボードから数値 n を入力すると、cn を表示する プログ
ラムを作成し提出せよ。
実行例その 1��
実行例その 2��
11114��
(19.3)課題 44## 日曜日の回数キーボードから 1900 以上の西暦を入力
すると、その年の日曜日の回数を表示するプログラムを作成し提出せよ。た
だし、1900 年 1 月 1 日は月曜日であることを用い、西暦が次の条件を満たす
ときを閏年とせよ (グレゴリオ暦)、
西暦が 4 の倍数の年を閏年とする。ただし、そのうち、100 の倍数
の年は平年とする。ただし、さらに、そのうち、400 の倍数の年は
閏年とする。
実行例その 1��
197152��
実行例その 2��
200053��
ただし、ともに 1 行目は人間がキーボードから入力したものである。
(19.4)課題 45## 友愛数友愛数とは、異なる 2 つの正整数の組であり、
自分自身を除いた約数の和が、互いに他方と等しくなるような数を言う。例
えば 220 と 284 は友愛数である。なぜなら、220 の自分自身以外の約数の和
は、1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284 であり、284 の
自分自身以外の約数の和は、1 + 2 + 4 + 71 + 142 = 220 だからである。
4 桁の整数 2 つからなる友愛数の組をすべて求め、表示するプログラムを
作成し提出せよ。
1184 12102620 29245020 5564:( 後 略)��
(19.5)課題 46## 辞書式順序キーボードから、異なるアルファベットか
らなる単語を入力すると、その単語のアルファベットを並べ換えてできるす
べての単語を辞書式順序で並べたとき、元の単語は何番目に現れるかを表示
するプログラムを作成し提出せよ。
bca4��
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 248
ただし、1 行目は人間がキーボードから入力したものである。(b, c, a を並べ
換えてできる単語を辞書式順序に並べると
abc, acb, bac, bca, cab, cba
であり、bca はそのうち 4 番目であるから、4 と表示されている。
(19.6)課題 47## フィボナッチ数列キーボードから正整数 a を入力する
と、フィボナッチ数列の項であって、a 以上になる最初のものを表示するプロ
グラムを作成し提出せよ。
実行例その 1��
1013��
実行例その 2��
1000010946��
ただし、ともに 1 行目は人間がキーボードから入力したものである。
(19.7)課題 48## 循環節キーボードから正整数 a を入力すると、分数 1/a
を小数で表示したとき、有限小数になるならば「有限小数」と表示し、循環
小数になるならばその循環節の長さを表示するプログラムを作成し提出せよ。
実行例その 1��
250有 限 小 数��
実行例その 2��
ただし、ともに 1 行目は人間がキーボードから入力したものである。
(19.8)課題 49## 硬貨の和キーボードから正整数 a を入力すると、a を
1, 5, 10 の和で表す方法を、すべて下のように表示するプログラムを作成し提
出せよ。ただし、表示の順序はこの通りでなくてもよい。
実行例その 1��
1210x0 + 5x0 + 1x1210x0 + 5x1 + 1x710x0 + 5x2 + 1x210x1 + 5x0 + 1x2��
実行例その 2��
3010x0 + 5x0 + 1x3010x0 + 5x1 + 1x2510x0 + 5x2 + 1x2010x0 + 5x3 + 1x1510x0 + 5x4 + 1x1010x0 + 5x5 + 1x510x0 + 5x6 + 1x010x1 + 5x0 + 1x2010x1 + 5x1 + 1x1510x1 + 5x2 + 1x1010x1 + 5x3 + 1x510x1 + 5x4 + 1x010x2 + 5x0 + 1x1010x2 + 5x1 + 1x510x2 + 5x2 + 1x010x3 + 5x0 + 1x0��
ただし、ともに 1 行目は人間がキーボードから入力したものである。
(19.9)課題 50## シーザー暗号a を b に、b を c に、そして z を a に置
き換えるというような字の置き換えによる暗号をシーザー暗号と呼ぶ。アル
ファベットからなる単語をキーボードから入力すると、アルファベットを 4 つ
後ろへずらして (z を越えた場合は a へ循環させて) 暗号化した単語を表示す
るプログラムを作成し提出せよ。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 249
xylophonebcpstlsri��
ただし、1 行目は人間がキーボードから入力したものである。
(19.10)課題 51## ベズーの方程式互いに素な 0 ではない 2 つの整数 a,
b をキーボードから入力すると、ベズーの方程式
ax + by = 1(x, y は整数)
の解 (x, y) を 1 つ表示するプログラムを作成し提出せよ。
8125(x,y) = (21,-68)��
ただし、1, 2 行目は人間がキーボードから入力したものである。
(19.11)課題 52## 連分数有理数 a/b は、例えば次のように連分数で表す
ことができる。
11831 = 3 +1
この右辺を [3, 1, 4, 6] と書くことにする。
キーボードから 2 つの正整数 a, b を入力すると、有理数 a/b を連分数で表
示した結果を下のように表示するプログラムを作成し提出せよ。
実行例その 1��
8125[3, 4, 6]��
実行例その 2��
11831[3, 1, 4, 6]��
ただし、ともに、1, 2 行目は人間がキーボードから入力したものである。
(19.12)課題 53## 分割数正整数 n を、いくつかの正整数の和で表す場
合の数を分割数と呼ぶ。例えば、7 は、
7 = 6 + 1 = 5 + 2 = 5 + 1 + 1 = 4 + 3 = 4 + 2 + 1 = 4 + 1 + 1 + 1
= 3 + 3 + 1 = 3 + 2 + 2 = 3 + 2 + 1 + 1 = 3 + 1 + 1 + 1 + 1
= 2 + 2 + 2 + 1 = 2 + 2 + 1 + 1 + 1 = 2 + 1 + 1 + 1 + 1 + 1
= 1 + 1 + 1 + 1 + 1 + 1 + 1
と 15 通りに表せるので、7 の分割数は 15 である。
キーボードから正整数を入力すると、その分割数を表示するプログラムを
作成し提出せよ。
実行例その 1��
実行例その 2��
100190569292��
ただし、ともに、1 行目は人間がキーボードから入力したものである。
§20雑多な例
これまでに学んだことを踏まえて、いろいろなプログラム例を示す。文法
についての詳しい解説は Ruby のウェブサイトのドキュメントを参照のこと。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 250
(20.1)じゃんけんゲームコンピュータがランダムに選んだ手と、人がキー
ボードから入力した手でじゃんけんをし、勝ち負けを表示する。
じゃんけんゲーム
1print "グー(0)チ ョ キ(1)パ ー(2):"
2hand1 = gets.to_i
34hand2 = rand (3)
5s = ["グー", "チョキ", "パー"]
6puts "わたしは%s" % s[hand2]
78if hand1 == hand2
9puts "引き分け"
10elsif [hand1 , hand2] == [0, 1] ||
11[hand1 , hand2] == [1, 2] ||
12[hand1 , hand2] == [2, 0]
13puts "あなたの勝ち"
14else
15puts "あなたの負け"
rand(n) は、0 以上 n 未満の整数をランダムに返す関数である。コンピュータ
の手を表示する 6 行目では、0 ならばグー、1 ならばチョキ、2 ならばパーと
if 文を連ねる代わりに、配列の要素の 0, 1, 2 番目を表示するようにしている。
グ ー(0)チ ョ キ(1)パ ー(2):1
わ た し は グ ーあ な た の 負 け��
(20.2)魔方陣3 × 3 の魔方陣48をしらみつぶしに見付けてみる。下の図の
a, b, c が決定すれば、他の位置は自動的に決まることも利用する。
481 から 9 までの整数を 1 つずつ 3 × 3 に並べ、各行、各列、2 つの対角線の和がすべて等しいようにしたもの。
3x3 魔方陣の例
1nums1 = (1..9). to_a
2(1..9). each {|a|
3(1..9). each {|b|
4(1..9). each {|c|
5u = 15 - a - b
6v = 15 - a - c
7w = 15 - u - v
8x = 15 - c - u
9y = 15 - a - x
10z = 15 - b - c
11nums = [a, b, u, y, c, w, x, z, v]
12if nums.sort == nums1 &&
13y + c + w == 15 &&
14x + z + v == 15
15puts "%s %s %s\n%s %s %s\n%s %s %s"%nums
16puts "-"*5
上のコードでは、a,b,c で 3 重のループを回して、u から z までを計算により
求めている。12 行目からの if 文では、1 から 9 までが 1 回ずつ出現している
かと、和が 15 になることが未確認の 2 列を確認している49。
実行例の一部��
2 7 69 5 14 3 8
49サイズが小さい魔方陣なのでこのコードでも速度は十分早いが、効率の面ではいくつもの改善点がある。b のループでは、a と b が等しいときは解ではないことが直ちにわかるし、c についても同様である。また、1 から 9 までを 1 度ずつ使用しているかのチェックも、ソートという負担の重い処理をするのではなく、より効率のよい方法を検討する必要がある。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 251
-----2 9 47 5 36 1 8-----:中 略:-----8 3 41 5 96 7 2-----��
(20.3)ヒットアンドブロー各桁の数字が異なる 4 桁の数を決め、それを
当てるヒットアンドブローというゲームがある。入力する度に、答えと位置
も合っている数字 (ヒットと呼ぶ) の個数と、位置は合っていないが答えと同
じ数字 (ブローと呼ぶ) の個数を表示し、それを手掛りに 4 桁の数を当てる。
ヒットアンドブロー
1def digits(num)
2[num /1000 , (num /100)%10 , (num /10)%10 , num %10]
45defprint_hit_blow(a, b)
6as = digits(a)
7bs = digits(b)
8hit = 0
9(0..3). each {|i|
10if as[i] == bs[i]
11hit = hit + 1
14same = (as & bs). size
15puts "ヒット:%sブ ロ ー:% s" % [hit , same -hit]
1718answer = 0
19whiledigits(answer ). uniq.size != 4
20answer = rand (10000)
2223(1..999). each {|n|
24print "入力%3s:" % n
25input = gets.to_i
26if digits(input ). uniq.size != 4
27puts "各桁は異なる数字で"
28else
29print_hit_blow (answer , input)
30if answer == input
31break
3536puts "正解"
関数 digits は、各桁の数を要素に持つ配列を返す関数である。関数
print hit blow では、ヒットとブローの数を表示する。8 から 13 行目でヒッ
トの数を調べている。14 行目では、4 桁の数の配列 as と bs の共通部分の要
素数を求めて、ブローの数を求めているが、このままだとヒットの数も数え
てしまうので、15 行目でブローを表示するときは、ヒットの数を差し引いて
いる。18 行目から 21 行目では答を生成している。各桁の数が異なるものが
得られるまでループしている。23 行目からがメインの処理で、999 回という
十分多い回数のループにして、30 行目で正解だと判定されると 31 行目でそ
のループを脱出している。
入 力1:1234
ヒ ッ ト:1ブ ロ ー:1
入 力2:1425
ヒ ッ ト:1ブ ロ ー:1
入 力3:1674
ヒ ッ ト:0ブ ロ ー:1
入 力4:8935
ヒ ッ ト:2ブ ロ ー:0
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 252
入 力5:4035
ヒ ッ ト:2ブ ロ ー:1
入 力6:0135
ヒ ッ ト:4ブ ロ ー:0
(20.4)n クイーン8 × 8 のチェス盤に、8 個のクイーンを互いの効きに入
らないように置くのが 8 クイーンと呼ばれる問題である。n クイーンとはサ
イズを n × n にした問題である。下のプログラムでは 1 行目の N = 5 を書き
換えると n を変更できる。
N クイーン
1N = 5
2def check(xs)
3diag1 = (0...N).map {|i| xs[i] - i }
4diag2 = (0...N).map {|i| xs[i] + i }
5if diag1.uniq.size == N &&
6diag2.uniq.size == N
7print_board xs
1011defprint_board(xs)
12(0...N). each {|i|
13print "."*xs[i], "Q", "."*(N-xs[i]-1), "\n"
15puts
1718(0...N). to_a.permutation(N) {|xs|
19check(xs)
18 行目からがメインであり、Array#permutation(n) は、要素数 n の順列を
すべて生成し、ブロックに引数として渡すメソッドである。そうして得られ
るサイズ N の順列 xs は、0 から N-1 までの整数を 1 つずつ含む配列である。
これは、チェス盤を 0 行目から N-1 行目まであるとしたとき、i 行目の xs[i]
列目にクイーンがあることを意味する配列である50。あとは、斜め方向の効
きに入らないことのチェックが必要だが、それは 2 行目から定義されている関
数 check でチェックしている。具体的には、クイーンを通過する傾き 1 の直
線を引きその y 切片を考えたとき、すべての y 切片が異なっていなくてはな
らず、傾き −1 の直線を考えても同様であることをチェックしている。11 行
目からの関数 print board は、盤を表示する。
5 クイーンの実行例��
Q......Q......Q.Q......Q.
Q.......Q..Q.......Q..Q..
....Q..Q..Q.......Q..Q...��
魔方陣のときのように、重複があろうとしらみつぶしに調べることも可能だ
が、Array#permutation メソッドを利用して、調べる場合を大幅に減らして
いるのがポイントである。
(20.5)TEX ソースの自動出力Ruby で TEX のソースを出力させて、例え
ば問題を自動で生成することもできる。ここでは、ランダムに掛け算の九九
50クイーンが互いの効きに入らないため、各行各列にクイーンが 1 つしかないことに注意する。
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 253
の問題を 10 問作成してみる。
TeX ソースの自動出力の例
1puts "\\ documentclass{jarticle}"
2puts "\\ begin{document}"
3puts "\\ begin{enumerate}"
4(1..10). each {|i|
5a = rand (9) + 1
6b = rand (9) + 1
7puts "\\ item [(%s)]$%s \\ times %s =$" % [i,a,b]
9puts "\\end{enumerate}"
10puts "\\end{document}"
文字列中のバックスラッシュは、「"\n"」のように特別な意味を持つので、そ
の意味をなくし単なるバックスラッシュにするため、バックスラッシュを 2 度
重ねている。
\documentclass{jarticle}\begin{document}\begin{enumerate}\item [(1)] $3 \times 2 =$\item [(2)] $6 \times 4 =$\item [(3)] $1 \times 3 =$\item [(4)] $9 \times 6 =$\item [(5)] $9 \times 4 =$\item [(6)] $5 \times 7 =$\item [(7)] $2 \times 2 =$\item [(8)] $2 \times 4 =$\item [(9)] $3 \times 3 =$\item [(10)] $6 \times 9 =$\end{enumerate}\end{document}��
この出力を TEX ファイルにコピーアンドペーストしたり、リダイレクト51し
たり、Ruby のファイルへの出力の機能を用いてファイルに出力すればよい。
51出力先をコマンドプロンプトのウィンドウではなく、指定したファイルにするコマンドプロンプトのシェルの機能。
Symbols
!=. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
!~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3, 27
!. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
$& . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
$ (正規表現). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27, 28
% (文字列のフォーマット). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8, 32
& (配列の共通部分) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
() (正規表現) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
**. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
* (正規表現). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27, 29
* (配列の反復) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
* (文字列の反復) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8+=. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ (正規表現). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27, 29
+ (配列の連結) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
+ (文字列の連結). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7, 8
-=. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
- (配列の差集合) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
. (正規表現). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27, 28
/. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
<=. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
<. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
< (配列を辞書順で比較) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
< (文字列を辞書順で比較) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
==. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
== (配列の等値) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
== (文字列の等値) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
=~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3, 27
=. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
>=. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
? (正規表現). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27, 29
[]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
[] (正規表現). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27, 28
[] (部分配列) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
[] (部分文字列) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9[^] (正規表現) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27, 28
\1 (正規表現). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27, 30
\2 (正規表現). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27, 30
\n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
^ (正規表現). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27, 28
abs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
ceil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
chomp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10, 31
class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Complex. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
delete_at . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
div . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 255
each . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3, 24, 37
else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
elsif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Enumerable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6false . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4, 10
FalseClass. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4, 6
File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
find . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Float. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6, 7
floor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
for. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3, 14
gets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
gsub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
hash_key? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Hash. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6, 37
hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
if. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
include? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
index (配列) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
initialize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6, 7
IO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Math.cos(x). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Math.sin(x). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41Math::PI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
max (配列) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
min (配列) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
mult . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
new . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35nil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4, 9, 10
NilClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4, 6
p. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
pop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
push . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
puts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Range. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3, 6
Rational . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Regexp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
return. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
reverse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
reverse (配列). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
round . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
select. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
size (配列) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
sort_by. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
sort (配列) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
split . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
sub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
to_a (Range) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
to_i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7, 8, 31to_s. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7, 32
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 256
to_s (配列) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
true . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
TrueClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
uniq (配列) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12unshift. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13
while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
BigDecimal クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Enumerable モジュール. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
FalseClass. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Float クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3, 38
Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Integer クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
NilClass. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Range クラス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
Regexp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27
String クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
TrueClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
アルゴリズム. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
一重引用符. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2, 8
インスタンス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
インスタンス変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
引用符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2, 8
演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
オープンクラス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36
オブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
改行文字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
返り値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
型エラー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
カプセル化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
仮引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
関数呼び出し. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
偽 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4, 10
クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3, 6, 35
計算量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
継承関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
互除法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
コメント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
コンテナクラス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
(2021-05-28 11:47:01) 2021 年度前期コンピュータ 257
再帰 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
サブクラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
式展開 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
実引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
真 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4, 10
スーパークラス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
スコープ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
正規表現 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
ソート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
素数判定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
台形公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
多態性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
二重引用符. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2, 8
ニュートン法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
配列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
破壊的メソッド. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
パターン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
バックスラッシュ記法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
ハノイの塔 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
フォーマット文字列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
部分配列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
部分文字列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
ブロック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
マッチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
右揃え . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
無名関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
メソッド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
メタ文字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
モジュール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
モジュール化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17, 35
文字列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2, 8
戻り値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
約数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
ユークリッドの互除法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22, 41