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

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

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

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

Q&A

解決済

2回答

1610閲覧

出目が0~3のサイコロを振って、0~3までが全部出た時の、振った回数の合計をカウントするプログラムを作りたいです

kintarock777

総合スコア34

Ruby

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

0グッド

0クリップ

投稿2017/09/15 13:37

ru###発生している問題・エラーメッセージ

ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]

c:\Ruby23-x64\ruby>ruby count.rb
count.rb:2: syntax error, unexpected ',', expecting keyword_do_cond or ';' or '\n'
until no0 == true, no1 == true, no2 == true, no3 == true
^
count.rb:2: syntax error, unexpected ',', expecting end-of-input
until no0 == true, no1 == true, no2 == true, no3 == true

###試したこと

count = 0
until no0 == true, no1 == true, no2 == true, no3 == true
deme = Random.rand(4)
if
deme = 0
no0 == true
count += 1
elsif
deme = 1
no1 == true
count += 1
elsif
deme = 2
no2 == true
count += 1
else
no3 = true
count += 1
end
end
p count

このようなコードを書きました
no0~no3すべての値がtrueになった時に繰り返しが止まって、カウント数が表示できるようにしたいです。
よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答2

0

すでに ベストアンサーが決まっていますが、別の書き方をしてみました。

y.rb

ruby

1N = 4 2 3nums = [] 4nums << Random.rand(N) while nums.uniq.size != N 5 6p nums.size 7p nums

出た目の履歴を nums にすべて記録しています。
nums.uniq は重複をなくした結果になります。
重複をなくしたときのサイズが 4 ならすべての目が一度は出たことになります。

すべての目がでたら、サイコロを振った回数と、出た目の履歴を出力しています。

実行例イメージ説明

投稿2017/09/15 22:46

katoy

総合スコア22324

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

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

kintarock777

2017/09/15 23:38

回答ありがとうございます。 早速試してみました。 実行した後の、表示形式がとてもカッコイイですねぇ(Cool !)テンションあがります(喜) 配列の使い方の参考にもなりました、ホントに勉強になります。 nums << Random.rand(N) while nums.uniq.size != N     ただまだ知識不足で、この主要部分の構造が理解出来ていません。 とりあえず、丸暗記で覚えようと思いますが、 補足可能でしたら、もう少し教えてください。
kintarock777

2017/09/15 23:43

追記 特にuniqは、初めて見るメソッド???なので、よくわかりません よろしくお願いします
katoy

2017/09/16 00:24

nums << Random.rand(N) while nums.uniq.size != N は、次と同じです。 while nums.uniq.size != N do nums << Random.rand(N) end 参考: https://techracho.bpsinc.jp/hachi8833/2017_01_10/32333#2-26 > whileやuntilの本文が単文の場合は後置にするのが望ましい nums << xxx これは、 配列の最後に xxx を 追加するというものです。 参考: https://docs.ruby-lang.org/ja/latest/class/Array.html#I_--3C--3C uniq uniq は配列から重複した要素を取り除いた新しい配列を返します 参考: https://docs.ruby-lang.org/ja/latest/class/Array.html#I_UNIQ
guest

0

ベストアンサー

基礎が出来ていないので、もうちょっと簡単な5行程度のプログラムから始めた方が良いと思います。
元の物を活かして正しくすると、

Ruby

1no0 = no1 = no2 = no3 = false 2count = 0 3until no0 and no1 and no2 and no3 4 deme = Random.rand(4) 5 if deme == 0 6 no0 = true 7 count += 1 8 elsif deme == 1 9 no1 = true 10 count += 1 11 elsif deme == 2 12 no2 = true 13 count += 1 14 else 15 no3 = true 16 count += 1 17 end 18end 19p count

なお、普通はこう書きます。

Ruby

1N=4 2num = Array.new(N) 3count = 0 4until num.all? 5 deme = Random.rand(N) 6 num[deme] = true 7 count += 1 8end 9p count

投稿2017/09/15 14:28

otn

総合スコア84505

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

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

kintarock777

2017/09/15 15:06

otnさん回答いただき、ありがとうございました。 まだprogramingの勉強を始めたばかりで、入門書を片手に四苦八苦しています。 乱数の説明のところにきて、試したいprogramを思い付き自力で試してみたのですがダメでした。 私の書いたコードを訂正いただいた後、より簡潔なコードまで教えていただき、大変勉強になり、 また今後、programingを続けて行くうえで大変勇気付られています。 これからも、よろしくお願いいたします。
kintarock777

2017/09/15 15:07

早速、写経してコードの書き方を、おぼえます
otn

2017/09/15 15:39

> 乱数の説明のところにきて、試したいprogramを思い付き自力で試してみたのですがダメでした。 なるほど。そういう事で書いたプログラムなら良いと思います。 まずは = と == の使い方を覚えましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問