トラック
/
Go
Go
/
演習
/
連続部分文字列
連続部分文字列

連続部分文字列

初級

説明

数字の文字列が与えられたとき、その文字列の中にある長さnの連続した部分文字列を、現れる順にすべて出力します。

たとえば、文字列"49142"には、次の3桁の並びがあります。

  • "491"
  • "914"
  • "142"

また、次の4桁の並びもあります。

  • "4914"
  • "9142"

そして、5桁の文字列から6桁の並びを求めようとしたなら、何が返ってきても仕方ありません。

なお、これらの並びは、入力の中で_隣り合った位置_にあればよいだけで、数字が_数的に連続している_必要はありません。

実装

関数を2つ定義します。(2つ? そう、ときにはGoにもう少し多くを求めることもあります。)

Allは、sの部分文字列のうち、長さがnのものをすべて集めた配列を返します。

All(n int, s string) []string

UnsafeFirstは、sの部分文字列のうち、長さがnの最初のものを返します。

UnsafeFirst(n int, s string) string

ここまでで、この演習は完了したと考えて先に進んでもよいでしょう。

でも待ってください。もっともな疑問が浮かぶかもしれません。なぜこの関数はUnsafeFirstという名前なのでしょうか? 興味があれば、この先のおまけの演習を読んでみてください。

おまけの演習

go testが通るようになったら、go test -tags asktoomuchを試してみましょう。 これは_ビルドタグ_を使って、それまで有効になっていなかったテストを有効にします。 ビルドタグを使うと、パッケージが使うファイルを選べます。 ここでは、どのテストファイルを使うかを制御します。 詳しくはGoのドキュメントを読んでみてください。

この_asktoomuch_テストを通らせるのは無理だと気づくかもしれません。 場合によっては、文字列の先頭からN文字を取り出せないことを伝える方法が必要です。 UnsafeFirstは文字列しか返さないので、それができません。

これを解決するには、関数にもう1つ戻り値を追加してみましょう。 First(int, string) (first string, ok bool)を定義して、go test -tags firstでテストしてみましょう。

2番目の戻り値であるok boolは、Goでよく使われるイディオマティックなパターンです。 たとえば、マップの参照や型アサーションで見られます。

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Go Exercism

連続部分文字列を始める準備はできましたか?

Exercismに登録すれば、34個のコンセプト165個の演習、そして本物の人間によるメンタリングとともに、Goを学んでマスターできます。すべて無料です。