トラック
/
Pharo
Pharo
/
演習
/
文字列の反転
文字列の反転

文字列の反転

初級

はじめに

文字列を逆にする(左から右ではなく、右から左に読む)ことは、プログラミングでは意外とよくある作業です。

たとえば、バイオインフォマティクスでは、DNAやRNAの文字列の並びを逆にすることが、相補的な鎖を見つけたり、生物学的な意味を持つ回文配列を特定したりするなど、さまざまな解析でしばしば重要になります。

説明

ここでのタスクは、与えられた文字列を逆にすることです。

例をいくつか見てみましょう。

  • "stressed"を"desserts"にします。
  • "strops"を"sports"にします。
  • "racecar"を"racecar"にします。

Stringには#reversedや#reverseDo:というメソッドがありますが、より低レベルな文字の繰り返しとストリームを使って、これを自分で書く方法はわかるでしょうか?

コードを眺めやすくするために、Pharoには便利なコード検索ツールがあります。Shift-Enterを押すと起動します。

注:Exercismの慣習に従い、解答をReverseStringと呼んでいますが、よりSmalltalkらしい名前はStringReverserです。

Smalltalkと文字列

文字列については、コメントには二重引用符、文字列には単一引用符、文字には特別な構文(例えば、文字「x」は$x)といった、ちょっとしたわかりやすい違いがあります。こうした決まりごとは他のプログラミング言語とは違うので、最初に読んだときは戸惑うかもしれません。

シンボルという考え方もあります。シンボルは、メモリ全体でただ1つだけ存在する文字列です。つまり、(たいていはコンパイル時に)シンボルが作られるときに、同じものがすでに存在しないかどうかを調べるためにメモリが検索され、最初の1つだけが使われます。これはメモリの節約のためだけでなく、シンボル同士を比較するときの大幅な高速化のためでもあります。

"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo

また、Smalltalkのプログラムではコンマがほとんど登場しません。コンマが構文上の役割を何も持たないからです。 そのため、例えば配列リテラルにはコンマがありません。例えば #(1 2 3 4 5) です。 しかし、コンマはそれ自体が演算子であり、2つの文字列を連結するときに目にします。例えば 'string1', 'string2' です。

最後に、StringとCharacterは別のクラスだということを知っておくとよいでしょう。StringはCharacterの集まりです。そのため、文字列を繰り返し処理するときに、文字列を期待するメソッドに文字を渡してしまうことがあり、油断できません。次の例を見てください。

(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.

Smalltalkとストリーム

ストリームは、順番に読み書きするときに便利です。インデックスを1つずつ増やす必要がないので、コードがすっきりします。 ストリームはどんなコレクションでも扱えます。

stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Pharo Exercism

文字列の反転を始める準備はできましたか?

Exercismに登録すれば、50個の演習、そして本物の人間によるメンタリングとともに、Pharoを学んでマスターできます。すべて無料です。

文字列の反転を深く掘り下げよう!

文字列を反転させる14通りの方法を紹介しながら、Unicodeコードポイント、書記素、スタックとヒープの割り当て、ポインターなど、さまざまな話題を探ります。JeremyとErikと一緒に、くつろぎながら45分間の学習を楽しみましょう。