梅花雀莊

何震邦的個人網站,通常寫電腦和橋牌相關的文章,未來可能會寫關於日本麻將的東西

polish.club 的花色配色

我的叫牌系統書都是用 mdBook 寫的。最近幾週先拿 polish.club 當試驗場,在版面上做了幾個小改動,改好再推到其他幾本。改動都繞著同一件事:♠♥♦♣ 四個花色符號要在每個主題、每個位置都看得清楚。整份 style.css 只有七十幾行,改動也都是幾行的事,但效果值得記一下。

下面這個 demo 把 mdBook 的五種主題和側欄、表格搬了過來,用的是同一份 CSS。切換主題,勾選「改動前」就能比較。

Natural 1♥

1♥ -
1♠F, 4+♠
1NTNAT NF, 0–3♠, 0–3♥
2♣!(R), FG, 0–3♥, 0–3♠
2♦!TRF, CONST+ 3+♥
2♥PRE, 3+♥
2♠!PRE, 6+♠

紅色依主題調整

原本 ♥♦ 寫死 #d33,淺色底還行,深色底就顯得暗沉。現在用一個 --red 變數,依主題給值:

  • Light 用 #b22,比原本深一點,對白底的對比較好。
  • Coal、Navy、Ayu 三個深色主題用 #f66,深底要亮紅才跳得出來。
  • Rust 是淺褐底,用 #a21。但 Rust 的側欄是深色的,側欄另外給 #f77。

mdBook 的主題靠 JavaScript 切換,沒有 JavaScript 時會照系統偏好退回 Light 或 Coal。所以多一條 @media (prefers-color-scheme: dark) 配 html:not(.js),讓沒腳本的深色模式也拿到亮紅。

側欄的黑花色

♠♣ 原本 color: var(--fg),用的是內文的前景色。在 Rust 主題下,內文 --fg 是深色,側欄背景也是深色,側欄裡的 ♠♣ 就幾乎看不見。 Demo 切到 Rust 再勾「改動前」,「Polish 1♣」和「Natural 1♠」的花色就消失了。

第一版修法是在側欄把 --fg 覆寫成 --sidebar-fg。能看見了,但滑鼠移到連結上、或是目前章節的連結變色時,花色不跟著變,一行字兩種顏色。最後改成側欄的 ♠♣ 直接 color: inherit,跟著連結走;♥♦ 則在 :hover、.active 時把 --red 設成 --sidebar-active。這樣整行連結連花色一起變色,而且不用動 mdBook 自己的變數。

表格

瀏覽器預設把表頭置中,叫牌表格的表頭是「1♥ -」這類叫牌序列,置中反而和下面的叫品對不齊,改成靠左。

叫牌記法也順手統一:叫品之間留空格,對手的叫品加括號,pass 用 -,每一輪用 <br> 分開。有個 fmt.py 幫忙對齊 Markdown 表格,只動兩欄的叫牌表,其他表格留給手排。

網址

檔名原本有 COMP_1、CB_Gladiator、BTUVU 這種縮寫加底線的組合,現在拼成 Competition、CheckbackGladiator、BTUvsUnusual。各開叫下的兩個競叫頁面也合併成一頁。舊網址都在 book.toml 裡設了轉址。

姊妹系統書

在 polish.club 上試好的 style.css,接著推到 Blueberry Precision、Watermelon Dutch、Muscat Walsh 和橋牌入門。沒有共用的 theme 套件,就寫了個 sync-css.sh,把 style.css 的 commit 用 git format-patch 丟給姊妹 repo git apply。作者頁也補上各系統的 favicon 連結。

萬年曆與八字命盤

最近做了兩個跟日期有關的小工具:日常・萬年曆和八字命盤。 都是繁體中文網頁,打開就能用,不用安裝或註冊,手機也可以操作。

日常・萬年曆

想知道某一天是農曆幾月幾日,或是今年的農曆生日落在西曆哪一天,可以用這個 萬年曆查詢。支援西元 1801–2100 年,月曆上並列西曆與農曆, 點選日期可以看干支年、生肖、節氣和節慶;「查詢換算」也能從農曆反查西曆,包含閏月。

除了日期,還並列清朝/民國紀年與日本年號,方便對照不同的紀年方式。 其中日本 1873 年以前的年號是西曆推算,沒有還原日本舊曆的年界與改元日。

