Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Надо изменять строку


Автор: Kefir 21.9.2005, 08:17
Передо мной поставлена следующая задача:
# язык Perl;
# ввод и вывод в текстовом режиме (STDIN/STDOUT);
# входные данные: произвольная строка символов (только печатные символы и пробелы);
# на выходе: анимированная строка с решением.
В итоге должно получиться http://www.ebeling.ee/flash/test.swf.
Т.е. буквы выводятся в адфавитном порядке, но проблема не в этом. Это-то просто. А вот как осуществить само "ползание" по строке? Буду благодарен за всю инфу!

Автор: chaos 21.9.2005, 14:33
почитай сдесь
http://forum.vingrad.ru/index.php?showtopic=58940&view=findpost&p=471466

Автор: korob2001 21.9.2005, 21:57
Я что-то не понял, ты хочешь организовать всю эту визуализацию в окне командной строки? Если да, то вот написал тебе хороший повод для размышления. smile
Код

#!/usr/bin/perl -w
use strict;
use Time::HiRes qw( sleep );

########################################################################################
#                                  Настройки                                           #
########################################################################################
my $str   = "H E L L O  W O R L D"; # Строка может содержать произвольные символы
my $ind   = "*";                    # Символ, который будет перемещаться при поиске
my $delay = 0.05;                   # Задержка в секундах (можно указать значение типа double)
my $clear = "cls";                  # Команда очистки экрана, по умолчанию cls (Windows)

########################################################################################
#                                 Рабочий код                                          #
########################################################################################
my($pos,$back,@chars,$res)=(0,0,(),"");
@chars = sort { $a cmp $b } split(/\s+/, $str);
$res = " " x length( $str );
while ( my $char = shift @chars ) {
    while ( 1 ) {
        my $res2 = $res;
        @chars ? substr($res2, $pos, 1, $ind) : substr($res2, $pos, 1, $char);
        system($clear);
        print "$str\n$res2\n";
        if ( ( index($str, $char, $pos) == $pos ) and ($char ne substr($res,$pos,1))) {
               substr($res, $pos, 1, $char);
               last;
        }

        if ( $back ) {
             $pos--;
             $back = 0 if $pos == 0;
        } else {
             $pos++;
             $back = 1 if $pos == length($str);
        }
       sleep($delay);
    }
}

Измени переменные настройки таким образом, как тебе больше нравится. Так же следует перед запуском данной программы установить модуль Time::HiRes, он необходим для реализации задержки меньше секунды. Если модуль установлен и ты под виндой, то можно ничего не менять, если же ты под другой осью, то обязательно измени переменную $clear, на команду очистки экрана в твоей оси.
Всю эту бодягу можно ещё здорово оптимизировать: обработать системный вызов, оптимизировать поиск и т.д. Я сейчас сижу над Java, голова совершенно другим забита, да и тебе пойдёт на пользу самостоятельная оптимизация. Но если что-то, конкретное, будет не понятно, спрашивай. Всегда поможем.

Автор: maxim1000 21.9.2005, 22:07
сразу скажу - в perl'е совсем никакой smile, но, может, покажется полезным:
по строке можно ползать
движение влево - символ backspace (0x08)
движение вправо - его нет, есть рисование буквы+движение вправо, так что можно просто рисовать ту же самую букву (т.е. надо будет хранить строку)...
надеюсь, это будет работать и в perl'е
так что, возможно, получится обойтись без очистки экрана...

Автор: Kefir 22.9.2005, 09:13
korob2001, спасибо! работат! (единственное что пришлось поменять - комадну cls на clear, так как сижу на лине). Теперь осталось разобраться что там внутри происходит smile
maxim1000. ну с этим я попозже тоже попробую разобраться. конено, вариант без очистки мне больше импонирует, но в связи со срочностью ситуации пока остаюсь при clear.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)