有句俗話 “不能見樹不見林”,這不僅僅是一句陳詞濫調,而且是錯誤的。真正的問題是你不能見林不見樹。如果你站在樹林(在新西蘭詞彙中是一片灌木的意思)的中間,樹木就會相互遮擋,你能分辨清楚的樹木很少。這種情況在樹木整齊的按行列排布(比如人工松林)時最為突出。本問題是要你來計算當站在人工松林中任意一個點時,你能看清的樹有多少。

只要當一棵樹的樹幹完全沒有被附近的樹木遮擋時你才能看得清楚——也就是說樹幹的兩側都可以看到,而且兩側離那些更靠近你的樹木之間還有一個可以分辨的間隙。同樣,你不可能看到一棵“太細”的樹。 “不太細”和“可分辨間隙”的嚴格定義是相對你眼睛的視角要大於0.01度(你可以認為是用一隻眼睛來觀查的)。上圖中,按照視角的位置,那兩棵白色的樹至少將所有灰色的樹都擋住了。

給定樹木的直徑,以及眼睛的坐標位置,你寫一個程序計算出在這些條件下能看清多少樹。由於網格無限大,坐標原點就無所謂了,所給的坐標值都介於0到1之間。

閱讀全文 »

到老舊的火車站你也許會遇到少數僅存的「車箱置換員」(train swapper),車箱置換員是車站的員工,他的工作是重新排列火車車箱。

當每節車箱 (尤其是裝貨的車箱) 都經過適當的排列之後,火車司機在每個車站卸貨時只需從最後車箱一節一節依序放下即可。

「車箱置換員」的職稱起源於一座位於河畔的火車站,鐵路橫跨在河的兩岸,當船隻要通行時,橋上的鐵路不像其他地方一樣會垂直升起,而是以河中央的橋墩為中心旋轉 90 度,此時船隻可從橋的左右兩旁經過。

另外,首位車箱置換員發現一件有趣的事,當橋在作旋轉時最多可乘載兩節車箱的重量,所以當橋作 180 度的旋轉之後,其上的車箱就被掉換位置了,因此他就能重新排列車箱 (副作用就是車箱前後位置會相反,不過因為車箱被設計成可以前後移動,所以無所謂)。

現在幾乎所有車箱置換員都死光了,鐵路公司必須做車箱掉換的自動化,需要寫一個程式來計算共需置換相鄰的車箱幾次才能使所有車箱依序排好,寫程式的工作就交給你了。

Input Specification

第一列有一個整數表示接下來有 $N$ 組測試資料,每組測試資料兩列,第一列是一個整數 $L$ ($1\leq{L}\leq{50}$),為車箱的長度,第二列為整數 1 ~ L 的一種排列組合,表示車箱的起始位置,最後車箱要依照編號 1 到 L 的順序依序排好。

Output Specification

每一列請輸出 Optimal train swapping takes S swaps.,$S$ 為一整數,表示最少需要做幾次車箱置換的步驟。

Example Input

3
3
1 3 2
4
4 3 2 1
2
2 1

Example Output

Optimal train swapping takes 1 swaps.
Optimal train swapping takes 6 swaps.
Optimal train swapping takes 1 swaps.

許多填字遊戲的玩家很擅長分析回文構詞(anagrams),即相同字母但不同排列順序的不同單字集合,例如:OPTS,SPOT,STOP,POTS 與 POST。然而並非所有單字都有這種特質,不論你怎麼排列也拼不出有意義的單字,這種單字我們稱之為ananagrams,例如QUIZ。

很顯然地,一個單字是否為ananagram取決於我們認識多少單字,你也許會認為ATHENE是一個ananagram,不過化學家們馬上可以找出另一個單字ETHANE(乙烷)。如果我們把所有英文單字都列入考慮的話,這樣會沒完沒了,所以我們就限縮可能的單字集合,例如限定與音樂相關的單字,這樣SCALE(音階)就是一個ananagram(LACES蕾絲不在集合內),而NOTE(音符)有一個對應的單字TONE(音色)。

請你寫一個程式從一組單字集合內找出那些是ananagram。注意,只有一個字母的單字也算是ananagram,因為它們根本就沒辦法被重組。全部的單字不會超過1000個。

閱讀全文 »

Background

在計算機科學領域中,排序(Sorting)佔有重要的地位。分析與實作不同的排序演算法構成資訊領域學習上的一個主要方向,而排序演算法的好壞對程式運算效率更是具有決定性的影響。排序演算法包括最廣為人知的泡泡排序法(Bubble sort)、快速排序法(Quicksort)、平行排序演算法(parallel sorting algorithms)、網絡排序(sorting networks)。本問題要請你寫一個有關排序的程式。

