このコードに追加の機能を持たせたいです。
もしokが偶数回連続したらok2と出力するイメージです。
NOが偶数回連続したらNO2と出力するイメージです。
loop do if A-B>100 puts"ok" else A-B<-100 puts"no" end end
例:ロジックイメージ
〇⇒ OK
○○ ⇒ OK→OK2
○○○ ⇒ OK→OK2→OK
○○○○ ⇒ OK→OK2→OK→OK2
×○○ ⇒ NO→OK→OK2
○×○ ⇒ OK→NO→OK
× ⇒ NO
×× ⇒ NO→NO2
例:表示イメージ
〇⇒ OK
○○ ⇒ OK2
○○○ ⇒ OK
○○○○ ⇒ OK2
×○○ ⇒ OK2
○×○ ⇒ OK
× ⇒ NO
×× ⇒ NO2
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/10 04:27
2017/08/10 04:28
2017/08/10 04:31
2017/08/10 04:56
2017/08/10 05:16
回答5件
0
ベストアンサー
新たに示された仕様にそった出力をするようにしてみました。
xxx.rb
ruby
1 2def check(a, b) 3 diff = a - b 4 if diff > 100 5 'ok' 6 elsif diff < -100 7 'no' 8 end 9end 10 11def mark(ans, prev) 12 return nil if ans.nil? 13 if ans == prev 14 ans + '2' 15 else 16 ans 17 end 18end 19 20data = [ 21 [200, 0], # O -> ok 22 [200, 0], # O -> ok2 23 [200, 0], # O -> ok 24 [200, 0], # O -> ok2 25 26 [0, 200], # X -> no 27 [200, 0], # O -> ok 28 [200, 0], # O -> ok2 29 30 [200, 0], # O -> ok 31 [0, 200], # X -> no 32 [200, 0], # O -> ok 33] 34 35prev = nil 36data.each do |data| 37 ans = check(data[0], data[1]) 38 str = mark(ans, prev) 39 puts(str) if str 40 prev = (prev == ans) ? nil : ans 41end 42
実行結果
$ ruby xxx.rb ok ok2 ok ok2 no ok ok2 ok no ok
投稿2017/08/10 23:15
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
現在の状態(OK
など)は、現在と前回の値(○
など)から以下の通り求まります。
前回値 | 現在値 | 状態(と操作) |
---|---|---|
○ | ○ | OK2(前回値を消去) |
○以外 | ○ | OK |
× | × | NO2(前回値を消去) |
×以外 | × | NO |
また、表示イメージは最後の状態を出力すればよいでしょう。
上記をPython
コードにすれば以下のようになります。
Python
1l = ['○','○○','○○○','○○○○','×○○','○×○','×','××','×○×'] 2for s in l: 3 print(s + '(',end = '') 4 ret, prev = '','' 5 for c in s: 6 if c == '×': 7 if prev == '×': 8 ret = 'NO2' 9 c = '' # 前回値を消去 10 else: 11 ret = 'NO' 12 13 else: # ○ 14 if prev == '○': 15 ret = 'OK2' 16 c = '' # 前回値を消去 17 else: 18 ret = 'OK' 19 print(ret,end='->') 20 prev = c 21 print(')->' + ret)
結果
○(OK->)->OK ○○(OK->OK2->)->OK2 ○○○(OK->OK2->OK->)->OK ○○○○(OK->OK2->OK->OK2->)->OK2 ×○○(NO->OK->OK2->)->OK2 ○×○(OK->NO->OK->)->OK ×(NO->)->NO ××(NO->NO2->)->NO2 ×○×(NO->OK->NO->)->NO
投稿2017/08/10 05:08
編集2017/08/10 05:39総合スコア38233
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/10 05:18
2017/08/10 05:20
2017/08/10 05:35
2017/08/10 05:41
0
3週目以降をどうするかなど曖昧な点がありますが、ok が2回連続したときは ok2 となるようにしてみました。
xxx.rb
ruby
1data1 = [200, 300, -200, -300, 200, 200, -200] 2data2 = [0, 0, 0, 0, 200, 0, 0] 3 4prev = nil 5data1.size.times do |count| 6 diff = data1[count] - data2[count] 7 ans = nil 8 if diff > 100 9 ans = 'ok' 10 elsif diff < -100 11 ans = 'no' 12 end 13 14 unless ans.nil? 15 if prev == ans 16 puts ans + '2' 17 else 18 puts ans 19 end 20 end 21 22 prev = ans 23end
実行例
$ ruby xxx.rb ok ok2 no no2 ok no
投稿2017/08/09 22:18
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/10 02:33 編集
2017/08/10 02:42
0
無限ループ処理があるので ユーザから入力を受け付ける方式で書いてみました
前回の状態を保持する...たとえばキャッシュ機能があれば、現在の状態と前回の状態とを比べての処理が可能になるでしょう
以下例示コードを記します
ruby
1# 関数を定義 2# 入力値を、扱いやすいシンボル形式に変換 3def input_answer 4 # ユーザからの入力を受け付け 5 # 文字列に変換(eg. ok -> OK) 6 answer = gets.chomp.to_s.upcase 7 8 # 文字列をもとにシンボルを返却(例外的入力はnil を返す) 9 case answer 10 when 'OK', 'GOOD' 11 :OK 12 when 'NO', 'NG' 13 :NO 14 when 'EXIT', 'QUIT' 15 :BREAK 16 else 17 puts 'Note: Please input only a words of OK, Good, NG or NO.' 18 nil 19 end 20end 21 22# ユーザからの入力を受け付け、同じ入力が2連続以上した場合に"OK" と出力 23# ほかは"NO" と出力 24def loop_input 25 answer_cache = [] # 空の配列を代入 26 27 puts 'Note: Type EXIT to quit.' 28 29 loop do 30 answer = input_answer # 関数呼び出し。返却値の代入 31 32 # 例外的処理(後置if を使用) 33 next if answer.nil? # 想定外の入力の場合にこれより先の処理をせずにループを回す 34 break answer_cache if answer.eql?(:BREAK) # answer_cache を返却しつつループを脱出 35 36 # ユーザからの入力を answer_cache にプッシュする 37 answer_cache << answer 38 39 # answer_cache の後ろから2つをそれぞれの変数に代入 40 # (`*` はそれ以外を代入。使わない) 41 *, last_answer, current_answer = answer_cache 42 43 # 最後の入力と現在の入力が一致しているか 44 if last_answer.eql?(current_answer) 45 puts '-> OK' 46 else 47 puts '-> NO' 48 end 49 end 50end 51 52# これまでに入力を受け付けた値を出力 53def print_answer_cache(answer_cache) 54 puts 'Answer Cache (' 55 # 配列(answer_cache)の各要素に対して処理を実行 56 answer_cache.each { |answer| puts " #{answer}" } # 先頭にスペース2つを含めて入力値を出力 57 puts ')' 58end 59 60# ループ処理の開始と終了時の受付入力結果の出力 61print_answer_cache(loop_input)
何か参考になれば幸いです
Links
投稿2017/08/09 18:03
編集2017/08/09 18:10総合スコア2321
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/10 02:42
2017/08/10 04:57
0
okやnoの数を数えるカウンタをそれぞれ作って、その値によって表示を変えれば良いです。
#追記
仕様が曖昧なので、あくまでサンプルですが、
Ruby
1cntOK=0 2cntNO=0 3loop do 4 if A-B>100 5 cntOK+=1 6 puts"ok#{cntOK}" 7 elsif A-B<-100 8 cntNO+=1 9 puts"no#{cntNO}" 10 end 11end
投稿2017/08/09 13:22
編集2017/08/10 06:17総合スコア84423
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/09 14:49
2017/08/10 02:43
2017/08/10 03:20
2017/08/10 04:30
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。