乱れた台帳を掃除せよ
中段 / 目安 30分
松田さんが眉間にしわを寄せて紙束を差し出してきました。「アルバイトの子が入力した台帳、空白やら『pt』やら混ざっとって…綺麗にしてくれ」。中を見ると " 120pt"、"300 "、"abc" といった調子です。
人が入力した文字列は必ず乱れます。乱れを前提にして、直せるものは直し、直せないものは黙って捨てずに数えて報告する。ここが事務の仕事です。
完成条件
乱れた文字列のリストを受け取り、掃除した結果を返す関数 clean_ledger(rows) を作ってください。
返す値は要素が2つのリストで、次の形にします。
- 1つ目は数値に直せた値を元の並び順のまま並べた整数のリストです
- 2つ目は数値に直せなかった件数の整数です
掃除の規則は次のとおりです。
- 前後の空白は取り除きます
- 末尾や途中に付いた
ptは取り除きます。大文字のPTは今回は考えなくてかまいません - 残った文字がすべて数字なら整数に直します
- 数字にならないものは結果のリストに入れず、件数のほうに1つ数えます。空文字も数字にならないものとして扱います
たとえば [" 120pt", "300 ", "abc"] を渡すと [[120, 300], 1] が返ります。
進め方
白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。
開かずに10分粘って進まないなら、①だけ開けてください。粘る時間そのものには価値がありません。価値があるのは、自分で書いた行が動いた瞬間です。
掃除と判定を1行に詰め込もうとすると、どこで失敗したか分からなくなります。まず整える、次に数字かどうかを見る、最後に振り分ける。3段階に分けて書いてください。
int() にいきなり渡す書き方でも通せますが、その場合は失敗したときの受け止め方を自分で用意することになります。どちらの道を選んでもかまいません。
要件
- clean_ledger(rows) は要素が2つのリストを返すこと
- 1つ目の要素は数値に直せた値を元の並び順で並べた整数のリストであること
- 2つ目の要素は数値に直せなかった件数の整数であること
- 前後の空白と pt を取り除いてから判定すること
- 数字にならないものと空文字は、リストに入れず件数に数えること
入出力例
clean_ledger([" 120pt","300 ","abc"]) → [[120,300],1]
clean_ledger([" 980pt ","pt","","1500"," ","45pt"]) → [[980,1500,45],3]
clean_ledger(["abc","---"]) → [[],2]
clean_ledger([]) → [[],0]ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです
ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
編集 ゆめさく編集部