二十四節氣另外有全年一覽,採用日本國立天文台的資料,以 UTC+8 顯示到分鐘。 月曆也收錄台灣常見節日與部分世界節慶,不過節慶不等於放假,這裡沒有計算補班補假。 選好日期後,複製網址就可以分享同一天。

八字命盤

八字命盤則是輸入出生日期、時間與性別,就能排出年、月、日、時四柱, 以及十神、藏干、納音、十二長生、空亡等資料。下方有格局、胎元、命宮、身宮, 也列出起運時間與各步大運,展開大運可以看流年,年齡以虛歲表示。

另外放了依日主排列的十神對照表和五行生剋圖,方便一邊看命盤,一邊對照彼此的關係。 格局依《子平真詮》的月令取格方式判定,目前只處理正格。

子時有兩種設定可以切換:「23:00 起算隔日」與「早晚子時」,後者在晚子時不換日柱。 輸入內容與設定也會保存在網址裡,可以收藏或分享同一張命盤。

兩個工具都固定使用台灣標準時間 UTC+8,支援 1801–2100 年,不還原歷史夏令時間; 八字排盤也不校正真太陽時。萬年曆的節氣時刻取自天文台表,八字則使用 lunar-javascript 的演算法,出生時間若恰好在節氣交接附近,排盤結果可能與其他曆書不同。

農曆換算與八字排盤使用的套件是 lunar-javascript,計算都在瀏覽器裡完成。 兩個專案的原始碼也都以 MIT 授權公開:calendar、bazi。 歡迎試用!

費氏數列計算機

n =

Fn =  

東方風格的圖示

將棋裡有個 ♣

將棋棋駒的圖樣由 peanatsu 製作,為 lishogi 上的 Western 樣式,採用 CC BY-SA 3.0 授權。

梅花字樣來自思源黑體 (Noto Sans TC)。

答叫人的 Truscott 3NT 及 Rubens

打 FunBridge 看到 Argine(電腦)有一個約定很有趣,想分享一下。

1M-(X)-3NT = 有配合但滿貫興趣極低(我覺得也可以極高),通常不會是平均牌 3 張支持。

有點類似 Truscott 但是 3NT 也打這個。因為如果真的是 3NT 的牌,會選擇 XX。所以 3NT 也拿來 forcing raise。

不過多想一步,既然不需要自然無王的話,那無王就是一種 cuebid。我更喜歡一不做二不休,1NT 到 3M 之間打 Rubens!

1M-(X)-
1NT..2M = 轉換到下一門,5+ 張
2NT..3M = 轉換到下一門,迫局 6+ 張或竄叫 7+ 張
3NT = FG raise

波蘭 1♣-1♦ 裡面不建議擺不平均邀請

目前公版波蘭梅花的 1♣-1♦ 裡面最強的牌是低花 5+ 4+ 的邀請,大約 9–11 HCP。這些牌的形狀太強,而且我方高花張數很少,應該馬上叫到 2♠ 附近的線位,避免被對手的 8–9 張高花配合捷足先登。如果是 22(54) 還可以當成平均牌。但是 (31)(54) 的話,因為如果同伴是低限牌,最多只會有 4 張高花,此時對手必在此高花短門上有配合。

提案

1♣-1♦ = 負性、不迫叫、0–9 HCP
1♣-2♠ = 邀請、無 4 張高花、通常無 6 張低花

和波蘭梅花 2020 相比,這個提案只是把不平均邀請從 1♦ 移到 2♠。既然無王莊位都要推走了,那麼 1♣-2♠ 就不需要平均牌、適合當莊的性質。

讓 1♣-1♦ 限縮在 0–9 HCP 的範圍內,面對 1♣-1♦-(*) 的競叫,開叫人幾乎只有 18+ HCP 才需要行動,連 15–16 HCP 的自然梅花都可以拋棄。此外,開叫人持低限 3244 甚至 3343 時可以 P 掉 1♦ 叫出最長牌組,而不是硬叫 3 張高花。

波蘭梅花 2020

1♣-1♦ = 負性、不迫叫、0–11 HCP
1♣-1NT = 自然、7–10 HCP、無 4 張高花
1♣-2♠ = 平均牌邀請、無 4 張高花
1♣-2NT = 平均牌迫局、無 4 張高花

1♣-2NT 不是自然邀請?

