Języki programowania cz. 4 – Haskell Zadania projektowe nr. 2 (2016/17) Zadanie pierwsze (5 pkt.) 1) Dla danej liczby n wyświetlić w postaci listy n-ty wiersz trójkąta Pascala. 2) Dla danej liczby naturalnej n znaleźć sumę wszystkich parzystych elementów ciągu Fibonacciego o wartości mniejszej niż n. 3) Dla danej liczby naturalnej n podaj różnicę pomiędzy kwadratem sum a sumą kwadratów liczb od 1 do n. Dla n = 2 wynik jest następujący: (1 + 2)2 – (12 + 22) = 9 – 5 = 4. 4) Dla danej listy L zawierającej dowolne elementy na których zdefiniowana jest relacja porządku liniowego wypisz listę par [(element, liczba wystąpień), …]. 5) Dla danej liczby naturalnej n wyświetl n-tą liczbę pierwszą. Zakładając, że pierwszą liczba pierwszą jest dwa. 6) Dla danej listy i elementu należy wypisać listę indeksów wszystkich wystąpień elementu na liście. 7) Dla danej listy par współrzędnych kartezjańskich należy zwrócić listę tych par posortowaną wg amplitudy punktu we współrzędnych biegunowych. 8) Dla danej liczby n należy obliczyć listy rozkładu liczby na czynniki pierwsze i unikalne czynniki pierwsze. 9) Dla danych zbiorów w postaci list L i M obliczyć ich różnicę i różnicę symetryczną. 10) Dla danej listy L liczb całkowitych znaleźć najmniejszą liczbę dodatnią podzielną przez wszystkie liczby z L. 11) Dla danych list L i M należy sprawdzić, czy jedna jest permutacją drugiej. 12) Dla podanej liczby n podaj, jeśli to możliwe, trójkę pitagorejską a, b, c taką, że a + b + c=n. Dla n = 12 jest nią odpowiednio: 3, 4, 5 ponieważ 32 + 42 = 52. 13) Dla danej liczby naturalnej n podaj taką liczbę ≤ n, która da się rozłożyć na największą liczbę różnych trójek a, b, c. Takich, że a + b + c = n i z boków o długości a, b, c można zbudować trójkąt prostokątny. 14) Dla danej liczby naturalnej n podaj sumę cyfr liczby równej n!. Dla n = 10, 10! = 10 × ... × 2 × 1 = 3628800, co daje w wyniku: 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27. 15) Dla danej liczby naturalnej n podaj od dla jakiej liczby naturalnej m ≤ n zaczyna się najdłuższy ciąg Collatza. 16) Dla danej liczby naturalnej n podaj sumę cyfr liczby równej 2n. Dla n = 15, 215 = 32768, co daje w wyniku: 3 + 2 + 7 + 6 + 8 = 26. 17) Dla danej liczby naturalnej n istnieje ciąg ułamków od 1/2, 1/3, …, 1/n. Wskaż którego okres w reprezentacji dziesiętnej jest najdłuższy. Dla n = 10, wynikiem jest 1/7= 0.(142857). 18) Dla danej liczby naturalnej n≤ 30000 podaj największą liczbę naturalną ≤ n, która nie może zostać zapisana przy pomocy sumy dwóch liczb obfitych1. 19) Dla danych liczb naturalnych n i m podać n-tą liczbę z porządku leksykograficznego liczb od 0 do m. Przykładowo dla n = 2 i m = 3 wynikiem jest 0132. 20) To samo co w 19 tylko dla 9 < m < 16 należy używać liczb heksagonalnych. Przykładowo dla n = 2 i m = 10 wynikiem jest 012345678A9. 21) Dla danych zbiorów w postaci list L i M obliczyć ich iloczyn i sumę. 22) Dla danej liczby naturalnej n≤ 999 podaj liczbę znaków w jej reprezentacji słownej. Dla n = 345 wynikiem jest 23, z tylu znaków składa się napis „trzysta czterdzieści pięć”. 23) dla danego zbioru w postaci listy L obliczyć jego zbiór potęgowy. 24) Dla danej liczby naturalnej n wyświetl pierwszą liczbę trójkątną (suma kolejnych liczb naturalnych) która posiada więcej niż n dzielników. Np. siódma liczba trójkątna 28 = 1 + 2 + 3 + 4 + 5 + 6 + 7 posiada 6 dzielników: 1, 2, 4, 7, 14, 28. 1 https://en.wikipedia.org/wiki/Abundant_number T. Goluch Języki programowania {C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE} {C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE} 1 25) Dla danej liczby naturalnej n podaj liczbę pierwszą ≤ n, która równa jest sumie składającej się z największej liczby różnych liczb pierwszych. Dla n = 81, wynikiem jest 41. Można ją zapisać przy pomocy sumy 6 liczb pierwszych: 2 + 3 + 5 + 7 + 11 + 13. 26) Dla danej liczby n należy znaleźć liczbę jej dzielników, mniejszych od n, Uwaga: złożoność programu powinna wynosić O(p + k), gdzie p – największy dzielnik n mniejszy od sqrt(n), k – liczba dzielników n. 27) Dla danej liczby naturalnej n podaj wszystkie liczby pierwsze ≤ n dla których każda rotacja ich cyfr nadal jest liczbą pierwszą2. Taką liczbą jest 197 i jej dwie możliwe rotacje: 971 i 719. 28) Dla danej liczby naturalnej n ≤ 5 podaj sumę liczb które mogą zostać zapisane jako suma n-tych potęg swoich cyfr. Dla n = 4 wynikiem jest 19316 = 1634 + 8208 + 9474 = 14 + 64 + 34 + 44 + 84 + 24 + 04 + 84 + 94 + 44 + 74 + 44. 29) Dla danej liczby naturalnej n oraz listy L liczb naturalnych, znaleźć sumę wszystkich liczb naturalnych od 1 do n podzielnych przez przynajmniej jedną liczbę z L. 30) Dla danej liczby naturalnej n znaleźć największy palindrom który można uzyskać z mnożenia liczb n-cyfrowych. Dla n=2 największym palindromem jest 9009 = 91 × 99. 31) Dla danej liczby naturalnej n podaj sumę wszystkich liczb ≤ n, które jednocześnie są palindromami w reprezentacji dziesiętnej i binarnej. Taką liczbą jest 58510 = 10010010012. Przykładowo dla n=10 wynikiem będzie 25=1+3+5+7+9, a ich reprezentacje binarne to odpowiednio: 1, 11, 101, 111, 1001. 32) Dla danej listy par należy zwrócić listę tych par posortowaną wg odległości od punktu (0, 0). 33) Dla danej liczby naturalnej n podaj największą, jeśli istnieje, parę liczb zaprzyjaźnionych a i b takich, że a≤ n, b≤ n. 34) Dla danej liczby naturalnej n oraz listy liczb naturalnych L zwrócić sumę wszystkich liczb mniejszych od n których dzielnikiem jest przynajmniej jedna liczba z listy L. 35) Podwójny pandigital rozmiaru n to liczba w której skład wchodzą cyfry od 0 do n dokładnie 2 razy (zero nie może być na najstarszej pozycji). Przykładowo 5046170132637542 jest podwójnym pandigitalem rozmiaru 7. Dla podanej liczby naturalnej n < 10 podać największy podwójny pandigital rozmiaru n. 36) Podwójny pandigital to liczba w której skład wchodzą cyfry od 0 do 9 dokładnie 2 razy (zero nie może być na najstarszej pozycji). Przykładowo 59046817091326387542 jest podwójnym pandigitalem. Dla danej liczby n zwrócić informację ile istnieje podwójnych pandigitali podzielnych przez n. 37) Niech d(n) oznacza liczbę dzielników n. M(n,k) będzie maksymalną wartością d(j) for n ≤ j ≤ n+k-1. Napisz funkcję obliczającą S(u,k) będące sumą M(n,k) for 1 ≤ n ≤ u-k+1. Przykładowo S(1000,10)=17176. Jaki jest wynik dla S(100000000,100000)? 38) Palindrom 595 możemy zapisać jako sumę kwadratów kolejnych liczb naturalnych: 62 + 72 + 82 + 92 + 102 + 112 + 122. Dla danego n wydrukować wszystkie palindromy mniejsze od n, które możemy zapisać jako sumę kwadratów kolejnych liczb naturalnych. 39) Liczba Lychrel’a to taka liczba dla której nie da się wygenerować palindromu w dowolnie długiej sekwencji ściśle określonych przekształceń. Przekształcenia te polegają na kolejnym sumowaniu liczby z jej kontrliczbą3 i jeśli wynik nie jest palindromem to powtarzanie tych operacji dla kolejno tak pozyskanych sum. Przykładowo 59 nie jest liczbą Lychrel’a bo ciąg przekształceń: 59 → 59+95=154 → 154+451=605 → 605+506=1111 jest kontrprzykładem. Napisz funkcję przyjmującą dwa parametry n x, gdzie n – liczba przekształceń, a to x –kandydat na liczbę Lychrel’a. Funkcja powinna zwracać palindrom powstały z n lub mniej przekształceń liczby x dowodzący, że liczba ta nie jest liczbą Lychrel’a. W przeciwnym przypadku funkcja zwraca informację, że nie udało się znaleźć kontrprzykładu. Uwagi: a. wszystkie funkcje powinny posiadać odpowiedni nagłówek z typem funkcji, b. w programach nie można korzystać z funkcji spoza instrukcji, c. funkcja sort dozwolona jest tylko w zadaniu poniżej. 2 https://en.wikipedia.org/wiki/Circular_prime Kontrliczba to liczba powstała przez odwrócenie kolejności cyfr. Dla 3476576 kontrliczbą będzie 6756743. Dla liczb kończących jednym bądź większą liczbą zer kontrliczba będzie ich pozbawiona na początku. Kontrliczbą 138000 będzie 831. T. Goluch Języki programowania 2 3 {C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE} {C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE} Zadanie drugie (10 pkt.) Napisać program do rozwiązywania rachunku zdań z funktorami negacji (N), koniunkcji (K), alternatywy (A) i implikacji (C) Typ zdania: data Zdanie = Z Char | … - tj. zmienną może być dowolna zmienna z Przykładowe zdanie: (C (N (Z 'p')) (A (K (Z 'p') (Z 'q')) (Z 'r'))) Program powinien: 1) zawierać funkcję: drukuj zdanie – (2 pkt.) dla zadanego przykładu (C (N (Z 'p')) (A (K (Z 'p') (Z 'q')) (Z 'r'))) wyjściem powinno być "(~p => ((p & q) | r))" 2) posiadać funkcję: wypisz_zmienne zdanie – (2 pkt.) dla zadanego przykładu (C (N (Z 'p')) (A (K (Z 'p') (Z 'q')) (Z 'r'))) wyjściem powinno być [p, q, r] (niekoniecznie posortowane, ale unikalne) 3) posiadać funkcję: sprawdz zdanie mapa wartosci – (3 pkt.) dla zadanego przykładu (C (N (Z 'p')) (A (K (Z 'p') (Z 'q')) (Z 'r'))) oraz mapy wartości fromList [('p', False), ('q', True), ('r', False)] wyjściem powinno być False 4) posiadać jedną z funkcjonalności a/b – (3 pkt.) 4a) wykonywać zadania 1-3 dla trójwartościowej logiki Łukasiewicza True/False/Nothing 4b) posiadać funkcję: jest_tautologia zdanie sprawdzającą, czy zdanie jest spełnione dla dowolnego wartościowania zmiennych w formule Projekty realizowane są w grupach 2, 3 albo 4 osobowych grupach projektowych. Nadal obowiązuje podział na grupy z poprzedniego zadania. Ponadto każda podgrupa dostaje indywidualnie przydzielone zadanie pierwsze. Numer zadania dostępny na stronie prowadzącego. Każdy ze studentów przesyła swoją wersję rozwiązanych zadań na adres: [email protected] Proszę koniecznie zatytułować pocztę w następujący sposób: JP_Z2_GX_PY_INDEKS gdzie: GX – X - numer grupy dziekańskiej, przykładowo: 1 - grupa nr. 1 PY – Y numer części projektowej: 3 to Prolog, a 4 to Haskell. INDEKS – sześcioliterowy numer indeksu, przykładowo: 103057 Przykład poprawnie zatytułowanego maila: JP_Z2_G2_P3_103057 – drugie zadanie projektowe z Prologa, studenta z drugiej grupy dziekańskiej o numerze indeksu 103057. T. Goluch Języki programowania {C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE} {C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE} 3