目次
今回もツイートから。
言語処理100本ノックの2020年版を公開しました。最近の自然言語処理の研究動向を反映し、深層ニューラルネットワークに関する問題を追加しました。留学生も一緒に取り組めるように多言語化を進め、その第1弾として英訳を部分公開しています(40番以降は順次公開予定)。 https://t.co/52h362PIQQ
— Naoaki Okazaki (@chokkanorg) April 6, 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
See Also by Hugo
- 第1章の00から02までやってみた(言語処理100本ノック)
- 第2章の12から19まで(言語処理100本ノック2020)
- 第2章の10から11まで(言語処理100本ノック2020)
- 第1章の08から09まで(言語処理100本ノック2020)
- 第4章終了(言語処理100本ノック2020)