言語処理100本ノック、再び

Posted by johtani on Wednesday, April 8, 2020

目次

今回もツイートから。

言語処理100本ノックが2020年版になったそうです。 そうです、2年前に初めて、準備運動で止まっていたんです!(衝撃的な続かなさ。。。)

ということで、Rust the bookも読んでいることだし、過去のプログラムをチェックしつつ再開しようかなと。 ということで、いくつかリファクタリングしてみました。

ソースはリポジトリを御覧ください。

00. 文字列の逆順

2年前の実装では、chars()メソッドで取り出したあとに、collect()でVecにしていたのですが、RustのIteratorトレイトにrev()という便利なメソッドが存在していました

ということで、これを取り出すと、最初の文字列の逆順で文字を取り出すIteratorが取得できます。 あとは、Stringが実装してくれているfrom_iterに渡せば文字列が出来上がります。

01. 「パタトクカシーー」

ストリーム処理っぽい書き方に変更しました。 2年前はIteratorを取り出して、詰替していましたが、 enumerate()で添字と文字のタプルのイテレータに変換し、 filterで添字が偶数のときだけフィルタリングして、 mapで対象の文字をまとめたイテレータにします。 で、最後はそれを元に文字列を生成することにしました。 iterを使わないでそのままString::from_iterの引数に渡すことも可能ですね。

02. 「パトカー」+「タクシー」=「パタトクカシーー」

2年前は2つのIteratorをloopで回して頑張って結合してました。 ではなく、zip()を使って、2つのイテレータを組み合わせる方法に替えてみました。 このとき、2つの文字列が違う文字数の場合の処理として、長い方から取り出した文字をあとに結合する処理を追加で記述しました。 ちょっとスマートな感じになりましたかね?

zipしたあとに出てきたタプルの文字列を結合するのにformat!マクロを使いましたが、他にいい方法有るかなぁ?

まとめ

とりあえず最初の3つをリファクタリングしてみました。 残りもやりつつ、準備運動以降もがんばるぞと。


comments powered by Disqus