ログアグリゲーター
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 55/56。
チャレンジ
中級アクセスログを処理しています。カンマ区切りの level:user:bytes エントリのリストが含まれる1行の入力を読み取ってください。
一部のエントリは不正であり、スキップする必要があります。bytes を整数として解析できないエントリ、または level が INFO、WARN、ERROR(大文字と小文字を区別)のいずれでもないエントリはスキップしてください。
以下の順序で出力してください:
- 少なくとも1回出現したレベルごとに1行、
ERROR、WARN、INFOの固定順でソートして出力します。各行は<level>: <count> (<bytes>)形式とし、countはそのレベルの有効なエントリ数、bytesはそれらのバイト数の合計です。 Top user: <name> (<bytes>):すべての有効なエントリを通じて合計バイト数が最も多いユーザーを表示します。同点の場合は、名前のアルファベット順で決定します。Skipped: <n>:不正なエントリの数を出力します。
入力が INFO:alice:100,WARN:bob:bad,ERROR:alice:50,INFO:bob:200,DEBUG:cara:10,INFO:alice:75 の場合、出力は以下のようになります:
ERROR: 1 (50)
INFO: 3 (375)
Top user: alice (225)
Skipped: 2自分で試してみよう
let entries = readLine()!.components(separatedBy: ",")
let order = ["ERROR", "WARN", "INFO"]
let validLevels: Set<String> = ["INFO", "WARN", "ERROR"]
// TODO: 各エントリを解析し、不正なものを除外し、レベルごとおよびユーザーごとに集計する。
// 固定された順序でレベルを出力し(出現したもののみ)、トップユーザー、次にスキップされた数を出力する。