週次グリッド
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 を引いてください。範囲外の日付はクラッシュの原因となるため、入力形式を信頼してください。
チャレンジ
中級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>' の形式で出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。