Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > Perl
Регистрация

Восстановить пароль
Повторная активизация e-mail



Ответ
 
Опции темы
Старый 30.03.2016, 20:23   #1
timcryt
Форумчанин
 
Регистрация: 25.01.2016
Адрес: Москва
Сообщений: 97
Репутация: 10
По умолчанию Оптимизация скрипта на Perl, который генерирует самую короткую программу на языке Brainfuck, выводящую заданный текст.

Я написал программу на Perl, которая генерирует самую короткую программу на языке Brainfuck, выводящую заданный текст. Но скрипт работает крайне медленно, даже для одной буквы не может создать программу (сервер завершает скрипт с ошибкой 504). Как его оптимизировать, оптимизировал как но все равно не получилось.
Вот код программы:
Код:

#!/usr/bin/perl



sub getparam  {
	my $QUERY_STRING = $_[0];
	my $param = $_[1];
	my %FORM;
	my @pairs = split(/&/, $QUERY_STRING);
	foreach (@pairs) {
		($name, $value) = split(/=/, $_);
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/ pack("C", hex($1)) /eg;
		$FORM{$name}= $value;
	}
	return $FORM{$param};
}

sub max_get {
	my $text2gen = $_[0];
	my @text = split'',$text2gen;
	my $linelen = 0;
	my $restr = "";
	my $p = 0;
	foreach (@text) {
		$_=ord$_;
	}
	foreach (@text) { 
		if ($_ > $p)
		{
			for (my $i = $p; $i < $_; $i++) {
				$restr .= "+";
			}
		} else {
			for (my $i = $p; $i > $_; $i--) {
				$restr .= "-";
				$linelen++;
			}
		}
		$p = $_;			
		$restr .= '.';
		$linelen++;
	}
	return $restr;
}

sub isruning {
	my $str2run = shift;
	my $sout = shift;
	my @str2run = split'',$str2run;
	my $dep = 0;
	foreach (@str2run) {
		$dep++ if ($_ eq "[");
		$dep-- if ($_ eq "]");
		return 0 if ($dep < 0);
	}
	return 0 if ($dep > 0);
	my $out = "";
	my $j = 0;
	my $k = 0;
	my $brc = 0;
	my $steps = 0;
	my $len = length($pcode);
	@code=@str2run;
	for ($_ = 0; $_ <= $#code; $_++) {
		if ($code[$_] eq '>') {
			$j++;
			if ($j == 30000) {
				$j = 0;
			}
		}
		if ($code[$_] eq '<') {
			$j--;
			if ($j == -1) {
				$j = 29999;
			}
		}
		if ($code[$_] eq '+') {
			$cpu[$j]++;
			if ($cpu[$j] == 256) {
				$cpu[$j] = 0;
			}
		}
		if ($code[$_] eq '-') {
			$cpu[$j]--;
			if ($cpu[$j] == -1) {
				$cpu[$j] = 255;
			}
		}
		$out .= chr($cpu[$j])if ($code[$_] eq '.');
		if ($code[$_]eq'[') {
			if (!$cpu[$j]) {
				++$brc;
				while ($brc) {
					++$_;
					$brc++ if ($code[$_] eq '[');
					$brc-- if ($code[$_] eq ']');
				}
			} else {
				next;
			}
		} 
		elsif ($code[$_] eq ']') {
			if(!$cpu[$j]) {
				next;
			} else {
				$brc++ if ($code[$_] eq ']');
				while ($brc) {
				--$_;
					if ($code[$_] eq '[') {
						$brc--;
					}
					$brc++ if ($code[$_] eq ']') 
				}
				--$_;
			}
		}
		$steps++;
		return 0 if ($steps > (($len * 8) ** 2) + 100);
	}
	return 1 if $out eq $sout;
	return 0;	
}

sub incstr {
	my $str2inc = $_[0];
	my @str2inc = split'',$str2inc;
	my $len = length ($str2inc);
	$str2inc = "";
	for (my $i = $#str2inc; $i > -1; $i--)
	{
		if ($str2inc[$i] eq '>') {
			$str2inc[$i] = '<';
			last;
		}
		if ($str2inc[$i] eq '<') {
			$str2inc[$i] = '+';
			last;
		}
		if ($str2inc[$i] eq '+') {
			$str2inc[$i] = '-';
			last;
		}
		if ($str2inc[$i] eq '-') {
			$str2inc[$i] = '.';
			last;
		}
		if ($str2inc[$i] eq '.') {
			$str2inc[$i] = '[';
			last;
		}
		if ($str2inc[$i] eq '[') {
			$str2inc[$i] = ']';
			last;
		}
		$str2inc[$i] = '>' if ($str2inc[$i] eq ']');
	}
	foreach (@str2inc) {
		$str2inc .= $_;
	}
	return $str2inc;
} 

sub codegen {
	my $str2get = shift;
	my $max_str = length(max_get($str2get));
	my $pst = "";
	my $rst = max_get($str2get);
	for (my $len = $max_str - 1; $len; $len--)
	{
		$pst = '>' x $len;
		
		while (1) {
			if (isruning($pst, $str2get) == 1) {
				$rst = $pst;
				last;
                        }
			$pst = incstr($pst);
			last if $pst eq '>' x $len;
		} 
	}
	return $rst;
}



read(STDIN, $QS, $ENV{'CONTENT_LENGTH'});
$text2gen = getparam($QS, "text2gen");
$pcode = codegen($text2gen);
$code =
"
<!DOCTYPE html>
<html>
	<head>
		<title>Simple online BFPG</title>
	</head>
	<body>
		<form method=\"POST\" style=\"font-family : Source Code Pro ;\">
			Text to generate: <br />
			<textarea name=\"text2gen\" rows=12 cols=80 style=\"font-family : Source Code Pro ; font-size : small ;\">$text2gen</textarea><br />
			<input type=\"submit\" value=\"generate\" style=\"font-family : Source Code Pro ; font-size : large ;\"><br />
			Generated program: <br />
			<textarea rows=12 cols=80 style=\"font-family : Source Code Pro ; font-size : small ;\">$pcode</textarea>
		</form>
	</body>
</html>
";
print "Content-type: text/html\n\n$code";


Последний раз редактировалось timcryt; 30.03.2016 в 21:02.
timcryt вне форума   Ответить с цитированием
Старый 13.07.2016, 11:49   #2
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 344
Репутация: 199

icq: 639 544 131
По умолчанию

Сколько времени она выполняется и сколько таймаут у сервера?
__________________
KIF Ltd.
http://www.keepitfree.io/
rlib вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу(на языке с++), которая составляет(генерирует) календарь игр SVD102 Помощь студентам 0 08.04.2015 09:19
Определить самую длинную и самую короткую строку файла Jadson Помощь студентам 6 20.07.2012 00:30
Дан текстовый файл f. Получить самую короткую строку файла. larissia Помощь студентам 1 07.06.2012 21:42
Работа с файлами .Найти самую длинную и самую короткую строки. britannia C# (си шарп) 1 03.06.2011 13:45
Pascal создать файл и вывести самую короткую строку mrRastom Помощь студентам 0 01.06.2011 19:42




23:17.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
таргетированный трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru