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