#!/usr/bin/perl

#
# Получение параметров из командной строки
#
$FirstChar = $ARGV[0];
$LenStr    = $ARGV[1];

#
# Новая генерируемая строка
#
$NewStr = "";

@results = Compare($NewStr, $FirstChar, $LenStr);



#
# Вывод результата вычислений
#
print "$results[1]\n\n";

#
# Функция, которая проверяет наличие совпадений последовательностей символов
#
# Входные параметры:
# 	1 - проверяемая строка 
#	2 - символ, который добавить в конец
#	3 - заданная длина строки
#
# Возвращаемые резутьтаты:
# 	Первый аргумет указывает на результат отработки функции
#		0 - все нормально, можно продолжать дальше
#		1 - есть совпадения
#	Второй аргумент - строка после отработки функции
#
sub Compare {

# объявление локальных переменных
	my ($CompStr);
	my ($EndChar);
	my ($StrLen1);
	my ($StrLen2);
	my ($EndStr);
	my ($i, $j, $k);
	my ($NewChar);
	my (@result);

	$CompStr = $_[0];
	$EndChar = $_[1];
	$StrLen1 = $_[2];


# к исходной строке добавляем последний символ
	$EndStr = $CompStr.$EndChar;

# узнаем текущую длину строки
        $StrLen2 = length $EndStr;

# узнаем максимальную длину последовательности, которая может повторяться
	$k = int ($StrLen2/3);

# цикл, в котором мы перебираем все варианты совпадения
	$i = $k;
	$j = 1;
	while ($i > 0) {
		$Str1 = substr ($EndStr, -$j,   $j);
		$Str2 = substr ($EndStr, -$j*2, $j);
                $Str3 = substr ($EndStr, -$j*3, $j);

# если есть совпадения, то выйти из функции со значением - 1
		if (($Str1 eq $Str2) and ($Str1 eq $Str3)) {
			return (1, $CompStr);
		}

		$i--;
		$j++;
	}

# совпадений нет

	if ($StrLen1 > $StrLen2) {

		$NewChar = int (rand (2));
		@result = Compare ($EndStr, $NewChar, $StrLen1);
		if ($result[0] eq 1) {
			$NewChar = abs ($NewChar - 1);
			@result = Compare ($EndStr, $NewChar, $StrLen1);
			if ($result[0] eq 1) {
				return (1, $CompStr);
			}
		}
		$EndStr = $result[1];
	
	}
	return (0, $EndStr);

}
