2010年8月12日 星期四

110 - Meta-Loopless Sorts

Background

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

The Problem

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

  • 程式碼第一行為 program sort(input,output);

  • 必需宣告n個整數型態的變數,變數名稱必需選用前n個小寫字母,即(a,b,c,d,e,f)。

  • 用 readln 來讀取所有整數變數。

  • 除了等一下會提到的 writeln 陳述式之外,程式碼只會有 if then else 等陳述式。if 裡面的條件式只能用"小於","大於" ( < 與 > 兩者) 來判斷兩個數值的大小,程式的writeln陳述式會剛好有n!個。

  • 程式中剛好只會出現三個分號
    1. 程式的開頭:program sort(input,output);

    2. 變數宣告:...: integer;

    3. readln 陳述式:readln(...);

  • 不能作多餘的變數大小比較,例如程式執行中,當a < b已經決定之後,a與b就不能再比較其大小。

  • writeln 必須各自獨立為一行。

  • 產生的原始碼必須可以編譯、執行。任何合理的數值輸入給程式執行後,其輸入值必須能被排序後印出。

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

The Input

輸入的第一列為一整數M,表示有幾組測試資料(每一組測資料表會產生出一份Pascal原始碼),接著會有一空行。接下來會有M組測試資料,每組測試資料僅有一個整數n, 1 $ \leq$ n $ \leq$ 8. 。測試資料之間皆以空行隔開。

The Output

輸出M個Pascal語言的程式原始碼,相鄰的兩份原始碼之間以空行隔開。

Sample Input

1

3

Sample Output

program sort(input,output);
var a,b,c : integer;
begin
readln(a,b,c);
if a < b then
if b < c then
writeln(a,b,c)
else if a < c then
writeln(a,c,b)
else
writeln(c,a,b)
else
if a < c then
writeln(b,a,c)
else if b < c then
writeln(b,c,a)
else
writeln(c,b,a)
end.

沒有留言:

張貼留言