🔶 ボウリングスコア計算プログラム
///昨日まで///
考え方
それぞれのフレームのスコアを
[1投目+2投目,ストライク/スペアの際の追加点,ストライクの際の追加点]
で考えて、10フレーム分合算する。
入力はカンマ区切りの文字列、出力は数値(integer/string)
0. shellの文字列入力(optparse)
1. 文字列を10フレームの配列に変換(Xは10に変換)
2. (スペア)フレームの合計 == 10 の場合次要素の0番目の数値を取得し合計
3. (ストライク)一投目が10の場合は次要素の合計を取得
調べる必要があるメソッド:配列の要素を合計するメソッド
注意点:1フレーム目が0番目の要素
0. shellの文字列入力(optparse)
1. 文字列を10フレームの配列に変換(Xは10に変換)
str = "123456" array = str.split("34") p array =>["12", "56"]
これでカンマ区切りで要素に分ける
///今日はここから///
調べる必要のあるもの
- 配列の要素の指定の仕方と取り出し方(超入門 p.196)
配列の要素の取得 配列名[順番]
配列の作成配列名=[要素,要素,,,,]
配列の繰り返し処理 配列名.each do
これで配列から要素を取り出せる。 計算する際には整数に変換
indexメソッド 配列あるいは数値の中で所定の数値の最初に位置を出力
= "ROMACECARVSEMSEEXEGSE" p s.index("CE")
これは最初の文字列を置換した方が良さそうだ。
オプション無しのシェル引数入力
puts ARGV[0]
Argument Vector配列の1番目という意味。 だけ。。。
文字列の置換
- subは最初の一文字、gsubは全部の文字を置換。subはindexメソッドみたいだな。
string = "ruby ruby ruby" puts string.gsub(/ruby/, 'python')
ということは、、、
6,3,9,0,0,3,8,2,7,3,10,9,1,8,0,10,6,4,5
できた!置換したい文字列は""でも’’でも行けるようです。 これで数値は全部変換できているはず。 gsubは破壊的ではないので変数に代入。
フレームごとの配列を作る
- と思ったら、10の回はフレームに1投しかないから、2投目を入れる置換に変更 あれ、でも2投目に10が出たら?
- 配列の最初の2投を取得し,その2投をshift
- ただし1つ目が10の場合は、1つめを取得し,2つめは0,1つ目をshift まずは文字列を配列に変換。
throw1=scores_array[0,1]
かな。
throw1=scores_array[0],scores_array[1]
だった。それから先頭2要素削除、shiftは先頭のみなのでslice!を使う。
#要素序列から要素数 a = ["a", "b", "c", "d", "e"] a.slice!(1, 3) print a # ["a", "e"] #要素序列から要素序列 a = ["a", "b", "c", "d", "e"] a.slice!(1..3) print a # ["a", "e"]
自分の場合は(0..1)あるいは(0,2)。
!
入れないと反映してくれないのね。
ではこの調子で、10投目まで。最後に1投残るwww
繰り返し
苦手なやつ,,,n=1 から初めて、、、while n<11か
irbよろしく。って言うかその前に超入門!
配列を順番に名前をつけながら生成するのってどうやるの。。。
名前に連番をつける => give up
eval変数? obj.instance_variable_set(name, val)? 手入力します。
配列の調整
一投目が10の場合は["10",0]になるように 投球数が変わるだけなのに、これが長い。。。ダメ回答だと思う。 でも先に進む。
2. (スペア)フレームの合計
10 の場合次要素の0番目の数値を取得し合計 今度は数値の計算だけど、n投目がストライクの時、n+1投目の、、、という指定ができなかった。。と言うことは配列の中でやるのいいのかな。 そうなると、配列を分けずに、の中で配列を調整していくのが正解だったと言うことか、、、
それは後でやるとして。(多分作ったif式が後で役にたつ) とりあえず、配列を合体させる。
???後でn番目の配列のn番目としておいたほうがいいから、配列に配列を入れたほうが使いやすいかも。
今まで作った配列の中に配列を入れてみる。
(オブジェクト名)=オブジェクト,オブジェクト,,,
自分の得意技とかでできそう。。。好みというか。
これを整数に直しておく。
出てきた整数がおかしい、、、変数の名前を入れ間違えていた。
気を取り直してもう一度計算
n投目
if (n投目の要素0) == 10
10 +(n+1投目の要素0)+(n+1投目の要素1)"
elsif (n投目の要素0)+(n投目の要素1) == 10
(n投目の要素0)+(n投目の要素1) +(n+1投目の要素0)
else (n投目の要素0)+(n投目の要素)
- 二次元配列
`ary = Array.new(3, Array.new(3, "a") ) ary[0][0] = 1 p ary #=> [[1, "a", "a"], [1, "a", "a"], [1, "a", "a"]] ary = Array.new(3).map{Array.new(3,0)} ary[0][0] = 1 p ary #=> [[1, "a", "a"], ["a", "a", "a"], ["a", "a", "a"]]`
これでいける
ここでほうぼうで出てくるmap
をおさらい。
eachに似ているが、eachは一つずつ処理をするだけ。
array = [1, 2, 3] array.each do |item| p item * 2 end 2 4 6 #array = [1, 2, 3]は変わらず
array = [1, 2, 3] result = array.map do |item| item * 2 end array = [1, 2, 3] result = array.map do |item| item * 2 end p array #=> [1, 2, 3] p result #=> [2, 4, 6]
超入門もう一度読み直す必要あり。
ガチャガチャやって、ようやくできたー。 ひたすら場合分けでした!
RUBYのバージョン切り替え
$ which ruby /usr/bin/ruby
これはrubyがbashで実行した時のパス。 rbenvのrubyではなくmacデフォルトのrubyを実行していることがわかる。
$ echo $PATH
現在通っているパスの名称
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin
rbenvはこの前にshimsが入っていてほしい
~/.rbenv/shims:/usr/local/bin:/usr/bin:/bin
rubocopでチェック
- 以下のコマンドを実行すると、設定ファイル(.rubocop.yml)を作成してくれ、かつ検出された規約違反を読み飛ばすための設定を(.rubocop_todo.yml)に記載してくれます。
$ rubocop --auto-gen-config
<ソース>
生成されたファイルにrubyプログラムの場合(非rails) rubocop-fjordをインストールした上で.rubocop.ymlに下記の設定を追加する。
inherit_gem: rubocop-fjord: - "config/rubocop.yml"
改めて実行すると、
1 file inspected, no offenses detected
ノーマルrubocopだと152offencesだったのに。 これで良さそうなので提出!