Menu
Coddy logo textTech

週次グリッド

CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 36/56。

カレンダーを表示しましょう。各習慣について、完了した日には X、それ以外の日には . を表示する7文字のグリッドを描画します。

// days = [1, 3, 5]
// 描画結果: X.X.X..

便利なイディオム:グリッドを文字の配列として構築し、その後一度だけString化します。

var slots = Array(repeating: ".", count: 7)
for d in days {
    slots[d - 1] = "X"
}
let row = slots.joined()

days は1から始まります(Mon = 1)が、Swiftの配列は0から始まるため、代入する際には 1 を引いてください。範囲外の日付はクラッシュの原因となるため、入力形式を信頼してください。

challenge icon

チャレンジ

中級

1行の入力を読み込みます。これは habit:day エントリをカンマで区切ったリストです。以前と同様に辞書を構築し、各習慣について1行ずつ(アルファベット順にソートして)以下の形式で出力してください:

<habit> |<grid>| <count>

ここで、grid は7文字の X/. 文字列であり、count はその習慣が実行されたユニークな日数の合計です。

入力が read:1,read:3,read:5,workout:2,workout:4 の場合、出力は以下のようになります:

read |X.X.X..| 3
workout |.X.X...| 2

チートシート

完了した日には X を、それ以外には . を配置した7文字のグリッドを作成します(日は1から始まります):

var slots = Array(repeating: ".", count: 7)
for d in days {
    slots[d - 1] = "X"
}
let row = slots.joined()

自分で試してみよう

var habits: [String: [Int]] = [:]
let ops = readLine()!.components(separatedBy: ",")
for op in ops {
    let parts = op.components(separatedBy: ":")
    let day = Int(parts[1])!
    if !(habits[parts[0], default: []].contains(day)) {
        habits[parts[0], default: []].append(day)
    }
}

// TODO: 各習慣に対して7スロットのグリッドを作成し、'<name> |<grid>| <count>' の形式で出力する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン