Problem sortowania zajmuje ważne miejsce w dziedzinie informatyki. Analizowania i realizacji różnych algorytmów sortowania stanowi ważną część edukacji większości informatyków, a samo sortowanie w różnych wariantach pochłania znaczny procent światowych zasobów obliczeniowych. Wykorzystywane algorytmy sortowania pochodzą z zakresu od popularnego sortowania bąbelkowego, przez sortowanie szybkie i równoległe do sieci sortujących. W tym zadaniu problemem będzie napisanie programu, który utworzy program sortujący (meta-sorter).
Problem
Zadaniem jest stworzenie programu, który produkuje kody programów (w języku Pascal) sortujących n liczb. Kody programów w Pascalu generowane przez Twoje rozwiązanie muszą posiadać następujące właściwości:
• Muszą rozpocząć się wierszem program sort(input,output);
• Muszą zadeklarować przechowywanie dokładnie n zmiennych całkowitych. Nazwami zmiennych musi być n początkowych liter alfabetu (np. dla n=6 będą to a, b , c, d, e, f).
• Pojedynczy readln musi czytać wartości dla wszystkich zmiennych całkowitych.
• Poza tym, w programie powinny pojawić się tylko operacje writeln oraz instrukcje if then else. Wyrażenia logiczne w instrukcjach warunkowych if muszą składać się z jednej ścisłej nierówności (< lub >) oraz dwóch nazw zmiennych. W wygenerowanym kodzie musi się pojawić dokładnie n! operacji writeln.
• W kodzie muszą pojawić się dokładnie trzy średniki
o po nagłówku programu : Program program sort(input,output);
o po deklaracji zmiennych : ... : Integer ;
o po operacji readln : readln ( ... ) ;
• Należy unikać zbędnych porównania wartości zmiennych. Na przykład, gdy w czasie wykonywania programu zostanie ustalone, że a<b, zmienne a i b nie powinny być ponownie porównywane.
• Każda operacja writeln musi pojawić się w wierszu samodzielnie.
• Wygenerowany kod programu musi dać się skompilować. Wykonanie skompilowanego programu z podaniem dowolnego ciągu n liczb na wejściu powinno spowodować, że wartości wejściowe zostaną wydrukowane w porządku niemalejącym.
Dla tych, którzy nie znają składni Pascala, przykład pod koniec tego zadania całkowicie definiuje niewielki podzbiór niezbędnej w tym zadaniu składni.
Wejście i wyjście
Wejście składa się z liczby M kodów programów zapisanej w pierwszym wierszu po którym następuje wiersz pusty. Następnie pojawia się M przypadków, zawierających po jednej liczbie całkowitej 1 ≤ n ≤ 8. Między wierszami opisującymi testy mogą znajdować się puste wiersze.
Wyjściem jest M kodów programów napisanych w języku Pascal, które spełniają kryteria określone powyżej. Wydrukuj pusty wiersz pomiędzy dwoma kolejnymi programami.
1
3
Przykładowe wyjście
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.