Edited at

素人の言語処理100本ノック:00

More than 1 year has passed since last update.


はじめに

Linuxを使ったことがなく、Pythonも全く知らず、統計も大学でかじったはずが全く覚えておらず、正規表現も知らず、英語も苦手という私が、LinuxとPythonで言語処理100本ノック 2015を受けてみよう、という挑戦の記録です。一覧はこちらからどうぞ。

ちなみに私のスペックですが、一応元プログラマーとしてWindows Visual C/C++畑で育ってきました。ちなみにその前は68k MacのMPWでC++。意味が分かる方は同世代か先輩ですね^^ この歳で、はたしてどこまでノックに耐えられるのか...


環境について


  • Ubuntu 14.04 LTS

  • Python 2.7.6

  • gedit 3.10.4

で挑戦します。今のパソコンはMacなので、実際にはParallels Desktopで仮想化しています。

Pythonは3.xにしようか悩んだのですが、Ubuntuの素人がPythonのバージョン切り替えなどでつまづいているとノックが始まらないので、Ubuntuのデフォルトをそのまま使うことにしました。

(2016/09/25追記)

その後、識者の方からアドバイスをいただき、素人の言語処理100本ノック:02以降はUbuntu 16.04 LTS、Python 3.5.2 :: Anaconda 4.1.1 (64-bit)に変更しました。

IDEもちょっと探してみたのですが、Pythonの世界にはメジャーなものがいくつもあるようですね。現時点では素人すぎて判断ができないので、まずはUbuntuのテキスト エディターで始めてみます。


第1章: 準備運動


00. 文字列の逆順


文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.


出来上がったコード:


main.py

# coding: utf-8

target = u'stressed'
result = target[::-1]
print(result)

実行結果:


端末

desserts



最終的にシンプルになったのですが、実は逆順というところにハマりました。

[start:stop:step]で指定できるスライスは非常に便利なのですが、stepが負の場合にちょっと混乱します。

スライスで指定するインデックスは、「そのインデックスの要素と、その1つ前の要素の『間』を指している」と考えると理解しやすいと聞いて「なるほど!」と思ったのですが、これは逆順の場合に通用しません。実際にインタプリタで試してみます。


インタプリタ

>>> target = 'abcde'

>>> target[0:4:1]
'abcd'

stepが正の場合、stopで指定したインデックス4は'd'と'e'の間を指すから'd'までが取得できる、という理解で大丈夫です。

しかしstepが負の場合、


インタプリタ

>>> target[4:0:-1]

'edcb'

startで指定したインデックス4で'e'が取得できてしまいます。逆にインデックス0で指定した'a'は取得できません。

スライスで指定するインデックスは、「startに指定するならそのもの、stopに指定するなら(stepで指定する方向における)1つ手前を指す」と理解するのが良さそうです。

なお、今回の問題は最初から終わりまでが対象なので、startもstopも省略すればOKでした。stepが負なら省略時もきちんと前後が入れ替わってくれます。てっきり、stepが負の場合は省略できず、自分で前後入れ替えたものを指定しないといけない!と思い込んで「stopで先頭が指定できない><」とハマってしまっていました。


Python3.xではprint文がprint関数になって括弧が必要になったとのことなので、括弧を付けてみました。バージョンアップでここまで互換がすっ飛ぶような変更が行われるのは新鮮ですね。Pythonなかなか面白そうです^^

最初のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。


(次の問題へのリンクを入れようかと思ったのですが、投稿の度に1つ前の投稿を修正しないといけないため、冒頭に一覧へのリンクを追加することにしました。kisyamanさん、アドバイスありがとうございます。)