1/19 学習記録 (ボーリングスコア計算プログラム)

🔶 ボウリングスコア計算プログラム


///昨日まで/// 考え方 それぞれのフレームのスコアを
[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

これはrubybashで実行した時のパス。 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だったのに。 これで良さそうなので提出!