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

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

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

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

Q&A

解決済

3回答

8444閲覧

no implicit conversion of String into Array (TypeError)

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

1グッド

1クリップ

投稿2016/10/24 07:03

###前提・実現したいこと
スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ.ただし,長さが4以下の単語は並び替えないこととする.適当な英語の文(例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .")を与え,その実行結果を確認せよ.
(引用元:http://www.cl.ecei.tohoku.ac.jp/nlp100/)
色々調べたのですがわかりませんでした。よろしくお願いします。

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

09.rb:5:in `block in Typoglycemia': no implicit conversion of String into Array (TypeError) from 09.rb:3:in `each' from 09.rb:3:in `Typoglycemia' from 09.rb:17:in `<main>'

###該当のソースコード

Ruby

1def Typoglycemia(str) 2 result = [] 3 str.split.each {|words| 4 if words.length <= 4 5 result += words 6 else 7 list = words.slice!(1..-2) 8 mid = rand(list) 9 shuffle_list = words[0] + mid + words[-1] 10 result += shuffle_list 11 end 12 } 13 return result.join(" ") 14end 15 16str = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ." 17print Typoglycemia(str)

###補足情報(言語/FW/ツール等のバージョンなど)
Ruby2.0.0

DrqYuto👍を押しています

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

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

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

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

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

guest

回答3

0

このエラーは、
「StringにはArrayへの暗黙的型変換はありませんよー」というようなエラーです。
ArrayクラスのオブジェクトであるresultにStringクラスのオブジェクトであるwordsを足そうとしていることが原因ですね。
ここでは
result << words

result.push(words)
のような配列に要素を追加するようにするという解決策があります。

投稿2016/10/24 10:20

cameluby

総合スコア891

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

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

退会済みユーザー

退会済みユーザー

2016/10/24 14:01

とても分かりやすい説明ありがとうございます。 無事解決致しました!
guest

0

ベストアンサー

result += wordsですが、Arrayに対する+演算は配列の連結なので、配列でなければ通りません。

配列に要素を追加したい場合、result << wordsとしましょう。

投稿2016/10/24 07:15

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2016/10/24 14:00

ありがとうございます。無事解決致しました。 回答が早かったためBAにさせていただきました。
guest

0

ソースコード

def Typoglycemia(str)
shuffle = []
str.split.each {|words|
list = []
if words.length <= 4
shuffle << words
else
list << words.slice(1..-2)
shuffle << [words[0],list[0].chars.sort_by{rand}.join,words[-1]].join

end } return shuffle.flatten.join(" ")

end

str = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
print Typoglycemia(str)
変更点

指摘していただいた、 +=演算子を配列に要素を追加させる演算子<<に変更。
list配列に単語の両端の文字以外を入れ、chars.sort_by{rand}によって、1文字ずつ取り出しシャッフルする。
その後.joinで1文字づつ取り出されたシャッフル後のlist配列をくっつける。
両端の文字も入れ.joinで全てくっつけ変数shuffleに入れる。
shuffleを.falattenで平坦化し.loinで文字列化。

投稿2016/11/04 15:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問