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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

4079閲覧

プログラミング超初心者です。ordメソッド、ASCIIコード、charメソッドに関する質問です。

H-JURI

総合スコア42

Ruby

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

1グッド

1クリップ

投稿2015/11/12 06:45

Rubyをベースにプログラミングを学んでいる超初心者です!初めての'ord'、'ASCll'、'char'などが出てきて正直コードの意図と意味がよくわかりません。。。以下が問題とその解答となるコードです。一応自分自身の解釈をコードの横に書いておきます。

Ruby

1# Write a method that takes in an integer `offset` and a string. 2# Produce a new string, where each letter is shifted by `offset`. You 3# may assume that the string contains only lowercase letters and 4# spaces. 5# 6# When shifting "z" by three letters, wrap around to the front of the 7# alphabet to produce the letter "c". 8# 9# You'll want to use String's `ord` method and Integer's `chr` method. 10# `ord` converts a letter to an ASCII number code. `chr` converts an 11# ASCII number code to a letter. 12 13def caesar_cipher(offset, string) #caesar_cipher( , )というメソッドを定義する 14 words = string.split(" ") #wordsにstringを文字列で分割したものを代入する 15 16 word_idx = 0 #word_idxに0を代入する 17 while word_idx < words.length #「word_idx < wordsの文字列数」の間繰り返す 18 word = words[word_idx] #wordにword_idx番目の文字列を代入 19 20 letter_idx = 0 #letter_idxに0を代入 21 while letter_idx < word.length #「letter_idx < wordの文字数」の間繰り返す 22 char_i = word[letter_idx].ord - "a".ord #文字'word[letter_idx]'に対応する数字(ASCllコード) - 'a'に対応する数字(ASCllコード)をchar_iに代入??? 23 24 new_char_i = (char_i + offset) % 26 #new_char_iに(char_i + offset) % 26を代入??? 25 word[letter_idx] = ("a".ord + new_char_i).chr #word[letter_idx]に('a'のASCllコード + new_char_i)に対応する文字を代入 26 27 letter_idx += 1 #letter_idxを1足してwhile letter_idx < word.lengthに戻る 28 end #終わり 29 30 word_idx += 1 #word_idxに1足してwhile word_idx < words.lengthに戻る 31 end #終わり 32 33 return words.join(" ") #wordsを連結し???、返す 34end 35 36# These are tests to check that your code is working. After writing 37# your solution, they should all print true. 38 39puts( 40 'caesar_cipher(3, "abc") == "def": ' + 41 (caesar_cipher(3, 'abc') == 'def').to_s 42) 43puts( 44 'caesar_cipher(3, "abc xyz") == "def abc": ' + 45 (caesar_cipher(3, 'abc xyz') == 'def abc').to_s 46) 47

???とついているものが分からない部分ですが、全体的にわかっていません。。。メソッドについては

  • .ord:その文字に対応するASCllコードに変換
  • .chr:そのASCllコードに対応する文字に変換
  • char:文字列中の文字を繰り返し取り出す???

と認識しています。

???と全体的なコードの意図・意味をご教授願います!

また余談ですが、caesar_cipher(offset, string)

  • caesar(皇帝)
  • cipher(ゼロ)
  • offset(差し引き)

のプログラミングに置ける意味も教えていただけたら幸いです。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

charというメソッドは登場しませんが、勘違いでしょうか。

.ordと、.chrは、整数の集合と文字の集合の間での変換関数に相当します。互いに逆関数です。

Ruby

1"a".ord #=> 97 297.chr #=> "a"

また、"a".ordから、"z".ordまでは連続した整数になっています。従って、英小文字.ord - "a".ordは、「英小文字の何番目に当たるか」を表します(ゼロ始まりで)。

さて、Caesarは、人名で、紀元前一世紀のローマの政治家&軍人です。彼が使ったという暗号(Cipher)が、「シーザー暗号」と呼ばれ、英字を3つずらして書くものです。例えば「ruby」は「uxeb」になります("z"の次は"a"とする)。

このメソッドでは、「3ずらし」だけでなくいくつずらす(offset)のかを指定できるようになっています。
"a"~"z"をまず0~25の整数に直して、offsetを足して、26で割った余りを求めることで、文字のずらしを実現しています。

あと、このメソッドは良くないですね。
悪い点: 英小文字にしか対応していないが、英小文字以外が混じってないかをチェックしていない
改善できる点:whileのループがわかりにくい(Rubyらしくない)

これをmapcase whenを使って改善するのも良い練習かと思います。

投稿2015/11/12 09:10

編集2015/11/12 09:45
otn

総合スコア84499

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

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

H-JURI

2015/11/14 09:42

回答ありがとうございます! 今回のコードの解説がわかりやすかったので、ベストあんさーにさせていただきます。
guest

0

これは「シーザー暗号」の処理ルーチンですね。
シーザー暗号でググれば色々と説明が出てきますので暗号の仕組みはそちらを参照ください。それが分かれば何をやってるのか理解できると思います。

が、わからない場合は以下のヒントを参照ください。(シーザー暗号を理解した上で読んでください)

26で割った余りを求めているのは、アルファベットがa~zで26文字だからです。
つまり、a~zを0~25の数値に一旦置き換えてoffset分ずらすのですが、25の次は0に戻って欲しいので、26で割った余りを求めているわけです。
そうやってオフセット分ずらした数値(0~25)をa~zに再変換しているわけです。

投稿2015/11/12 09:02

PineMatsu

総合スコア3579

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

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

H-JURI

2015/11/14 09:41

回答ありがとうございます! シーザー暗号というのですね。調べてなんとか理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問