早在波蘭梅花 2005,他們就發現 1♣-3NT 不能像自然制一樣把沒有 4 張高花的平均牌都擺進去。因為開叫人可能有 18+ HCP 及 5 張高花,如果不知道答叫人是否有 3 張高花,會錯失高花滿貫。因此當時就開始把 1♣-3NT 特化為 33(43) 的選擇成局,再把其他平均牌下壓一線。

波蘭梅花 2005

1♣-3NT = 迫局低限的 33(43)
1♣-2NT = 平均牌迫局
1♣-1NT = 平均牌邀請、9–11 HCP

波蘭梅花 2005 引入較多特約,例如 Bubrotka 等,是個比較人為的版本。在 2010 年版,不少約定被改回比較自然的版本,幾經波折才變成現在的樣子。

時拉比ex 渴望 3 顆能量

在寶可夢卡牌手遊(Pokémon TCG Pocket, ポケポケ)當中,時拉比ex 的招式是強力綻放。這個招式需要 2 顆以上的能量,每顆能量擲一次硬幣,每次正面就能造成 50 點傷害。由於連續投擲硬幣是獨立白努力試驗,所以結果會遵循二項式分布。

由於招式的隨機性,時拉比ex 沒有絕對的斬殺線,不過仍然可以推論 50% 斬殺線。常打橋牌的我發現一件事情,那就是奇數枚硬幣才能提高 50% 斬殺線,進而推論出

  • 第 3 顆能量的重要性高於第 4 顆
  • 需要 2 顆能量才能發動是重要的限制。如果 1 顆就能發動,會顯著增強時拉比ex。

投擲 2–4 顆硬幣的機率分布

以下以 🔴 表示硬幣的正面,⚫ 表示反面。

2 顆硬幣

硬幣 機率 累積機率
🔴🔴 1/4 = 25% 25%
🔴⚫ 2/4 = 50% 75%
⚫⚫ 1/4 = 25% 100%

3 顆硬幣

硬幣 機率 累積機率
🔴🔴🔴 1/8 = 12.5% 12.5%
🔴🔴⚫ 3/8 = 37.5% 50.0%
🔴⚫⚫ 3/8 = 37.5% 87.5%
⚫⚫⚫ 1/8 = 12.5% 100.0%

最明顯的改變是 50% 斬殺線來到 100 也就是 2 個正面。投擲奇數枚硬幣才會五五開。投擲 2N 枚硬幣的話,N 個正面的情況會卡在中間,導致累積分布不會出現 50%。

4 顆硬幣

硬幣 機率 累積機率
🔴🔴🔴🔴 1/16 = 6.25% 6.25%
🔴🔴🔴⚫ 4/16 = 25.0% 31.25%
🔴🔴⚫⚫ 6/16 = 37.5% 68.75%
🔴⚫⚫⚫ 4/16 = 25.0% 93.75%
⚫⚫⚫⚫ 1/16 = 6.25% 100.00%

可以看到 50% 斬殺線維持在 2 個正面,不過累積機率提升到 68.75% ≈ 69%。這裡的機制和閃電鳥ex 一樣。由此可見,如果想要 2 個正面,其實不太需要第 4 顆能量。

不過如果在逆風局,想要賭 3 個正面,第 4 顆能量就變得重要了,累積機率翻了 3 倍。當然有 5 顆能量更好,但實務上通常來不及累積這麼多能量,相較之下更期待能量翻倍的君主蛇成形,或者由椰蛋樹ex 在前排保護。

1 顆硬幣

硬幣 機率 累積機率
🔴 1/2 = 50% 50%
⚫ 1/2 = 50% 100%

最後我們考慮一個假想的情況,也就是假設時拉比ex 只要 1 顆能量就能出擊。此時的 50% 斬殺線跟 2 顆能量一樣是 50 也就是 1 個正面。因為太過 OP 所以才設計成 2 顆能量才能發動。

提前一圈迫叫

與其先叫一個不迫叫叫品,之後再把強牌迫叫出來,不如考慮把迫叫叫品提前一圈。

例如 Gazzilli 的 1M-1NT-2♣,根據 Good, Better, Best 的電腦模擬,並未勝過自然叫品。然而如果提前一圈變成精準制 1♣,那就能贏過自然制。同理,波蘭 1♣ 比起自然制的強跳叫是更好的選擇。

迫叫一無王?

