前提・実現したいこと
Rubyでワードビンゴを作成しています。
Sを入力させるとSxSマスが出力されて、次にNを入力させると
N個の文字を表示させて、それが先ほどのSxSマスでビンゴであった場合Yes.Noで判定するものです。
SxSマスにある文字とN個の文字が一致していれば印も出さないといけないです。
例えば、S=3の場合、カードマスは
test1 test2 test3
test4 test5 test6
test7 test8 test9
と出力し、
次に、マスを開ける回数をNとしN個カードマスを出力します。
例、N=5
test1
test5
test8
test9
test6
ビンゴがあれば、「Yes」、なかったら、「No」と表示させるプログラムを作成したいです。
発生している問題
S = gets.to_i nums=S*S #1 ~ S x S row=Array.new(S).map{Array.new(S,0)} #横 col=Array.new(S).map{Array.new(S,0)} #縦
初学者でそもそもアルゴリズムが思いつきません。
どういうコードを書けばいいのかすらわからない状態です。
https://teratail.com/questions/298325を
見ても理解できなかったです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/13 06:37
2020/11/13 06:37
2020/11/13 06:39
2020/11/13 06:44
2020/11/13 06:47
2020/11/13 06:54
2020/11/13 07:20 編集
2020/11/13 07:20
2020/11/13 07:23
2020/11/13 07:24
2020/11/13 07:26
2020/11/13 07:57
回答7件
0
まず、あなたがすべきは入力と出力を明確にする事かと思います。
この問題文からはハッキリしないのですが
おそらく例示された入力は
3 test1 test2 test3 test4 test5 test6 test7 test8 test9 5 test1 test5 test8 test9 test6
でしょうか
次に、前半の
3 test1 test2 test3 test4 test5 test6 test7 test8 test9
から
ruby
1S = 3 2ビンゴカード = [ 3 ["test1", "test2", "test3"], 4 ["test4", ...] 5 ... 6]
というデータを作成します。
やり方としては、gets
で一行(test1 test2 test3
)入力させ、String#splitにて分割するのが楽かと思います。
そして、後半の入力に対してビンゴカードから検索して
- 当該箇所を
nil
に置換する - 判定用のビンゴカードを別に用意してそちらに記入する
どちらか好きな方法をとるとよいでしょう。
最後にビンゴ判定を行います。
縦(S)・横(S)・斜め(2)の計S+S+2
のパターンに対して判定を行い
結果を出力します
投稿2020/11/13 22:58
編集2020/11/14 06:00総合スコア15149
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/13 23:47
2020/11/14 00:07
2020/11/14 00:16
2020/11/14 00:43 編集
2020/11/14 00:44
2020/11/14 00:49
2020/11/14 01:09
2020/11/14 01:25
2020/11/14 01:38
2020/11/14 02:16
2020/11/14 02:25
2020/11/14 03:18
2020/11/15 12:11
2020/11/15 12:18
2020/11/15 12:21
0
ベストアンサー
画面(標準入力)から単語を入力した場合のword_arrとword_nを作成するスクリプトです。
単語を毎回入力するのは大変なので、以下のようにすると楽に試験ができるようになります。
まず、入力するデータを予め作成し、それをテキストファイルとして保存します。(data.txtとします)
スクリプトがsample.rbとすると、コマンドプロンプトで
ruby sample.rb < data.txt
と入力すると、標準入力から、data.txtに書かれている内容を打ち込んだのと同じ結果になります。
Ruby
1S = gets.to_i 2word_arr = Array.new 3(0..S-1).each do |i| 4 arr = gets.chomp.split(nil) 5 word_arr << arr 6end 7N = gets.to_i 8word_n = Array.new 9(0..N-1).each do |i| 10 word_n << gets.chomp 11end 12 13pp word_arr 14pp word_n 15
以下実行結果です。(スクリプトはgoo1.rb)
D:\goo\ruby>ruby goo1.rb < data.txt
[["apple1", "egg1", "word1", "http1"],
["apple2", "egg2", "word2", "http2"],
["apple3", "egg3", "word3", "http3"],
["apple4", "egg4", "word4", "http4"]]
["apple1", "apple2", "apple3", "apple4", "egg1", "word1", "http1"]
data.txtの内容
D:\goo\ruby>type data.txt
4
apple1 egg1 word1 http1
apple2 egg2 word2 http2
apple3 egg3 word3 http3
apple4 egg4 word4 http4
7
apple1
apple2
apple3
apple4
egg1
word1
http1
投稿2020/11/15 23:31
総合スコア5493
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/15 23:47
2020/11/15 23:51
2020/11/15 23:57
2020/11/15 23:59
2020/11/16 00:05
2020/11/16 00:55 編集
2020/11/16 00:08
2020/11/16 00:15
2020/11/16 00:56 編集
2020/11/16 01:02
2020/11/16 01:09
2020/11/16 01:24 編集
0
当たりのところに☆をつけるバージョンです。
横ビンゴの判定のみです。ほかは、付け加えてください。
かなり、書き換えました。これを使って下さい。
ruby
1#配列の印字 2def print_array(arr_name,arr) 3 printf("Array=%s\n",arr_name) 4 (0..S-1).each do |i| 5 (0..S-1).each do |j| 6 printf("%s ",arr[i][j]) 7 end 8 printf("\n") 9 end 10end 11#文字の検索 12def find_position(arr,val) 13 (0..S-1).each do |i| 14 (0..S-1).each do |j| 15 if arr[i][j] == val 16 return i,j 17 end 18 end 19 end 20 return nil,nil 21end 22#横のビンゴ判定 23def bingo_row(hantei,i0,j0) 24 (0..S-1).each do |j| 25 #1つでも頭に星がついていないならNO 26 if hantei[i0][j][0] != "☆" 27 return false 28 end 29 end 30 #全て頭に星がついている場合、YES 31 return true 32end 33 34S = gets.to_i 35word_arr = Array.new(S) 36data = [*'a'..'z', *'0'..'9'] 37(0..S-1).each do |i| 38 ar = Array.new(S){data.sample(4).join} 39 word_arr[i] = ar 40end 41print_array("word_arr",word_arr) 42 43N = gets.to_i 44word_arr_flat = word_arr.flatten 45word_n = word_arr_flat.sample(N) 46 47word_n.each do |word| 48 printf("%s ",word) 49end 50printf("\n") 51 52hantei = Marshal.load(Marshal.dump(word_arr)) 53print_array("hantei",hantei) 54ctr = 0 55word_n.each do |val| 56 i,j = find_position(word_arr,val) 57 if i == nil 58 printf("バグのため終了\n") 59 exit 10 60 end 61 hantei[i][j] = "☆" + hantei[i][j] 62 # 以下4つのビンゴ判定(4つのメソッドをつくったほうがよいかと思います) 63 ret = bingo_row(hantei,i,j) 64 if ret == true 65 printf("横 ビンゴ\n") 66 ctr += 1 67 break 68 end 69end 70if ctr == 0 71 printf("ビンゴなし\n") 72end 73print_array("hantei",hantei) 74 75
投稿2020/11/14 13:30
編集2020/11/14 14:24総合スコア5493
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/14 13:41
2020/11/14 22:25 編集
2020/11/14 22:40
2020/11/14 22:43 編集
2020/11/14 22:49
2020/11/14 22:56
2020/11/14 23:04
2020/11/14 23:15
2020/11/14 23:17 編集
2020/11/14 23:20
2020/11/14 23:22
2020/11/14 23:28 編集
2020/11/14 23:25
2020/11/14 23:27
2020/11/14 23:29
2020/11/14 23:38
2020/11/14 23:44
2020/11/14 23:47
2020/11/14 23:48
2020/11/14 23:49
2020/11/15 00:43
2020/11/15 04:24
2020/11/15 04:29
2020/11/15 04:54
2020/11/15 06:23
2020/11/15 06:30
2020/11/15 06:38
2020/11/15 06:50
2020/11/15 07:16
2020/11/15 07:18
2020/11/15 07:22 編集
2020/11/15 07:22
2020/11/15 07:40
2020/11/15 07:53
2020/11/15 07:58
2020/11/15 08:03 編集
2020/11/15 08:03
2020/11/15 08:06
2020/11/15 08:10
2020/11/15 09:50
2020/11/15 10:03
2020/11/15 10:10
2020/11/15 10:28
2020/11/15 10:30
2020/11/15 10:31
0
今までの分をまとめたものを張っておきます。
前の回答での誤記がいくつかありましたので、修正しました。
動作確認済みです。
縦ビンゴ、斜めビンゴはあなたのほうで加えてください。
ruby
1#文字の検索 2def find_position(arr,val) 3 (0..S-1).each do |i| 4 (0..S-1).each do |j| 5 if arr[i][j] == val 6 return i,j 7 end 8 end 9 end 10 return nil,nil 11end 12#横のビンゴ判定 13def bingo_row(hantei,i0,j0) 14 (0..S-1).each do |j| 15 #1つでも0ならNO 16 if hantei[i0][j] == 0 17 return false 18 end 19 end 20 #全て1の場合、YES 21 return true 22end 23 24 25S = gets.to_i 26word_arr = Array.new(S) 27data = [*'a'..'z', *'0'..'9'] 28(0..S-1).each do |i| 29 ar = Array.new(S){data.sample(4).join} 30 word_arr[i] = ar 31end 32 33(0..S-1).each do |i| 34 (0..S-1).each do |j| 35 printf("%s ",word_arr[i][j]) 36 end 37 printf("\n") 38end 39 40N = gets.to_i 41word_arr_flat = word_arr.flatten 42word_n = word_arr_flat.sample(N) 43 44word_n.each do |word| 45 printf("%s ",word) 46end 47printf("\n") 48 49hantei = Array.new(S) 50(0..S-1).each do |i| 51 ar = Array.new(S,0) 52 hantei[i] = ar 53end 54ctr = 0 55word_n.each do |val| 56 i,j = find_position(word_arr,val) 57 if i == nil 58 printf("バグのため終了\n") 59 exit 10 60 end 61 hantei[i][j] = 1 62 # 以下4つのビンゴ判定(4つのメソッドをつくったほうがよいかと思います) 63 ret = bingo_row(hantei,i,j) 64 if ret == true 65 printf("横 ビンゴ\n") 66 ctr += 1 67 break 68 end 69end 70if ctr == 0 71 printf("ビンゴなし\n") 72end 73pp hantei
実行結果
5
w6jz 5m6q 7kjo cnom lh1u
1og8 w0vt 1l7p 26mc lrus
2g9x urfm ze6n 6kpe kxon
ql8z rl2g d873 0mho 1sa8
otgs wfv0 ku6r bjth bqci
20
2g9x 1l7p 5m6q 6kpe 1sa8 cnom lrus ze6n lh1u w0vt wfv0 rl2g ql8z ku6r bqci 7kjo d873 kxon 0mho w6jz
横 ビンゴ
[[0, 1, 1, 1, 1],
[0, 1, 1, 0, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 0, 1]]
投稿2020/11/14 09:28
編集2020/11/14 09:29総合スコア5493
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/14 11:41 編集
2020/11/14 11:53
2020/11/14 11:56
2020/11/14 11:59
2020/11/14 12:03
2020/11/14 12:08
2020/11/14 12:09
2020/11/14 12:10
2020/11/14 12:14
2020/11/14 12:19
2020/11/14 12:26
2020/11/14 12:38
2020/11/14 12:40
2020/11/14 12:56
2020/11/14 13:17
2020/11/14 13:23
2020/11/14 13:28
0
ruby
1S = gets.to_i 2# ビンゴカードの入力 3bingo_card = Array.new(S){ gets.split } 4word_list = bingo_card.flatten 5 6### 当選ワードの入力 ### 7 8N = gets.to_i 9hit_words = Array.new(N){ gets.chomp } 10 11hit_list = Array.new(S*S) 12hit_words.each do |hit| 13 if ix = word_list.find_index(hit) 14 hit_list[ix] = true 15 end 16end 17 18hit_card = hit_list.each_slice(S).to_a 19# pp hit_card # DEBUG: デバッグ用なので不要なら消す 20 21### ビンゴ判定 ### 22# 斜め判定 23naname1 = Array.new(S){|i| hit_card[i][i] }.all? 24naname2 = Array.new(S){|i| hit_card[i][-i-1] }.all? 25# 横判定 26yoko = hit_card.any?(&:all?) 27# 縦判定 28tate = hit_card.transpose.any?(&:all?) 29# 結果出力 30# puts "--------------------------------" # DEBUG: 見づらかったので罫線いれとく 31if yoko || tate || naname1 || naname2 32 puts "Yes" 33else 34 puts "No" 35end
まぁ、こんなん
投稿2020/11/14 07:18
編集2020/11/15 12:08総合スコア15149
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/14 07:48
2020/11/14 09:20
2020/11/14 10:21 編集
2020/11/14 11:29
2020/11/14 11:43
2020/11/14 12:08
2020/11/14 12:34
2020/11/14 12:37
2020/11/14 12:43
2020/11/14 12:57
2020/11/14 12:59
2020/11/15 03:34
2020/11/15 06:32
2020/11/15 07:08
2020/11/15 07:14
2020/11/15 07:17
2020/11/15 07:23
2020/11/15 07:25
2020/11/15 07:26
2020/11/15 07:27
2020/11/15 07:29
2020/11/15 07:35
2020/11/15 07:54 編集
2020/11/15 07:56 編集
2020/11/15 07:55
2020/11/15 08:00
2020/11/15 08:05 編集
2020/11/15 08:07
2020/11/15 12:27
2020/11/15 12:31
2020/11/15 12:40
2020/11/15 12:44
2020/11/15 13:04
2020/11/15 13:16 編集
2020/11/15 13:17
2020/11/15 13:36
2020/11/15 13:48
2020/11/15 14:09 編集
2020/11/15 14:29
2020/11/15 22:08
2020/11/15 22:19
2020/11/15 22:32 編集
2020/11/15 23:17 編集
2020/11/15 22:54
2020/11/15 23:06
2020/11/15 23:06 編集
2020/11/15 23:17 編集
2020/11/15 23:16
2020/11/15 23:23
2020/11/15 23:40
2020/11/15 23:46
2020/11/16 00:44
2020/11/16 00:51 編集
2020/11/16 01:27
0
ビンゴのYes/No判定とSxSマスにある文字とN個の文字が一致していれば印をつけるメソッドはどう言う風に考えますか?
1.まず、S×S個の配列を作ります。全要素は初期値は0にします。
前の回答のarrと同じ要領でhanteiをつくります。(中身は全て0)
2.N個の文字を1つずつ取り出し、以下の処理を行います。
1)arrの全要素を取り出した文字と比較し、一致した個所を特定します。
arr[i][j]が一致したとします。
2)hanntei[i][j]に1をセットします。
3)hantei[i][j]を含む位置がビンゴか否かの判定をします。
3-1)横並びの判定
iは変えずj=0からS-1迄させ、hantei[i][j]が全て1ならビンゴ
3-2)縦並びの判定
jは変えずi=0からS-1迄させ、hantei[i][j]が全て1ならビンゴ
3-3)斜め並びの判定(右下がり)
i==jなら斜めの位置にあるので以下の処理
i=0からS-1迄させ、hantei[i][j]が全て1ならビンゴ(jはiと同じ値を使用)
3-4)斜め並びの判定(右上がり)
i+j==S-1なら斜めの位置にあるので以下の処理
i=0からS-1迄させ、hantei[i][j]が全て1ならビンゴ(jはS-1-iを使用)
@word_nとword_arrはあなたのをそのまま使用してください
ruby
1def find_position(arr,s,val) 2 (0..s-1).each do |i| 3 (0..s-1).each do |j| 4 if arr[i][j] == val 5 return i,j 6 end 7 end 8 end 9 return nil,nil 10end 11 12 13# arrと同じ形式のhantei(初期値:0) 14 15hantei = Array.new(S) 16(0..S-1).each do |i| 17 ar = Array.new(S,0) 18 hantei[i] = ar 19end 20 21pp hantei 22#@word_nを作成(なかみは適当) 23@word_n = ["aaa","bbb","ccc"] 24#word_arrを作成(中身は入れてない) 25word_arr = Array.new(S) 26(0..S-1).each do |i| 27 ar = Array.new(S) 28 word_arr[i] = ar 29end 30@word_n.each do |val| 31 i,j = find_position(word_arr,S,val) 32 if i == nil 33 printf("バグのため終了\n") 34 exit 10 35 end 36 hantei[i,j] = 1 37 # 以下4つのビンゴ判定(4つのメソッドをつくったほうがよいかと思います) 38end 39 40
投稿2020/11/14 02:32
編集2020/11/14 03:37総合スコア5493
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/14 03:04
2020/11/14 03:09
2020/11/14 03:35
2020/11/14 04:16
2020/11/14 04:22
2020/11/14 04:26
2020/11/14 04:40
2020/11/14 04:47
2020/11/14 05:02
2020/11/14 05:11
2020/11/14 05:13
2020/11/14 05:21
2020/11/14 05:38
2020/11/14 05:44
2020/11/14 05:47
2020/11/14 05:50
2020/11/14 05:53
2020/11/14 05:53
2020/11/14 06:01
2020/11/14 06:04
2020/11/14 06:04
2020/11/14 06:12
2020/11/14 06:18
2020/11/14 06:20
2020/11/14 06:43 編集
2020/11/14 06:27
2020/11/14 06:28
2020/11/14 06:31
2020/11/14 06:34
2020/11/14 06:37
2020/11/14 06:38
2020/11/14 06:43
2020/11/14 06:51
2020/11/14 06:52
2020/11/14 06:52
2020/11/14 06:55
2020/11/14 06:56
2020/11/14 06:58
2020/11/14 06:59
2020/11/14 07:03
2020/11/14 07:04
2020/11/14 07:08
2020/11/14 07:09
2020/11/14 07:17
2020/11/14 07:28
0
最初にSの値を入力し、そのますにtest1から順に数字を入れるサンプルです。
参考になれば幸いです。
Ruby
1S = gets.to_i 2arr = Array.new(S) 3test_no = 0 4(0..S-1).each do |i| 5 ar = Array.new(S) 6 (0..S-1).each do |j| 7 test_no += 1 8 ar[j] = "test" + test_no.to_s 9 end 10 arr[i] = ar 11end 12 13p arr #全体を表示 14 15#個別に表示 16(0..S-1).each do |i| 17 (0..S-1).each do |j| 18 printf("%s ",arr[i][j]) 19 end 20 printf("\n") 21end 22
実行結果(S=6の場合)
6
[["test1", "test2", "test3", "test4", "test5", "test6"], ["test7", "test8", "test9", "test10", "test11", "test12"], ["test13", "test14", "test15", "test16", "test17", "test18"], ["test19", "test20", "test21", "test22", "test23", "test24"], ["test25", "test26", "test27", "test28", "test29", "test30"], ["test31", "test32", "test33", "test34", "test35", "test36"]]
test1 test2 test3 test4 test5 test6
test7 test8 test9 test10 test11 test12
test13 test14 test15 test16 test17 test18
test19 test20 test21 test22 test23 test24
test25 test26 test27 test28 test29 test30
test31 test32 test33 test34 test35 test36
投稿2020/11/13 08:11
総合スコア5493
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/13 08:55
2020/11/13 09:21
2020/11/13 09:37
2020/11/13 09:41
2020/11/13 10:13 編集
2020/11/13 10:14
2020/11/13 10:52
2020/11/13 13:35 編集
2020/11/13 15:14
2020/11/13 22:36
2020/11/13 23:33
2020/11/13 23:34
2020/11/13 23:42
2020/11/13 23:54
2020/11/14 00:03
2020/11/14 00:33
2020/11/14 02:32
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。