本問題要你寫一個Pascal語言的程式產生器,產生出來的原始碼編譯後要能排序n個數字(一個數值比較器),而n就是你用來寫出該程式產生器的唯一輸入值。你所寫的程式產生器所產生出來的程式碼必需合乎Pascal的語法,語法規則如下:

  • 程式碼第一行為 program sort(input,output);
  • 必需宣告n個整數型態的變數,變數名稱必需選用前n個小寫字母,即(a,b,c,d,e,f)。
  • 用 readln 來讀取所有整數變數。
  • 除了等一下會提到的 writeln 陳述式之外,程式碼只會有 if then else 等陳述式。if 裡面的條件式只能用”小於”,”大於” ( < 與 > 兩者) 來判斷兩個數值的大小,程式的writeln陳述式會剛好有n!個。
  • 程式中剛好只會出現三個分號
    • 程式的開頭:program sort(input,output);
    • 變數宣告:…: integer;
    • readln 陳述式:readln(…);
  • 不能作多餘的變數大小比較,例如程式執行中,當a < b已經決定之後,a與b就不能再比較其大小。
  • writeln 必須各自獨立為一行。
  • 產生的原始碼必須可以編譯、執行。任何合理的數值輸入給程式執行後,其輸入值必須能被排序後印出。

對於不熟悉Pascal語言的朋友,本題目最後面會有完整的範例可供參考。

閱讀全文 »

有些問題很難解,卻可以簡化成簡單的題目,例如解本問題時不必真的建構出一個複雜的地球模型,而只須利用前哥倫布時期的地平說觀念,建立一個長 500 公里、寬 500 公里的正方形平面。

本問題所研究的平面世界中有許多國家正在打仗,這個世界的人民雖然很好戰,同時卻又是絕對的孤立主義者,每個國家都用一堵高高的圍牆 (同時又很薄) 把國境圍起來,用來保護自已的國家並且與其他國家隔離,為了避免能源戰爭,每個國家都有自已的發電廠。

當戰事愈演愈烈、一發不可收拾的時候,他們發射飛彈攻擊其他國家,「SCUD 汎用型淨化破壞兵器 (Sanitary Cleansing Universal Destroyer)」瞄準敵國境內的發電廠,在不傷及性命的情況下癱瘓敵國的運作。

給定一個國家的位置座標 (以國境內建築物與發電場所在位置來表示),以及飛彈瞄準的地點,你必須寫一個程式計算當各國的飛彈摧毀發電廠之後,所有國家陷入停電狀態的總面積為何。

國與國之間互不重疊,另外,各國邊境上的高牆厚度可略忽不計。圍住一國國境的高牆為國家的最短周長 (the minimal-perimeter wall),緊緊圍繞在國內所有建築物與發電廠的周圍,一個國家的面積為高牆所圍往的面積。

每個國家都只有唯一一座發電廠。

國與國之間可能會有不屬於任一國家的空間。

閱讀全文 »

如果一串包含字母或數字的文字由前面讀過來與由後面讀過來都相同的話,則稱為“迴文(a regular palindrome)”,例如 ABCDEDCBA 即是迴文 (a regular palindrome),因為該字串由左邊開始讀與由右邊開始讀是一樣的。

“鏡像字串 (a mirrored string)” 是一種字串,其字串的每一個字元經過反轉 (reverse) 之後 (假若每一字元有其對應的反轉字元),倒著讀與原字串相同。例如 3AIAE 即是一個鏡像文字,因為 A 與 I 為自身的反字元 (reverse),而 3 與 E 互為反字元。

一個 “鏡像迴文字串 (mirrored palindrome)” 是一種字串同時符合迴文字串與鏡像字串的限制,例如 ATOYOTA 即是一個鏡像迴文字串,因為該字串由後面讀過來會與由前面讀過來一樣,且每一個字元經過反轉 (reverse) 之後,其由後面讀過來的結果與原字串相同,畢竟,A、T、O、Y 都是自身的反字元 (reverse)。

所有有效的字元及其對應的反字元如下表所示。

Character Reverse Character Reverse Character Reverse
A A M M Y Y
B N Z 5
C O O 1 1
D P 2 S
E 3 Q 3 E
F R 4
G S 2 5 Z
H H T T 6
I I U U 7
J L V V 8 8
K W W 9
L J X X

注意:0 (數字零) 與 O (字母 O) 被視為相同的字元,所以只有字母 O 才是有效字元。

Input

輸入資料有多列字串,每一列字串長度介於 1 ~ 20 之間,且必定都是有效字元 (如上表),絕不會有非有效字元出現。你的程式必須讀到檔案結尾後中止。

Output

針對每一筆輸入字串,你必須先印出該字串後,再接著印出下列字串中的其中一個。

STRING CRITERIA
-- is not a palindrome. 假如輸入字串既非迴文也非鏡像。
-- is a regular palindrome. 假如輸入字串是迴文但非鏡像。
-- is a mirrored string. 假如輸入字串非迴文但為鏡像。
-- is a mirrored palindrome. 假如輸入字串既為迴文亦為鏡像。

