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

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

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

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

Q&A

解決済

3回答

182閲覧

swapcaceを使わない文字列の変換

piyo_tan

総合スコア16

Ruby

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

0グッド

0クリップ

投稿2017/10/08 07:13

現在swapcaseを使わずに、文字列を変更するアルゴリズムを学んでいるのですが、
うまく実装できません。

strs = []

def case_string(str)
a = str.split(",")
strs << a

for a in strs do
if a == a.upcase
return a.downcase
elsif a == a.downcase
return a.upcase
end
end
end

puts strs.join

case_string('saSA')
case_string('tttt')
case_string('fFfF')

このようなコードを組んでみたのですが、NameErrorになってしまいます。
どのように修正、考えればいいかご教示いただけますと幸いです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

元のコードとできるだけ同じ作りで、特にループ1回目でreturnする構造を再現して、動くコードを作ってみました。

飛び箱を越えるのにわざわざ宙返りするようなもので、実用性はありません。

ruby

1def case_string(str) 2 strs = [] 3 ary = str.split("") 4 5 f = Fiber.new do 6 for a in ary do 7 if a == a.upcase 8 Fiber.yield a.downcase 9 elsif a == a.downcase 10 Fiber.yield a.upcase 11 end 12 end 13 nil 14 end 15 16 loop { strs << f.resume } rescue 17 strs.join 18end 19 20puts case_string('saSA') 21puts case_string('tttt') 22puts case_string('fFfF')

投稿2017/10/09 08:53

emasaka

総合スコア524

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

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

0

ruby

1def case_string(str) 2 ans = '' 3 c_array = str.split('') 4 for c in c_array do 5 if c == c.upcase 6 ans += c.downcase 7 elsif c == c.downcase 8 ans += c.upcase 9 end 10 end 11 ans 12end 13 14def case_string2(str) 15 str.chars.map { |c| c == c.upcase ? c.downcase : c.upcase }.join 16end 17 18STRS = [ 19 'saSA', 'tttt', 'fFfF', 20 '', '1あ#"a A', 21 # "a\tb\nc", 22 # nil 23].freeze 24 25STRS.each do |str| 26 puts "[#{str}] -> [#{case_string(str)}], [#{case_string2(str)}]" 27end 28

質問文のメソッドをベースにしたものと、別の考え方で作成したものを示してみました。
試す文字列として、数字、記号、漢字、TAB, 改行なども試してみています。

実行例:
イメージ説明

投稿2017/10/08 11:04

katoy

総合スコア22324

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

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

0

case_stringから変数strsには直接アクセスできません。
対応方法の1つは、変数名をstrsから$strsに変更してグローバル変数として扱うことです。
クラスの作成を学ばれているようでしたら、クラス化することでも対応が可能となるかと思います。

投稿2017/10/08 07:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問