在高花開叫之後,1NT 答叫堪稱垃圾筒,處理所有需要答叫但是沒有更好選項的叫品。對於 1NT 要不要 100% 迫叫則是眾說紛紜,例如 Larry Cohen 主張應該打半/不迫叫,也就是開叫人不受邀平均牌可以 P 掉 1NT 答叫。

那麼究竟實際影響如何?根據 Bridge Bidding Analyzer 的模擬,採用迫叫 1NT 與否,對成績沒有影響。

既然迫叫 1NT 跟投資一樣有賺有賠,那麼究竟是哪些牌賺、哪些牌賠呢?從另一篇研究似乎能看出端倪。這裡面提到,假設答叫人持 3 張高花平均牌邀請叫了 1NT,開叫人不受邀時 P 會賺!因為 1NT 通常比 3M 還要好打。於是綜合以上所述,我推論答叫人越強,則 1NT 越可以 P。反之,答叫人越弱,則越需要 F 1NT 來逃離這個糟糕的合約。

  • 如果開叫很受限,例如強梅花制度中的 11–15 HCP 開叫,那麼答叫 1NT 通常有 8+ HCP,就很適合不迫叫。
  • 如果開叫很寬廣,例如自然制的 12–21 HCP 開叫,那麼答叫 1NT 就很適合迫叫來逃離會倒 2 副以上的 1NT。

不過我又想到一個問題,1♥-1NT 跟 1♠-1NT 一定要同進退嗎?在自然的 1♥-1NT 叫序下

  1. 答叫人否認 4 張黑桃,且只在邀請時有 3 張紅心支持
  2. 假設 1♥-1NT 迫叫,開叫人 45(xx) 時需要答叫極破爛的 2–3 張低花,而不是停在看起來門門有擋的 1NT

相反地,在 1♠-1NT 叫序下

  1. 答叫人可能有 5–6 張紅心邀請!雖然 P 不太會掉 4♠,但可能反而掉 4♥
  2. 開叫人不平均牌都有牌組叫。平均牌可以一律叫 2♣ 或者讓低花保證 3 張。我建議這邊比照開叫,如果 4432 要開叫 1♦♣,則 5332 叫成 1♠-1NT-2♦♣。

兩相比較之下,我認為在波蘭梅花乃至於自然制中,應該採取 1♠-1NT 迫叫,而 1♥-1NT 半/不迫叫的策略。

競叫時的 Transfer Walsh

Transfer Walsh 是一種對 1♣ 的答叫,其中 Walsh 指的是有 4 張高花時不答叫方塊的風格。

1♣-
1♦ = 4 張以上紅心
1♥ = 4 張以上黑桃
1♠ = 「轉換」至 1NT,原則上無 4 張高花

我很推薦保證 2 張以上的 1♣ 採用這樣的轉換答叫。不過遇上 (1♦♥) 蓋叫時,若將 X 視為 Transfer Walsh 的 stolen bid,則可以視為負性賭倍的升級版!

1♣-(1♦)-X = 紅心
1♣-(1♦)-1♥ = 黑桃
1m-(1♥)-X = 黑桃
1m-(1♦♥)-1♠ = 轉換至 1NT

開叫人受轉 1M 表示低限 3 張,受轉 2M 表示低限 4 張。換句話說,此時即使對手不叫,我們仍然獲得了 support double 的效果!比起一般的自然制競叫後續,遇到 (1♥) 還能以 X 和 1♠ 區分 4/5 張黑桃,但是面對 (1♦) 則無法同時處理兩種高花的 3-5 及 4-4 配合。約定面對 (1♦♥) 採用 Transfer Walsh 則改善這個問題。

同樣的架構甚至可以推廣到 2 線以上。因為 1♠ 已經具有推莊(無王)的功能,不太需要再另開一個問擋的叫品。所以面對 (1♦♥) 時,扣叫以上可以打 6 張轉換叫,同時容納弱牌與積極邀請以上的強牌。

1♣-(1♦)-2♦ = 6 張以上紅心
1♣-(1♦)-2♥ = 6 張以上黑桃
1m-(1♥)-2♥ = 6 張以上黑桃

當然 3 線也可以如法泡製,但是既然 2♥ 已經處理自然黑桃,可以考慮 2♠ 到 3NT 重新擬定一套架構。超出本文範圍太多,先就此打住。