Zadania - Instytut Informatyki UwB
Transkrypt
Zadania - Instytut Informatyki UwB
Zestaw zadań konkursowych XIV Regionalnego Konkursu Informatycznego Instytut Informatyki UwB 29.03.2014 r. Uwaga: Kody źródłowe oraz skompilowane wersje programów w zadaniach 1 i 4 mają być umieszczone na Pulpicie w katalogu o nazwie „konkurs” i podkatalogach z odpowiednim numerem zadania. Nazwy plików: z1.exe i z1.cpp – program będący rozwiązaniem zadania 1, z4.exe i z4.cpp – zadania 4. Skrypty z zadań 2 i 3 mają być umieszczone w wirtualnym systemie w katalogach odpowiednio /home/rki/wyniki/2 i /home/rki/wyniki/3 Zadanie 1: Stadiony Król Thales, miłośnik geometrii i sportu, zażyczył sobie, aby w każdym mieście państwa wybudowano stadiony sportowe. Zlecił nadwornemu Geometrze, aby przygotował ich plany. Król, na każdy stadion wydzielił działki w kształcie równoległoboków. Zlecił wybudowanie jednego stadionu na każdej działce. Każdy stadion powinien zajmować teren całej działki i mieć oczywiście boisko oraz trybuny dla widzów. W owych czasach większość zawodów sportowych była rozgrywana na boiskach w kształcie rombu, dlatego każde boisko powinno mieć taki kształt. Król, chcąc sprawdzić umiejętności Geometry zażyczył, aby ten zaprojektował stadiony w ten sposób, aby boiska były wpisane w równoległoboki, a boki boisk były równoległe do odpowiednich przekątnych stadionów. Przed rozpoczęciem budów, Król chciał sprawdzić przygotowane plany. Chciał, aby Geometra na podstawie podanych w liczbach wymiernych długości przekątnych stadionów wyliczył długości boków boisk. Dane wejściowe Pierwsza linia zawiera jedną liczbę n (1 ≤ n ≤ 100) oznaczającą ilość miast. Kolejne n linii zawiera po dwie pary liczb naturalnych m (1 ≤ m ≤ 1000) oznaczających kolejno licznik i mianownik długości pierwszej przekątnej stadionu oraz licznik i mianownik długości drugiej przekątnej stadionu. Dane wyjściowe n linii zawierających po jednej parze liczb naturalnych będących licznikiem i mianownikiem długości boków boisk. W odpowiedzi należy podać wartości skrócone, to znaczy np. 8/4 należy zapisać jako 2 1. Przykład: Dane wejściowe 2 500 2 900 3 200 3 500 6 Dane wyjściowe 1500 11 1000 27 Zadanie 2: Nieustający pech firmy AlaMakota Pech nie opuszcza firmy AlaMakota: o zaginionym Czesiu już niewielu pamięta, a nowy Wiesio, który doskonale wywiązuje się ze swoich zadań, spadł z drabiny... Niestety, ostatnio eksperymentował z Głównym Systemem, który teraz co kilka minut restartuje się. A tu nowi pracownicy potrzebują kont w Głównym Systemie. Napraw system i napisz własny skrypt, który umożliwi automatyczne tworzenie konta użytkownika oraz kopiuje do katalogu użytkownika pewne dane z katalogu firmowego. Zadania do wykonania: 1. Napisać skrypt, który jako parametry przyjmuje kolejno: imię, nazwisko, data urodzenia (w formacie rrrr.mm.dd) 2. Skrypt powinien sprawdzić, czy dany użytkownik istnieje w systemie: - jeżeli nie – założyć konto, którego login ma postać: 3 pierwsze litery imienia, 3 pierwsze litery nazwiska, rok urodzenia; utworzyć przy tym katalog domowy użytkownika i założyć hasło zgodne z polityką firmy, tzn. 3 pierwsze litery imienia, rok urodzenia, 3 pierwsze litery nazwiska; w celu zachowania kompatybilności z różnymi systemami login ma składać się tylko z małych liter - jeżeli tak – wypisać stosowną informację na ekran i dodać w nazwie użytkownika miesiąc urodzenia; jeżeli nadal istnieje taki użytkownik – dodać w nazwie dzień urodzenia; jeżeli nadal istnieje taki użytkownik – zakończyć działanie skryptu z kodem wyjścia 100 i wypisać informację o prawdopodobnym błędzie w danych 3. Skrypt kopiuje wszystkie pliki posiadające prawo do odczytu i zapisu z katalogu /home/firma/dane_podstawowe do katalogu domowego użytkownika, pozostałe pliki i podkatalogi pomija 4. Skrypt powinien zawierać obsługę błędów wywołania skryptu w postaci wyświetlenia na standardowym wyjściu komunikatu „Error xx”, gdzie xx oznacza numer błędu: xx=1 zła liczba parametrów xx=2 błędny format daty urodzenia Po wykryciu błędu skrypt powinien zakończyć działanie z kodem wyjścia odpowiadającymi numerowi błędu. 5. Skrypt na koniec powinien zakończyć działanie z kodem wyjścia 0 6. Skrypt nie powinien wyświetlać na ekranie żadnych informacji związanych z wykonywanymi poleceniami (oprócz obsługi błędów, informacji z punktu 2) 7. W pliku system.txt podać zwięzłą informację o dokonanych zmianach w systemie zapobiegających ciągłemu restartowi systemu Przykładowo wywołanie skryptu o nazwie skrypt: sudo ./skrypt Antoni Kraweznik 1939.09.01 Nowo założone konto miałoby login antkra1939, hasło Ant1939Kra, katalog domowy /home/antkra1939. LOGIN DO WIRTUALNEGO SYSTEMU: rki HASŁO DO WIRTUALNEGO SYSTEMU: rki2014 Zadanie 3: Wiesio połamaniec Wiesio dochodzi powoli do siebie, ma tylko problemy ze sprawnym poruszaniem się. Spadając z drabiny złamał wszystkie kończyny. Nie może używać komputera, a funkcje głosowe w Głównym Systemie nie zostały, niestety, zaimplementowane. Szczęściem w nieszczęściu jest Twoja osoba – trzeba wykonać malutkie statystyczne zestawienie rozmiaru plików we wskazanym katalogu. To tylko mały skrypcik, który nie powinien Cię zbytnio zmęczyć... Zadania do wykonania: 1. Napisać skrypt, który jako jedyny parametr przyjmuje nazwę katalogu 2. Skrypt powinien wyświetlić liczbę kolejno małych, średnich oraz dużych plików w katalogu oraz sumaryczny rozmiar plików dla wymienionych kategorii – trzy linie z dwiema liczbami w każdej oznaczającymi odpowiednio liczbę plików i rozmiar sumaryczny w kB 3. Rozmiary dla poszczególnych kategorii są następujące: - mały plik – rozmiar nie przekracza 10 kB (< 10 kB) - średni plik – rozmiar pomiędzy 10 kB a 5 MB - duży plik – rozmiar powyżej 5 MB (> 5 MB) 4. Skrypt powinien zawierać obsługę błędów wywołania skryptu w postaci wyświetlenia na standardowym wyjściu komunikatu „Error xx”, gdzie xx oznacza numer błędu: xx=1 zła liczba parametrów xx=2 katalog o podanej nazwie nie istnieje Po wykryciu błędu skrypt powinien zakończyć działanie z kodem wyjścia odpowiadającymi numerowi błędu. 5. Skrypt na koniec powinien zakończyć działanie z kodem wyjścia 0 6. Skrypt nie powinien wyświetlać na ekranie żadnych informacji związanych z wykonywanymi poleceniami (oprócz obsługi błędów i informacji z punktu 2) Przykładowo wywołanie skryptu o nazwie skrypt: sudo ./skrypt /home/rki/katalog_testowy powinno wyświetlić np.: 12 89 23 91312 6 145398 Zadanie 4: Gwiazdki i pierwiastki Pewien nieszczęsny astronom złym zrządzeniem losu znalazł się ze swą nieodłączną lunetą na bezludnej wyspie. Na swoje szczęście wyspa obfitowała w banany, których obfitość pozwalała mu być spokojnym, że jedzenia mu nigdy nie zabraknie. Zaś dzięki lunecie nie mógł też narzekać na brak zajęcia, bo co noc obserwował gwiaździste niebo i dokonywał obliczeń, w wyniku których powstawały liczby o istnie astronomicznej ilości cyfr. Do perfekcji opanował już pisemne dodawanie, odejmowanie i mnożenie przy pomocy kijka na złotym piasku plaży. Gdyby tak jeszcze umiał w podobny sposób wyciągać pierwiastki… Będąc w domu mógłby z łatwością dokończyć każde z tych obliczeń, bo brakowało w nich jedynie sprawdzenia, czy dana liczba jest kwadratem jakiejś liczby. Niestety nasz astronom za nic w świecie nie mógł sobie przypomnieć jak w zamierzchłych czasach ludzie bez pomocy komputera potrafili wyznaczyć pierwiastek kwadratowy dowolnie dużej liczby przy pomocy prostych operacji arytmetycznych. Zadanie polega na tym, żeby zaimplementować podstawowe operacje arytmetyczne i następujący algorytm dla liczb całkowitych określonych dowolnie długimi ciągami cyfr. Cyfry danej liczby należy pogrupować w pary, rozpoczynając od końca (dla nieparzystej ilości cyfr możemy dodać 0 na początku). Jedna cyfra wyniku będzie się pojawiała dla każdej z tych par cyfr. Rozpoczynamy od pierwszej pary cyfr od lewej i wykonujemy poniższą procedurę dla każdej kolejnej pary: 1. Rozpoczynamy od lewej przepisując najbardziej znaczącą parę cyfr jeszcze nie używaną i dopisujemy je z prawej strony reszty z poprzedniego etapu (w pierwszym kroku nie ma reszty). Innymi słowy, mnożymy resztę przez 100 i dodajemy 2 cyfry. Będzie to bieżąca wartość c. 2. Znajdujemy p, y i x następująco: Niech p będzie częścią pierwiastka aktualnie znalezioną. (W pierwszym kroku, p = 0). Określamy największą cyfrę x taką, że y=(20 * p + x) * x nie przekracza c. Tak określona cyfra x jest następną cyfrą szukanego pierwiastka. 3. Odejmujemy y od c i otrzymujemy nową resztę. 4. Jeśli reszta wynosi zero i nie ma więcej cyfr do spisania, to algorytm jest zakończony a kolejne wartości x układają się w zapis pierwiastka. W innym przypadku wracamy do punktu 1 i kontynuujemy następną iterację. Dane wejściowe Jedna linia zawierająca ciąg następujących po sobie cyfr o długości nie większej niż 255 będący dziesiętnym zapisem pewnej liczby kwadratowej. Dane wyjściowe Linia zawierająca dziesiętny zapis pierwiastka kwadratowego danej liczby. Przykład: Dane wejściowe 152415789666209420210333789971041 Dane wyjściowe 12345678987654321