注意:字元 - (dash) 與空白字元是必須的,如上表與下列輸出範例所示。

另外,每一列輸出之後你必須另外再印出一列空行。

Sample Input

NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA

Sample Output

NOTAPALINDROME -- is not a palindrome.

ISAPALINILAPASI -- is a regular palindrome.

2A3MEAS -- is a mirrored string.

ATOYOTA -- is a mirrored palindrome.
 

社會研究組識決定採用一組簡單的參數,用來模擬我國政黨運作的行為,其中一個參數為正整數 h (稱為 “罷會參數 (hartal parameter)”) 用來表示同一個政黨連續兩次罷會的間隔時間,雖然這個參數太過簡略了,但還是可以用來預測政黨罷會所帶來的負面影響。接下來的例子會有清楚的說明:

考慮有三個政黨的情況,假設 $h_1 = 3, h_2 = 4, h_3 = 8$,其中 $h_i$ 為政黨 i (i=1, 2, 3) 的 “罷會參數”,接下來我們摸擬這三個政黨在 N = 14 天內的罷會行為,模擬的情況總是設定第一天為星期日,並且每週的例假日 (星期五與星期六) 不會有罷會的情況。

Days 1 2 3 4 5 6 7
Su Mo Tu We Th Fr Sa
Party 1 x x
Party 2 x
Party 3
Hartals 1 2
Days 8 9 10 11 12 13 14
Su Mo Tu We Th Fr Sa
Party 1 x x
Party 2 x x
Party 3 x
3 4 5

上述的模擬結果顯示 14 天內將罷會 5 天 (第 3, 4, 8, 9, 12 日),而第 6 天沒有罷會是因為該天是例假日星期五,因此可看出兩週的議程已去掉了 5 天。

本問題會給定各個黨政的 “罷會參數” 與總議程的天數 N,你的任務是算出在 N 天內共有多少個工作天因為各政黨的罷會而導致議程延宕。

Input

輸入的第一列為一個用來表示有幾組測試資料的整數 T。

每組測試資料的第一列為整數 N ($7 \leq N \leq 3650$) ,用來表示所模擬議程的天數。下一列為另一個整數 P ($1 \leq P \leq 100$) 表示共有 P 個政黨,接下來的 P 列分別為各政黨的 “罷會參數” (絕不會為 7 的倍數)。

Output

輸出的每一列表示每一組測試資料所模擬出來的罷會天數 (損失多少個工作天)。

Sample Input

2
14
3
3
4
8
100
4
12
15
25
40

Sample Output

5
15

#include <stdio.h>

main()
{
  int i;
  char *suffix[]= { "st", "nd", "rd" };
  char *item[]= { "Unix" , "cat", "sed", "awk", "grep", "ed", "vi"};

  printf("In the beginning, there was nothing.\n");
  for (i= 0; i < 7; i++)
    printf("And on the %d%s day, God created %s. And it was good.\n",
           i + 1, (i < 3) ? suffix[i] : "th", item[i]);
}

神創造了好用的 Unix 工具之後,祂發現 vi 會使人禁不起誘惑而墮落,因為 vi 功能強大,讓人不願意使用 make, dbx, RCS 等完善的工具,反而用了命令列來編譯、printf()來除錯、磁帶備份來當版本控管的手段。

所以上帝下了命令:因為工程師們褻瀆了我所創造的 vi,所以我決定創造 emacs,這是一個功能強大到無法言喻的文字編輯器,至此,工程師們只要用過一次 vi,就必須為此飽受磨難,注意!磨難必定是痛苦的,一路上將會荊棘遍佈哀鴻遍野,工程師必須讀取很多列文字,並告訴我每一列中出現頻率最高的字母為何,及它總出現幾次。

我命令你們遵守我訂下的鐵則:“不要讓你的朋友使用 vi”

Input and Output

輸出的每一列要包含一列輸入中出現頻率最高的所有字母,並顯示出現多少次。

輸出的字母必須按照字母順序來排序,並且所有大寫字母必須擺在小寫字母之前。

Sample Input

When riding your bicycle backwards down a one-way street, if the
wheel falls of a canoe, how many ball bearings does it take to fill
up a water buffalo?
Hello Howard.

Sample Output

e 6
al 7
a 3
Hlo 2

當一數值以十進位表示時,第 k 位數表示 $10^k$ (十進制由右至左編碼,最低有效位數為第 0 位)。例如:

$81307_{10} = 8 \times 10^4 + 1 \times 10^3 + 3 \times 10^2 + 0 \times 10^1 + 7 \times 10^0 = 80000 + 1000 + 300 + 0 + 7 = 81307$

