Camicia

Camicia

中等

簡介

一個下著雨的午後,你坐在廚房的餐桌旁,和奶奶一起玩牌。 你們玩的是她版本的 Camicia。

一開始,這感覺就像又一場友誼賽:牌啪地甩在桌上,餐桌對面傳來笑聲,Nonna 偶爾露出勝利的笑容。 但隨著遊戲拉長,奇怪的事發生了。 同樣的牌不斷循環回來。 你一張接一張地出牌,卻好像永遠等不到結束。

你開始納悶。 這局牌到底會不會結束? 還是我們可以一直玩下去?

後來,出於好奇,你上網查了一下,驚訝地發現剛才發生的不只是運氣不好。 你和奶奶可能無意間碰上了數一數二長的牌序! 突然間,你著迷了。 原本只是一場隨興的遊戲,如今卻成了一場探索:這種遊戲究竟能持續多久? 你能找到比廚房餐桌上那局更長的牌序嗎? 或許甚至長到能刷新世界紀錄?

於是,你只帶著一副牌和一些演算法上的巧思,決定一探究竟……

說明

在這個練習中,你將模擬一個和經典紙牌遊戲Camicia非常類似的遊戲。 你的程式會收到兩位玩家牌組的初始配置,並且必須模擬遊戲,直到遊戲結束(或是判斷出它永遠不會結束)。

規則

  • 整副牌會分給兩位玩家。 玩家的牌由左至右讀取,最左邊的牌就是牌組的最上面。
  • 一個回合中,兩位玩家都至少會出一張牌。
  • 玩家輪流把自己牌組最上面的牌放到中央牌堆上。
  • 如果這張牌是數字牌(2 到 10),出牌權就直接交給另一位玩家。
  • 如果這張牌是付款牌,就必須支付罰牌:
    • J → 對手必須支付 1 張牌
    • Q → 對手必須支付 2 張牌
    • K → 對手必須支付 3 張牌
    • A → 對手必須支付 4 張牌
  • 如果正在支付罰牌的玩家翻出另一張付款牌,這位玩家就停止支付罰牌。 接著另一位玩家必須依這張新的付款牌支付罰牌。
  • 如果罰牌在沒有被打斷的情況下全部支付完畢,放下最後一張付款牌的玩家就收走中央牌堆,並把它放到自己牌組的最下面。 接著由這位玩家開始下一回合。
  • 如果玩家已經沒有牌、無法出牌(不論是在支付罰牌時,或是輪到他的時候),就由另一位玩家收走中央牌堆。
  • 玩家從中央牌堆收走卡片的這個時刻,就稱為一次收牌。
  • 如果某次收牌之後,所有卡片都在同一位玩家手上,遊戲就結束。
  • 只要牌組的狀態和遊戲先前出現過的某個時刻相同(不計數字牌!),遊戲就會進入循環。

範例

下面是一個會結束的對局的小例子。

回合 玩家 A 玩家 B 牌堆 應付罰牌
1 2 A 7 8 Q 10 3 4 5 6 K 9 J -
1 A 7 8 Q 10 3 4 5 6 K 9 J 2 -
1 A 7 8 Q 10 4 5 6 K 9 J 2 3 -
1 7 8 Q 10 4 5 6 K 9 J 2 3 A 玩家 B:4
1 7 8 Q 10 5 6 K 9 J 2 3 A 4 玩家 B:3
1 7 8 Q 10 6 K 9 J 2 3 A 4 5 玩家 B:2
1 7 8 Q 10 K 9 J 2 3 A 4 5 6 玩家 B:1
1 7 8 Q 10 9 J 2 3 A 4 5 6 K 玩家 A:3
1 8 Q 10 9 J 2 3 A 4 5 6 K 7 玩家 A:2
1 Q 10 9 J 2 3 A 4 5 6 K 7 8 玩家 A:1
1 10 9 J 2 3 A 4 5 6 K 7 8 Q 玩家 B:2
1 10 J 2 3 A 4 5 6 K 7 8 Q 9 玩家 B:1
1 10 - 2 3 A 4 5 6 K 7 8 Q 9 J 玩家 A:1
1 - - 2 3 A 4 5 6 K 7 8 Q 9 J 10 -
2 - 2 3 A 4 5 6 K 7 8 Q 9 J 10 - -

status: "finished", cards: 13, tricks: 1

下面是一個會進入循環的對局的小例子。

回合 玩家 A 玩家 B 牌堆 應付罰牌
1 J 2 3 4 J 5 - -
1 2 3 4 J 5 J 玩家 B:1
1 2 3 J 5 J 4 -
2 2 3 J 4 J 5 - -
2 3 J 4 J 5 2 -
2 3 J 4 5 2 J 玩家 A:1
2 J 4 5 2 J 3 -
3 J 4 5 2 J 3 - -
3 J 4 2 J 3 5 -
3 4 2 J 3 5 J 玩家 B:1
3 4 J 3 5 J 2 -
4 4 5 J 2 J 3 - -

第 4 回合的開頭和第 2 回合的開頭相同。 提醒一下,數字牌的點數並不重要。

status: "loop", cards: 8, tricks: 3

你的任務

  • 根據輸入,依照上面的規則模擬這個遊戲。
  • 判斷這個遊戲的下列資訊:
    • Status:"finished" 或 "loop"
    • Cards:整場遊戲總共出了幾張牌
    • Tricks:中央牌堆被收走的次數
Advanced

想接受更刺激挑戰的人,最長且會結束的遊戲的其他紀錄還在持續尋找中。 總共有 653,534,134,886,878,245,000(大約 654 百萬兆)種可能性,而我們還沒把它們全部算完喔!

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
CoffeeScript Exercism

準備好開始 Camicia 了嗎?

註冊 Exercism,透過 97 個練習 和真人引導來學習並精通 CoffeeScript,全部免費。