# 問題
「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.
解答
最初は1,3,5,7を列挙しようとしましたが、よく考えると奇数字を取り出す問題ですね。
import unicode
const str = "パタトクカシーー"
const rstr = toRunes(str)
var newStr: seq[Rune] = @[]
## for i in 0..rstr.len -1 から改善。インデックスが最初、値が2番めになる
for i, c in rstr :
if (i + 1) mod 2 == 1:
newStr.add(c)
echo newStr # パトカー
はい出ましたRune型です。
GoやPythonで挫折したポイントでもありますマルチバイト文字が簡単にStringとして扱えない問題(浅学)です。
そのままではstr[0] == パ
にならなかったので変換するひと手間をかけました。
nim文字列操作(unicode) - Qiita
を見るにruneAtPos
を使えばtoRunes
は不要で変数を減らせそうです。1
引っかかりポイントは
var newStr: seq[Rune]
だけでnewStr.add(c)
できない問題。
型宣言だけで空になる、操作できるとやや勘違い。ちゃんと = @[]
で初期化しなければダメでした。
剰余は%
ではなくmod
。加算は+
でいけるのでちょっとつまづき。
for でインデックスのみではなくvalueも取得する方法は、
Nim Tutorial Part Iを日本語訳してみた(前編) - Qiita#for文 For statement
で訳されておらず「ないのか!?」と焦った。
公式の方やいくつかのコードを漁って、発見。
勘でfor i c in
と書いて動かなかったのでニアミス。
後から調べてPython,Goと同じ形式だったので経験の差が出たような形に。
前回
Nimで言語処理100本ノック 00. 文字列の逆順 - Qiita
コメントの改善前forの書き方
0..hoge.len -1
は
0..<hoge.len
と書けるみたい。覚えておこう。
Nimでコーディング面接に立ち向かう-第1章 - Qiita#コメント
-
いやinにわたすときに変換すればもともと不要だったか ↩