Języki programowania cz. 4 – Haskell

advertisement
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
Download