2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-02

# 問題

言語処理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にわたすときに変換すればもともと不要だったか

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?