無限大な夢のあと

テニスとアニメが大好きな厨二病SEのブログ

Swift, Rust, Elmで言語処理100本ノック2015 #1 00. 文字列の逆順+文字列のUnicodeコードポイント/バイト列表示

# はじめに
普段使いのSwiftに加えて、Rust, Elmに慣れるためにトライする実行環境紹介ページです。

言語処理100本ノック2015はこちら
http://www.cl.ecei.tohoku.ac.jp/nlp100/

この方がスマートあるいは処理効率が良いなどありましたら、コメントくださいませ。

## 00. 文字列の逆順

文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.
おまけで文字列のUnicodeコードポイント/バイト列表示。

### Swift

String peace = "azatoi";
> String("stressed".reversed())
String = "desserts"

> "stressed".reversed()
ReversedCollection<String> = {
  _base = "stressed"
}
# Stringで囲まないと、ReversedCollection<String>が返ってくるようです。
# 昔にSwift3の時に練習した時のを掘り出すと.charactersというString.CharacterViewを使わないとダメでしたが、
# Swift4からはStringから直接使えるようになりましたね。
> String("stressed".characters.reversed())

# 文字列のUnicodeのコードポイントを返す
# https://developer.apple.com/documentation/swift/unicode/scalar
# Unicode スカラは U+0000 〜 U+D7FF または U+E000 〜 U+10FFFF の範囲に含まれるコードポイントです。
# Unicode スカラは U+D800 〜 U+DFFF の範囲に含まれるコードポイントであるサロゲートペアのコードポイントは含まれません。
> "Go言語".unicodeScalars.map { print($0.value) }
71
111
35328
35486

# 文字列のバイト列を返す
> Array("Go言語".utf8)
$R1: [String.UTF8View.Element] = 8 values {
  [0] = 71
  [1] = 111
  [2] = 232
  [3] = 168
  [4] = 128
  [5] = 232
  [6] = 170
  [7] = 158
}
}

### Elm

> String.reverse "stressed"
"desserts" : String

> "stressed" |> String.reverse
"desserts" : String
-- パイプじゃないとまだ慣れないなぁ

-- Char型がUnicodeのコードポイント(32bit数値表現かな)ということで試してみました。
-- https://package.elm-lang.org/packages/elm/core/latest/Char#toCode
> "Go言語" |> String.toList |> List.map Char.toCode
[71,111,35328,35486] : List Int


-- バイト列を表示するには
-- ライブラリ導入が早いです。
-- https://package.elm-lang.org/packages/ktonon/elm-word/2.1.2/

> import Word.Bytes exposing (..)
> Word.Bytes.fromUTF8 "Go言語" 
[71,111,232,168,128,232,170,158]

### Rust

> "stressed".chars().rev().collect::<String>()
"desserts"

"stressed".chars().rev()
Rev { iter: Chars { iter: Iter([115, 116, 114, 101, 115, 115, 101, 100]) } }
// collectしないと文字列のバイト列が返ってくる。
// https://doc.rust-lang.org/std/primitive.char.html
"Go言語".chars()
Rev { iter: Chars { iter: Iter([71, 111, 232, 168, 128, 232, 170, 158]) } }
"Go言語".as_bytes()
[71, 111, 232, 168, 128, 232, 170, 158]
// StringはVec<u8>のラッパです。上記は単純にバイト列を返しているだけです。言と語はそれぞれ3バイト使います。
// Unicodeコードポイントの32bit数値表現だとしたら、Iter([71, 111, 35328, 35486]) で返ってくる。
// Unicodeコードポイントが返ってくる実装については一旦保留