Nimで言語処理100本ノック 01. 「パタトクカシーー」

 問題

言語処理100本ノック 2015#sec01

「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

解答

最初は1,3,5,7を列挙しようとしましたが、よく考えると奇数字を取り出す問題ですね。

nim1.nim
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#コメント


  1. いやinにわたすときに変換すればもともと不要だったか 

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.