當一數值以二進制表示時,第 k 位數表示 $2^k$。例如:

$10011_2 = 1 \times 2^4 + 0 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 = 16 + 0 + 0 + 2 + 1 = 19$

當一數值以 “斜偏二進制 (Skew Binary)” 表示時,第 k 位數表示 $2^{k+1} - 1$。除了最低非零的位數可能等於2之外,所有數值皆為 0 或 1。例如:

$10120_{skew} = 1 \times (2^5 - 1) + 0 \times (2^4-1) + 1 \times (2^3-1) + 2 \times (2^2-1) + 0 \times (2^1-1) = 31 + 0 + 7 + 6 + 0 = 44$

前十個斜偏二進制 (skew binary) 的數值為 0, 1, 2, 10, 11, 12, 20, 100, 101, 102。(skew binary 在某些領域特別有用,因為它使一數值加上 1 之後,最多只進位一次,但這方面的議題與本題目無關)

Input

輸入檔案有多列,每一列為一整數 n。假如 n=0 代表輸入結束,否則 n 為以斜偏二進制 (skew binary) 表示的非負整數。

Output

對每一個輸入值,輸出它的十進制表示式。n 的十進位值最大可能到 $2^{31} - 1 = 2147483647$。

Sample Input

10120
200000000000000000000000000000
10
1000000000000000000000000000000
11
100
11111000001110000101101102000
0

Sample Output

44
2147483646
3
2147483647
4
7
1041110737

麻將是起源於中國的一種牌戲,類似骨牌並且有許多花色。通常由四個人玩,輪番摸牌棄牌直到有人湊成四個面子 (三個一組的) 和一個雀頭 (兩張相同的)。在各地一副麻將的張數都不大相同,雖然來自美國和日本有許多種玩法,但通常為 136 張和 144 張牌。一副擁有 136 張牌的麻將包括:

筒子 (Dots) :以每張牌有圓圈而命名的,每個圓代表一個外圓內方的古銅幣 (Tong)。在這個問題中,一筒到九筒以 1T、2T、3T、4T、5T、6T、7T、8T、9T 代表。

索子 / 條子(Bams) :以每張牌有竹棒而命名的 (除了一索外),每根竹棒代表一串穿過一百個銅幣的繩子 (Suo)。在這個問題中,以 1S、2S、3S、4S、5S、6S、7S、8S、9S 代表。

萬子 (Craks) :以每張牌代表萬個銅幣而命名的 (Wan)。在這個問題中,以 1W、2W、3W、4W、5W、6W、7W、8W、9W 代表。

風牌 (Wind tiles) :東、南、西、北。在這個問題中,以 DONG、NAN、XI、BEI 代表。

三元牌 (Dragon tiles) :紅中、青發和白皮 (或白板)。Dragon tile 這個詞是 Joseph Park Babcock 在 1920 年出版的書中向美國大眾介紹麻將。最初這些牌的起源與中國科舉 (Chinese Imperial Examination) 相關,紅中意味著你能通過科舉而被任官,青發代表之後家境就會富裕而白皮代表應該作為一個清廉的官員。在這個問題中,以 ZHONG、FA、BAI 代表。

因此現在有 9*3+4+3=34 種牌,每種牌有 4 個,所以總共為 136 張牌。而 144 張麻將還會包括:

花牌 (Flower tiles) :
是一組可自由選擇的牌,每張上面畫著不同的圖。在這問題中我們不考慮這 8 張牌。

麻將是非常複雜的,然而我們幾乎不需要去知道其中的規則就能解決這個問題。面子 (meld) 是將數張牌湊成一組的方法,這裡有三種面子你必須知道 (給已經知道麻將的人:不考慮槓子 (Kong) 的情況)。

刻子 (Pong) :三張相同的牌組成的面子。例如:、。
順子 (Chow) :三張數字連續的牌組成的面子,但這三張牌必須相同花色,且多於三張牌連續是不能組成同一順子的 (除非可以組成一個以上的順子)。顯然地,風牌和三元牌不能組成順子。例如:、。
雀頭 (Eye,或稱將、眼) :有一對相同的牌所組成,然而這種不算是一種面子,通常是最後標準牌型的構成要素。

一位玩家要贏得此牌局需要創作一套標準牌型 (standard mahjong hand),這意味著你的手牌必須由一個雀頭以及數個順子和刻子所組成,但請注意每張牌只能算在雀頭、順子或刻子其中一種。

當手牌只差一張就可以勝利時,這時稱為聽牌 (ready hand),「on the pot」為象徵的說法。當玩家聽牌時代表他正在聽某張牌,例如:

就在聽、和三張牌。
(譯者註:應該沒有人不會打台灣麻將吧?不懂的去咕狗一下吧……被打)

給知道麻將更多的人:不用考慮如「七對子」等特殊胡牌型。

閱讀全文 »