teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

移動

2020/11/26 23:00

投稿

asm
asm

スコア15149

answer CHANGED
@@ -25,4 +25,47 @@
25
25
  values_b = hb.values_at(*keys)
26
26
  keys.zip(values_a, values_b) do |key, a, b|
27
27
  ...
28
- ```
28
+ ```
29
+
30
+ ----
31
+
32
+ 「上から判定する」という事に注意して
33
+ if a && a.between?(1,18) && b == 10
34
+ などとする必要があります。
35
+ が、無駄に長くなるのでsafe navigation operatorを用いて
36
+
37
+ ```erb
38
+ <span>
39
+ <% if a.nil? && b.nil? %>Finish
40
+ <% elsif a.nil? && b&.between?(11,18) %>アウトスタートで、インプレイ中 <%= b - 1 %>
41
+ <% elsif a.nil? && b == 10 %>アウトスタートで、アウト終了 <%= a %>
42
+ <% elsif a == 1 && b.nil? %>インスタートで、イン終了 <%= a - 1 %>
43
+ <% elsif a == 1 && b&.between?(11,18) %>インスタートで、インプレイ中 <%= b - 1 %>
44
+ <% elsif a&.between?(2,9) && b == 10 %>アウトスタートで、アウトプレイ中 <%= a - 1 %>
45
+ <% elsif a&.between?(1,9) && b.nil? %>インスタートで、アウトプレイ中 <%= a - 1 %>
46
+ <% else %>なんか変なスコアのいれ方です
47
+ <% end %></span><br>
48
+ ```
49
+ などとするとよいでしょう。
50
+
51
+ ただし、これは見やすいのはいいのですが何度か同じ判定をしているのが非効率で気になりますね。
52
+
53
+ ---
54
+
55
+ パターンマッチを用いた場合は
56
+
57
+ ```erb
58
+ <span>
59
+ <% case [a, b]
60
+ <% in [nil,nil] %>Finish
61
+ <% in [nil, 10] %>アウトスタートで、アウト終了 <%= a %>
62
+ <% in [1, nil] %>インスタートで、イン終了 <%= a - 1 %>
63
+ <% in [nil, 11..18 => hole] %>アウトスタートで、インプレイ中 <%= hole - 1 %>
64
+ <% in [1, 11..18 => hole] %>インスタートで、インプレイ中 <%= hole - 1 %>
65
+ <% in [2..9 => hole, 10] %>アウトスタートで、アウトプレイ中 <%= hole - 1 %>
66
+ <% in [1..9 => hole, nil] %>インスタートで、アウトプレイ中 <%= hole - 1 %>
67
+ <% else %>なんか変なスコアのいれ方です
68
+ <% end %></span><br>
69
+ ```
70
+
71
+ 等も可能ですが、2.7時点ですと警告が出るなど常用は難しいです。