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

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

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

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

Q&A

解決済

2回答

734閲覧

rubyで文字列を1文字ずつ比較するにはどうしたら良いでしょうか?

masakin

総合スコア3

Ruby

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

0グッド

0クリップ

投稿2023/03/01 01:25

実現したいこと

経緯 今英単語が入力されたらその単語のスペルがあっているのかを判断するプログラムをRubyで作成しています。

質問です。 配列の中の英単語の綴りを比べて1文字間違っていたら1点、2文字以上間違っていたら0点で「合計点」を表示したいです。

answers = ["apple","peach","orange"] fruits = ["aplle","peech","olaege"]

それぞれの配列から順番に値を取り出し
appleとaplleを比較し綴りのスペルが1文字間違えていたら
1点で2つ以上スペルミスがあれば0点として配列内の値全てをチェックし合計点を出力したいです。
上の例で言うと合計点は2点です。
わからない点はどうやって1文字1文字チェックするのかが分かりません。

3〜4時間考えてもうまく作れないため、これ以上時間を使うのは非効率と考え質問させていただきます。

試したこと

①完成までの仮説を立てました。

1.配列を2つ用意する。(答えの英単語を含む単語と比較したい英単語の配列)
2.それぞれの配列から値を一つずつ取り出す。
3.取り出した値をそれぞれ比較する ⇦ここで躓いています。
4.1文字違い⇨1点、2文字以上違う⇨0点
5.合計点を出力する。

私のコード

answers = ["apple","peach","orange"] fruits = ["aplle","peech","olaege"] answers.each do |answer| students.each do |student| end end

②AとBを比較し一致するかどうかを調べるメソッドがないのかをネットで調べました。
⇨includeメソッドとcharsメソッドヒットしましたがうまく作れませんでした。

answers = ["apple","peach","orange"] fruits = ["aplle","peech","olaege"] answers.each do |answer| fruits.each do |fruit| if answer.include?(fruit) puts "yse" else puts "no" end end end

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

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

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

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

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

otn

2023/03/01 03:15 編集

> 3.取り出した値をそれぞれ比較する ⇦ここで躓いています。 は、zipをつかいます。服のジッパー(ファスナー、チャック)と同じ意味。 (類似品に transpose = 行列の転置) が、"apple" と "aple" を「1文字抜けただけで他はあってるので1点」と判断したいのなら難しいです。 "ap" と "apple" は0点だと思いますが、zipだと長さが異なる場合の扱いが面倒。 そもそも完全一致は何点?
masakin

2023/03/01 06:35

ご丁寧に回答していただき誠にありがとうございます。 zipの言葉の意味までありがとうございます。 完全一致は2点です。 質問に不足があり誠に申し訳ございませんでした
otn

2023/03/01 07:04

長さが違うことはあり得ないという前提があるのでしょうか?
masakin

2023/03/01 07:18

はい、長さが違う場合はあり得ないという前提です
otn

2023/03/01 10:28

長さが違うことがあり得ないなら、melianさんの回答に「完全一致は2点」という条件判断を追加すればいいかと。 長さが違うことがあり得ないということでそもそも長さをチェックしないか、念のため長さをチェックして異なれば異常終了するようにするか。普通は後者。
masakin

2023/03/02 02:44

otnさん私のような初学者の方にも親身に回答していただきありがとうございました。 おっしゃるとうりで普通は念の為長さチェックをしてから異なれば〜と言う処理を書く方が良いと思いましたのでmelianさんのコードを参考に自分で改善してみようと思いました。
guest

回答2

0

間違い2までなのでなんとかなるかなぁ。
誤りには3種あります。抜け、余分、文字違い。
each の中の判定部分だけについて書きます。
def scoring(fruit, answer) ですね。
方針を書きますので、codingは楽しんでみてください

文字数を比較する。   2以上違ったら 0点   同じなら melianさんの方法   answerが一文字多かったら: 違いが出たところでその文字無視して answerのの次の文字と比べ直す   answerが一文字少なかったら: 違いが出たところでその文字無視して fruitの次の文字と比べ直す

投稿2023/03/01 08:23

winterboum

総合スコア23329

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

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

0

ベストアンサー

ruby

1answers = ["apple","peach","orange"] 2fruits = ["aplle","peech","olaege"] 3 4p answers.zip(fruits).map{|a, b| a.chars.zip(b.chars).count{|a, b| a != b}}.count(1) 5 6# 2

投稿2023/03/01 01:42

編集2023/03/01 01:47
melian

総合スコア19703

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問