Anagram wyrazu "pora" w C++ - przetłumaczenie kodu na Pascala

0

Witam serdecznie jestem amatorem.
Uczę się programowania w języku pascal w książce mam temat anagramy i zadanie typu wypisz wszystkie anagramy dla wyrazu pora jest 24
w książce mam przykład w języku c++
Moje pytanie czy mógłby mi ktoś pomóc albo przetłumaczyć ten kod z c++ na pascal ?
Umiem jedynie obrócić wyraz pora na arop z wykorzystaniem lenght i downto

#include <iostream>

using namespace std;
int main(int argc, char** argv) {
	
	char napis[5]="pora";
	
	int i1,i2,i3,i4;
	for(i1=0; i1<4; i1++)
	{
		for(i2=0; i2<4; i2++)
		{
			if (i1==i2) conitue;
			for (i3=0; i3<4; i3++)
		
		{
			if(i3==i1 || i3==i2) continue;
			i4=6-i1=i2=i3;
			cout<< napis[i1] << napis[i2] << napis [i3] << napis[i4] << endl;
		}
		}
		
	}
	
	
	return 0;
}
0

Nie znam C++, ale tutaj widze zwykłą pętlę oraz if'y, więc nie wiem w czym problem. Ale dla Anagramó znam taką metodę, którą kiedyś wywooglowałem i skleciłem w taki kod jak w programie z kodem pod Delphi 7 i exekiem, w załączonym archiwum rar. Kod może nie jest idealny, bo pisany na szybko, ale przynajmniej anagram tworzony jest logicznie poprzez rekurencje. Dla słowa pora też mam 24 anagramy. Może to wykorzystasz, a jeśli koniecznie chcesz mieć tłumaczenie, to pewnie ktoś lepiej obyty z C++ przetłumaczy to Tobie na Pascala.

0

Niestety za bardzo nic z tego nie rozumiem no niby jest jak widać w tym kodzie co zalaczylem kilka pętelek ale nie wiem jak je skleić w pascalu

2

Nie no, serio? Przecież te sensowne języki (jak C++, java) naprawdę łatwo się czyta (chyba, że ktoś wrzuci lambde w template albo inne cuda na kiju). Poza tym to przydatna umiejętność, czytanie i rozumienie (do pewnego stopnia) języków, których się nie zna.

1

@zwolo17 - masz przetłumaczony (dosłownie) program:

program Anagram;
var
  napis: array [0 .. 3] of Char = 'pora';
  i1, i2, i3, i4: Integer;
begin
  for i1 := 0 to 3 do
  begin
    for i2 := 0 to 3 do
    begin
      if i1 = i2 then
        Continue;

      for i3 := 0 to 3 do
      begin
        if (i3 = i1) or (i3 = i2) then
          Continue;

        i4 := 6 - i1 - i2 - i3;
        WriteLn(napis[i1], napis[i2], napis[i3], napis[i4]);
      end;
    end;
  end;

  ReadLn();
end.

Ale wygląda potwornie i nie jest uniwersalny, więc wymaga skasowania i napisania od nowa, bo ten zamysł wymusza użycie n-1 zmiennych (iteratorów) i pętli, gdzie n to ilość znaków słowa wejściowego; Masakra...

Tego typu algorytm powinien przyjmować słowa dowolnej długości i posiadać uniwersalny mechanizm; @olesio ma sposób rekurencyjny, ja natomiast kiedyś opracowałem metodę generowania metodą znaczników, która pozwala na obsługę wejściowego słowa o dowolnej długości (przy rekurencji to raczej niewykonalne);

Kod w tym artykule jest trochę powolny, ale mam jego bardzo mocno zoptymalizowaną wersję na dysku i kiedyś zaktualizuję ten artykuł.

0

Wszystko już ogarniam tylko jeszcze jedno pytanie i4 := 6 - i1 - i2 - i3; czemu 6 ? i od czego te 6? i do czego

0

Ten kod jest do d**y, dlatego takie dziwolągi niezrozumiałe wychodzą :]

Dlaczego akurat używana jest cyferka 6 to nie trudno zrozumieć - wystarczy sprawdzić sobie pod debugerem jakie wartości siedzą w iteratorach i1, i2 i i3, w każdej iteracji ostatniej pętli, albo przerobić procedurkę Writeln, aby wyświetlała wartości tych iteratorów:

program Anagram;
var
  napis: array [0 .. 3] of Char = 'pora';
  i1, i2, i3, i4: Integer;
begin
  for i1 := 0 to 3 do
  begin
    for i2 := 0 to 3 do
    begin
      if i1 = i2 then
        Continue;

      for i3 := 0 to 3 do
      begin
        if (i3 = i1) or (i3 = i2) then
          Continue;

        i4 := 6 - i1 - i2 - i3;
        WriteLn(i1:3, i2:3, i3:3, '|':3, (6 - i1 - i2 - i3):3);
      end;
    end;
  end;

  ReadLn();
end.

Na wyjściu dostaniesz teraz to:

  0  1  2  |  3
  0  1  3  |  2
  0  2  1  |  3
  0  2  3  |  1
  0  3  1  |  2
  0  3  2  |  1
  1  0  2  |  3
  1  0  3  |  2
  1  2  0  |  3
  1  2  3  |  0
  1  3  0  |  2
  1  3  2  |  0
  2  0  1  |  3
  2  0  3  |  1
  2  1  0  |  3
  2  1  3  |  0
  2  3  0  |  1
  2  3  1  |  0
  3  0  1  |  2
  3  0  2  |  1
  3  1  0  |  2
  3  1  2  |  0
  3  2  0  |  1
  3  2  1  |  0

Ostatnia kolumna to wynik odejmowania wartości trzech iteratorów od stałej 6, czyli to co ląduje w zmiennej i4; Gdyby użyć innej cyferki niż 6 to zmienna i4 dostawać będzie zły indeks ostatniego znaku i permutacje będą niepoprawne; Po prostu ta cyfra pasuje do obliczeń dla czterech znaków i ona właśnie została użyta;

Jednak ten sposób nie jest uniwersalny, ma na sztywno wbitą długość ciągów wyjściowych, więc takie obliczenia a nie inne trzeba zastosować;

PS: Gdybyś chciał dowiedzieć się tego jak obliczyć wartość stałej dla określonej ilości znaków ciągów wyjściowych to wystarczy użyć prostego wzoru - (n - 1)!, gdzie n to długość ciągów; Jeśli miałbyś generować 5-znakowe permutacje to trzeba by dołożyć jeszcze jedną pętlę oraz zamiast 6 użyć liczby 24.

1 użytkowników online, w tym zalogowanych: 0, gości: 1