幼稚園のクラスでは、植物を育てることについて学んでいます。 先生は、クラスの子どもたちに種を渡し、土に植えて育ててもらうのがよい考えだと思いました。 そこで、子どもたちは窓辺に小さなカップを並べ、それぞれのカップに1種類ずつ植物を植えました。 子どもたちは、用意された4種類の種、grass・clover・radishes・violetsの中から、好きなものを選びました。
この課題では、図をもとに、幼稚園のクラスのどの子どもがどの植物を担当しているかを判定します。
クラスには12人の子どもがいます:
4種類の種が植えられています:
| 植物 | 図での表記 |
|---|---|
| Grass | G |
| Clover | C |
| Radish | R |
| Violet | V |
それぞれの子どもには4つのカップが与えられ、各列に2つずつ置かれます:
[window][window][window]
........................ # each dot represents a cup
........................
先生は、子どもたちの名前のアルファベット順にカップを割り当てます。つまり、Aliceが最初で、Larryが最後になります。
次の図は、Aliceの植物を表す例です:
[window][window][window]
VR......................
RG......................
窓に一番近い1列目には、violetとradishがあります。 2列目にはradishとgrassがあります。
プログラムには、窓に一番近い列から始めて、左から右へと植物が与えられます。これをもとに、どの植物がどの子どものものかを判定できるようにします。
たとえば、庭が次のようになっているとします:
[window][window][window]
VRCGVVRVCGGCCGVRGCVCGCGV
VRCCCGCRRGVCGCRVVCVGCGCV
このとき、Aliceの植物を尋ねられると、次のように返します:
一方、Bobの植物を尋ねると、次のようになります:
この演習のテストでは、プログラムをGardenのclassとして実装することが想定されています(classesも参照してください)。
Pythonのクラスに馴染みがない場合は、このReal Pythonのチュートリアルが、始めるにあたっての追加の資料として役立つでしょう。
classには、plantsというmethodを実装してください。このメソッドは、生徒の名前を引数に取り、その生徒に割り当てられた植物名のlistを返します。
次のような庭をつくるとします。
[window][window][window]
VRCGVVRVCGGCCGVRGCVCGCGV
VRCCCGCRRGVCGCRVVCVGCGCV
これはテストではGarden("VRCGVVRVCGGCCGVRGCVCGCGV\nVRCCCGCRRGVCGCRVVCVGCGCV")として表されます。
この表現を扱えるようにするには、classに__init__()という特殊メソッドを実装する必要があります。
__init__()やコンストラクターに馴染みがない場合は、Pythonのドキュメントにあるクラスとインスタンスのオブジェクトに詳しい説明があります。
テストによっては、生徒のlistが__init__()の引数として渡されます。
その場合は、問題文に書かれている12人の生徒の名簿を上書きします。
次の2つの文はどちらも、__init__()メソッドで動作する必要があります。
# Make a garden based on the default 12-student roster.
Garden("VRCGVVRVCGGCCGVRGCVCGCGV\nVRCCCGCRRGVCGCRVVCVGCGCV")
# Make a garden based on a 2-student roster.
Garden("VRCC\nVCGG", students=["Valorie", "Raven"])
1つの方法は、生徒のlistをデフォルト引数にすることです。Pythonのドキュメントでは、関数定義の説明の中でdefault parametersについて詳しく解説しています。