質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

5回答

1164閲覧

Ruby ロジックについて

aisu001223

総合スコア26

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2017/08/09 13:18

編集2017/08/10 05:21

このコードに追加の機能を持たせたいです。
もし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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/08/10 03:27

偶数回連続したらok2と出力するということですか?
LouiS0616

2017/08/10 04:28

そのように質問を編集してください。
aisu001223

2017/08/10 04:31

○ ⇒ OK ○○ ⇒ OK→OK2 ○○○ ⇒ OK→OK2→OK ○○○○ ⇒ OK→OK2→OK→OK2 ×○○ ⇒ NO→OK→OK2 ○×○ ⇒ OK→NO→OK こんなイメージです
can110

2017/08/10 04:56

×⇒?の表示イメージはどうなりますか?
guest

回答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

katoy

総合スコア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
can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aisu001223

2017/08/10 05:18

ありがとうございます。Rubyで書いていただけるとありがたいです。
can110

2017/08/10 05:20

肝となる処理は if と for文しか使っていないのでRubyに書き直すのは難しくないと思います。 自力で頑張って書いてみましょう。
aisu001223

2017/08/10 05:35

前回値を消去とはどうゆう意味ですか?
can110

2017/08/10 05:41

動作としてはそのままの意味です。前回値(prev)を消去します。 意図としては、回答に示した状態図のとおりに状態を判定させるために消去します。
guest

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

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aisu001223

2017/08/10 02:33 編集

三週目は一週目と同じ動きにしたいです。また4週目は二週目と同じ動きにしたいです。それらをループする形にしたいです。
aisu001223

2017/08/10 02:42

説明不足で済みません。もし二回連続okだったらok2ですが三週目もokだったらはok3ではなくてokと表示したいイメージです。それらをループしたい形です。宜しくお願い致します。
guest

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
gouf

総合スコア2321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aisu001223

2017/08/10 02:42

説明不足で済みません。もし二回連続okだったらok2ですが三週目もokだったらはok3ではなくてokと表示したいイメージです。それらをループしたい形です。宜しくお願い致します。
gouf

2017/08/10 04:57

質問の評価を下げる理由の1つに「丸投げ良くない」があるので: 「各回答を受けて、それを参考に自分でも書いてみたけどココがわからない(質問の編集やコメント)」といった応答があるといいですね
guest

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
otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aisu001223

2017/08/09 14:49

プログラミング初心者なのでコードをいただけるとありがたいです
aisu001223

2017/08/10 02:43

説明不足で済みません。もし二回連続okだったらok2ですが三週目もokだったらはok3ではなくてokと表示したいイメージです。それらをループしたい形です。宜しくお願い致します。
otn

2017/08/10 03:20

○ ⇒ OK ○○ ⇒ OK2 ○○○ ⇒ OK ○○○○ ⇒ ?? ×○○ ⇒ ?? ○×○ ⇒ ?? などなど、不明点多数で、コードになりません。
aisu001223

2017/08/10 04:30

○ ⇒ OK ○○ ⇒ OK→OK2 ○○○ ⇒ OK→OK2→OK ○○○○ ⇒ OK→OK2→OK→OK2 ×○○ ⇒ NO→OK→OK2 ○×○ ⇒ OK→NO→OK こんなイメージです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問