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

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

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

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

Q&A

解決済

4回答

2845閲覧

単語比較(Ruby)について

daikitakaya

総合スコア229

Ruby

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

0グッド

0クリップ

投稿2016/12/02 11:55

編集2016/12/02 12:16

###前提・実現したいこと
単語を二つについて比較を行い、何文字間違っていて、何文字目が間違っているのかを返すプログラムを書きたいです。
例えば、

"ABCD" "AVBG"

の二つを入力した時に『三文字違い、2番目、3番目、4番目が不一致です
というような出力をしたいです。

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

###試したこと
二つの単語に対して、二つの配列を用意し、一単語ずつ格納し、それぞれのインデックスが同じ要素を一つずつ比較していく方法が一番簡単に思いつきました。

def match_word(word1, word2) result_1 = [] result_2 = [] i = 0 count = 0 word1.chars{ |spel_1| result_1 << spel_1} word2.chars{ |spel_2| result_2 << spel_2} word1.length.times{ if result_1[i] != result_2[i] count += 1 puts "#{i+1}文字目" end i += 1 } puts "#{count}回" end

###補足情報
二つの単語の文字数が異なる場合はerrorを返すこととします。

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

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

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

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

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

guest

回答4

0

Ruby

1#encoding : utf-8 2 3def word_test(word1, word2) 4 comp = word1.split("").zip(word2.split("")) 5 comp = comp.map{|e| e.uniq.size} 6 answer = comp.map.with_index{|e, i| "#{i + 1}番目" if e == 2}.compact 7 answer = answer.join(",").gsub(",", "、") 8 return "『#{comp.count(2)}文字違い、#{answer}が不一致です』" 9end 10 11word1, word2 = ARGV[0], ARGV[1] 12if word1 == word2 13 puts "完全に一致です。" 14else 15 if word1.size != word2.size 16 puts "文字数が不一致です。" 17 else 18 puts word_test(word1, word2) 19 end 20end

今更ですが私も考えてみました。
処理が速いとか、見やすいということはありません。

投稿2017/03/01 05:05

編集2017/03/15 16:36
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

diff.rb

ruby

1def str_to_ary(str) 2 str.each_char.with_index.inject([]) {|mem, x| mem << x } 3end 4 5s1, s2 = [ARGV[0], ARGV[1]].sort 6diff = str_to_ary(s2) - str_to_ary(s1) 7 8if diff.empty? 9 puts '一致しています' 10else 11 print "#{diff.size}文字違い: " 12 diff.each { |x| print "#{x[1] + 1}番目 " } 13 puts 14end

実行例

$ ruby diff.rb ABCD AVBG 3文字違い: 2番目 3番目 4番目 $ ruby diff.rb ABCD ABCD 一致しています $ ruby diff.rb "abc " "abc" 1文字違い: 4番目 $ ruby diff.rb "abc" "abc " 1文字違い: 4番目 $ ruby diff.rb "" "" 一致しています

投稿2016/12/02 16:18

katoy

総合スコア22324

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

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

0

ベストアンサー

Ruby

1def check_word(word1, word2) 2 return "文字数が不一致です" unless word1.size == word2.size 3 a = word1.split("").zip(word2.split("")) 4 .each_with_index 5 .find_all{|(x,y),i| x!=y} 6 .map{|(x,y),i| i+1} 7 "#{a.size}文字違い#{ 8 if a.size > 0 9 a.map{|x| "、#{x}番目"}.join + "が不一致です" 10 end 11 }" 12end 13 14puts check_word("ABCD", "AVBG") 15puts check_word("ABCD", "ABCD") 16puts check_word("ABCD", "AB")

文字列を配列に変えるのに記述が短いのでsplit("")を行っていますが、each_char.to_aの方が少し速いです。

投稿2016/12/02 15:58

otn

総合スコア84507

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

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

0

全て一致した場合を考慮しないとしたら、このようにも書けます。
全て一致した場合に他の表示をしたい場合は、if unmatch_num.zero?の処理を足せば良いでしょう。

ruby

1def test(a, b) 2 raise if a.length != b.length 3 4 unmatch_indexes = [] 5 6 unmatch_num = 7 a.length.times.reduce(0) do |sum, i| 8 if a[i] == b[i] 9 sum 10 else 11 unmatch_indexes.push i + 1 12 13 sum += 1 14 end 15 end 16 17 "#{unmatch_num}文字違い、#{unmatch_indexes.map{|i| "#{i}番目、"}.join}が不一致です" 18end 19 20puts test "ABCD", "AVBG"

投稿2016/12/02 12:21

cameluby

総合スコア891

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問