2022-04-10 週記

本週六極速「線上」看房,週日極速簽約搞定下半年居所問題。剩下的就是搬家相關的事情了。

專科考試準備進度

通過如下的 dataview 模板,計算以及做了的題目數量,差不多是 1/4 多一些,實在是太落後了。雖然一部分題目通過 space repetition 看了好幾次。目前的策略依然不變,也就是通過記憶卡來避免遺忘(前功盡棄),但是要更加的「專注」於做卡、解卡。

TABLE length(rows) as Number
FROM "Radiology"
WHERE contains(file.name, "CE 20") and category
SORT file.name
GROUP BY true

SM-2 演算法

參考的是如下 repo:Explanation of the SM-2 spaced repetition algorithm。簡單來說,SM-2 算法是包括 Anki 在內的多數閃卡軟體所採用的卡片權重計算機制,用來評估使用者對一張卡片的熟悉程度,據此決定需要在多久時間進行複習以維持最大的記憶效力。

  • q: user grade 使用者自覺熟悉程度,0 最低(完全忘記),5 最高(輕而易舉)
  • n: repetition number 成功複習的次數
  • EF: easiness factor 容易程度 - 越容易,間隔就越久
  • I: interval 下次複習間隔
def SM2(q, n, EF, I):
    if q >= 3:
        if n = 0:
            I = 1
        elif n = 1:
            I = 6
        else:
            I = round(I * EF) # 四捨五入取整數天數
    else:
        n = 0
        I = 1

    EF = EF + (0.1  (5  q) × (0.08 + (5  q) * 0.02))
    EF = 1.3 if EF < 1.3 else EF

    return (n, EF, I)

大概就是根據熟悉程度決定分數以及下次複習間隔,然而最關鍵的 EF 分數調整我還是沒有看懂為什麼那樣設計。Obsidian 的 spaced repetition 相對簡化了許多(答題只有難、中、易三個選項)。我自己是如果完全忘了會選擇重置進度(reset)。下面的 TypeScript 是此插件的核心部分算法:

  • Easy(綠):ease + 20
  • Good(藍):ease 分數不變
  • Hard(紅):ease - 20(最低 130)

然後據此重新計算 interval 間隔天數。

if (response === ReviewResponse.Easy) {
    ease += 20;
    interval = ((interval + delayBeforeReview) * ease) / 100;
    interval *= settingsObj.easyBonus;
} else if (response === ReviewResponse.Good) {
    interval = ((interval + delayBeforeReview / 2) * ease) / 100;
} else if (response === ReviewResponse.Hard) {
    ease = Math.max(130, ease - 20);
    interval = Math.max(
        1,
        (interval + delayBeforeReview / 4) * settingsObj.lapsesIntervalChange
    );
}