Zadanie 1. Kod Graya

Kod Graya jest to kod dwubitowy niepozycyjnykod niepozycyjnyniepozycyjny, charakteryzujący się tym, że każde dwa kolejne jego słowa różnią się dokładnie jednym bitem. Pierwsze i ostatnie słowa również spełniają tę zasadę.

W 1‑bitowym kodzie Graya występują jedynie dwa słowa: 0 oraz 1.

W 2‑bitowym kodzie Graya występują następujące słowa: 00, 01, 11 i 10.

Jeżeli chcemy rozszerzyć kod Graya o 1 bit, posługujemy się następującym algorytmem:

  1. Do istniejących słów w kodzie Graya dopisz te same słowa, lecz w odwrotnej kolejności (jak w odbiciu lustrzanym).

  2. Na początku pierwszej połowy słów zapisz 0, natomiast na początku drugiej: 1.

Przykład 1

Rozszerzenie 2‑bitowego kodu Graya do kodu 3‑bitowego:

Linia 1. 00 minus zamknij nawias ostrokątny 00 minus zamknij nawias ostrokątny 000. Linia 2. 01 01 001. Linia 3. 11 11 011. Linia 4. 10 10 010. Linia 5. 10 110. Linia 6. 11 111. Linia 7. 01 101. Linia 8. 00 100.

Treść polecenia

Zapisz w wybranej przez siebie notacji (w postaci pseudokodu lub w wybranym języku programowania) algorytm, który wygeneruje n-bitowy kod Graya.

Specyfikacja problemu:

Dane:

  • n – liczba naturalna

Wynik:

  • kod[] – tablica napisów zawierająca słowa n-bitowego kodu Graya

Uwaga!

W zapisie algorytmu możesz wykorzystać tylko operacje arytmetyczne: dodawanie, odejmowanie, mnożenie, dzielenie, dzielenie całkowite, resztę z dzielenia, oraz porównywanie liczb; instrukcje sterujące i przypisania do zmiennych lub samodzielnie napisane funkcje zawierające wyżej wymienione operacje.

Możesz skorzystać z funkcji tablica.dopisz(x), która zwiększa rozmiar tablicy tablica o 1 i w dodanym miejscu umieszcza napis x, oraz funkcji pot(x,y) zwracającej operację podnoszenia liczby x do potęgi y.

Możesz przeprowadzać konkatenację (łączenie) napisów za pomocą wyrażenia +. Przykładowo zapis 0 + 1 będzie oznaczał połączenie tych dwóch napisów i zwróci wartość 01.

Praca domowa

Przedstaw rozwiązanie zadania w postaci programu napisanego w wybranym  języku programowania (C++, Java lub Python).

Rozwiązanie

Do wygenerowania kodu używamy algorytmu zawartego w treści zadania. Stosujemy jedynie dozwolone operacje. Rozwiązanie zapisane za pomocą pseudokodu prezentuje się następująco:

Linia 1. funkcja wygenerujKod otwórz nawias okrągły n zamknij nawias okrągły dwukropek. Linia 2. jeżeli n otwórz nawias ostrokątny znak równości 0 dwukropek. Linia 3. zwróć pustą tablicę. Linia 5. kody ← zainicjuj pustą tablicę. Linia 7. kody kropka dopisz otwórz nawias okrągły cudzysłów 0 cudzysłów zamknij nawias okrągły. Linia 8. kody kropka dopisz otwórz nawias okrągły cudzysłów 1 cudzysłów zamknij nawias okrągły. Linia 10. i ← 2. Linia 12. dopóki prawda wykonuj dwukropek. Linia 13. jeżeli i zamknij nawias ostrokątny znak równości pot otwórz nawias okrągły 2 przecinek n zamknij nawias okrągły dwukropek. Linia 14. przerwij pętlę. Linia 16. dla j znak równości i minus 1 przecinek i minus 2 przecinek kropka kropka kropka przecinek 0 wykonuj dwukropek. Linia 17. kody kropka dopisz otwórz nawias okrągły kody otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły. Linia 19. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek i minus 1 wykonuj dwukropek. Linia 20. kody otwórz nawias kwadratowy j zamknij nawias kwadratowy ← cudzysłów 0 cudzysłów plus kody otwórz nawias kwadratowy j zamknij nawias kwadratowy. Linia 22. dla j znak równości i przecinek i plus 1 przecinek kropka kropka kropka przecinek otwórz nawias okrągły 2 asterysk i zamknij nawias okrągły minus 1 wykonuj dwukropek. Linia 23. kody otwórz nawias kwadratowy j zamknij nawias kwadratowy ← cudzysłów 1 cudzysłów plus kody otwórz nawias kwadratowy j zamknij nawias kwadratowy. Linia 25. i ← i asterysk 2. Linia 27. zwróć kody.

Na początku inicjujemy tablicę kody wartościami 0 oraz 1. Następnie, dopóki nie osiągniemy oczekiwanego rozmiaru kodu Graya, tworzymy kolejne słowa wedle algorytmu. Ponieważ nie uwzględniono w treści zadania żadnych wymagań dotyczących złożoności obliczeniowej, nie bierzemy jej pod uwagę.

Słownik

kod niepozycyjny
kod niepozycyjny

kod niepozycyjny to taki system liczbowy, w którym znaczenie cyfry (wartości) jest niezależne od zajmowanej pozycji w liczbie