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

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

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

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

784閲覧

文字のかえかたを教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/07/10 13:30

編集2020/07/13 12:15

標準入力で得た英字を大小逆に返すようなプログラムを作りたいです。
upcase、downcace、swapcaseを使いたくないのですがそれ以外の方法が思いつきません。

下のコードのようなものを応用して作れるのかなと思っていますが、なかなか思い浮かびません。

ruby

1x=STDIN.gets 2x.each do |b| 3 printf("%s => %x\n", b.chr, b) 4end

aAbBと入力したときAaBbと変えるようになるにはどのようにしたらよいのでしょうか。初心者なので簡単な方法だととても助かります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

A41じゃなくて0x41ですね。以下同様。

まず、英大文字か、英小文字か、それ以外の文字か、を判断します。
each_byteよりeach_codepointの方が良いです)

Ruby

1~~~.each_codepoint do |b| 2 case b 3 when 0x41..0x5A 4 b += 0x20 5 when 0x61..0x7A 6 b -= 0x20 7 end 8 printf "%c", b 9end

Ruby

1 case b 2 when 0x41..0x5A, 0x61..0x7A 3 b ^= 0x20 4 end

でもいです。

文字のままループする方がいい気がしますね。

Ruby

1~~~.each_char do |c| 2 case c 3 when "A".."Z", "a".."z" 4 c = (c.ord ^ 0x20).chr 5 end 6 print c 7end

投稿2020/07/10 14:13

otn

総合スコア85901

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

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

退会済みユーザー

退会済みユーザー

2020/07/11 05:53

回答ありがとうございます。each_codepointというものがあったんですね。 逆に x=STDIN.gets x.each_byte do |b| ではできないということなんですかね?たとえコードが長くなる、めんどくさくなる方法でも これを使ったやりかたなどございましたら教えていただきたいです。
otn

2020/07/11 07:01

each_byteとeach_codepointは、対象がいわゆる半角英数記号だけだと動作は同じです。 日本語などを入れたときに違ってきます。日本語などが入ってくる可能性がゼロなら、each_byteのままでいいです。
退会済みユーザー

退会済みユーザー

2020/07/11 07:42

あ、そうだったんですね!ご丁寧に教えていただきありがとうございます!(o_ _)o))
guest

0

-20じゃなくて、-0x20です
大文字なら、+0x20で小文字に、
小文字なら、-0x20で大文字になります。

ぶっちゃけ、大文字小文字相互変換は、0x20でXORしてやればいいです

投稿2020/07/10 13:35

y_waiwai

総合スコア88042

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

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

退会済みユーザー

退会済みユーザー

2020/07/10 14:00

回答ありがとうございます。 x=STDIN.gets x.each_byte do |b| printf("%s => %x\n", b.chr,b-0x20) としてみましたがたはり a a => 41 => ..fea end こうかえってきてしまいました。それと0x20というのは16進数の20なのでー32と同じなんですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問