Strona główna » Algorytmy » Artykuły » Ciąg Spójrz i Powiedz
 

Ciąg Spójrz i Powiedz

Definicja

Ciąg Spójrz i Powiedz to nietypowy ciąg, którego kolejne wyrazy powstają poprzez wypowiedzenie poprzedniego wyrazu. Wyraz wypowiada się mówiąc ile jest każdej kolejnej cyfry w wyrazie. Najpierw należy podać ile takich samych cyfr po sobie następuje, a następnie jaka to jest cyfra.

Przykład

Pierwszy wyraz takiego ciągu to 1, a oto kolejne przekształcenia

nWyrazCzytamy jako
11jedna jedynka
211dwie jedynki
321jedna dwójka, jedna jedynka
41211jedna jedynka, jedna dwójka, dwie jedynki
5111221trzy jedynki, dwie dwójki, jedna jedynka
6312211...

Ciąg Liczb

Wyrazy tego ciągu można ustawić następująco: 1, 11, 21, 1211, 111221, 312211, 13112221, 1113213211, 31131211131221, 13211311123113112211, ..

Implementacja

Oto przykładowy kod funkcji SpojrziPowiedz(), która przyjmuje jeden argument wyraz - poprzedni wyraz, który wystąpił w ciągu Spójrz i Powiedz. Jeśli nie zostanie przekazana żadna wartość to zostaje zwrócony pierwszy wyraz tego ciągu czyli "1".

  1. string SpojrziPowiedz(string wyraz = "") {
  2.   if (wyraz == "") return "1";
  3.   string nastepny = "";
  4.   char teraz = wyraz[0];
  5.   int ile = 1;
  6.   for (int i = 1; i < wyraz.length(); i++) {
  7.     if (wyraz[i] == teraz) {
  8.       ile++;
  9.     } else {
  10.       nastepny += to_string(ile) + teraz;
  11.       teraz = wyraz[i];
  12.       ile = 1;
  13.     }
  14.   }
  15.   nastepny += to_string(ile) + teraz;
  16.   return nastepny;
  17. }

Na początku funkcji należy sprawdzić czy został podany jakikolwiek argument. Jeśli nie to zwracamy pierwszy wyraz. Rozpoczynamy przeglądanie kolejnych cyfr wybierając pierwszy znak i inicjalizując licznik na wartość 1. Następnie w pętli przeglądamy kolejne znaki. Jeśli natrafimy na taki sam znak jak ostatnio wybrany to zwiększamy licznik. W przeciwnym razie należy dopisać na koniec nowego wyrazu parę licznik × cyfra, zaktualizować wybrany znak i zresetować licznik. Po przejrzeniu wszystkich znaków należy dopisać ostatnią parę i zwrócić nowy wyraz.

Testowanie funkcji

Poniższy fragment kodu wczytuje ile wyrazów ciągu wypisać, a następnie je wszystkie wypisuje. Użycie funkcji polega na pobraniu pierwszego wyrazu, a następnie jego aktualizowaniu poprzez użycie tej samej funkcji SpojrziPowiedz().

  1. int main() {
  2.   int n;
  3.   cout << "Ile wyrazow wypisac?\n n = ";
  4.   cin >> n;
  5.   string teraz = SpojrziPowiedz();
  6.   cout << teraz << endl;
  7.   for (int i = 1; i < n; i++) {
  8.     teraz = SpojrziPowiedz(teraz);
  9.     cout << teraz << endl;
  10.   }
  11.   system("pause");
  12.   return 0;
  13. }