Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Надо изменять строку, (не знаю как ещё объяснить) 
:(
    Опции темы
Kefir
Дата 21.9.2005, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



Передо мной поставлена следующая задача:
# язык Perl;
# ввод и вывод в текстовом режиме (STDIN/STDOUT);
# входные данные: произвольная строка символов (только печатные символы и пробелы);
# на выходе: анимированная строка с решением.
В итоге должно получиться так.
Т.е. буквы выводятся в адфавитном порядке, но проблема не в этом. Это-то просто. А вот как осуществить само "ползание" по строке? Буду благодарен за всю инфу!
PM MAIL WWW Skype   Вверх
chaos
Дата 21.9.2005, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



PM WWW   Вверх
korob2001
Дата 21.9.2005, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Я что-то не понял, ты хочешь организовать всю эту визуализацию в окне командной строки? Если да, то вот написал тебе хороший повод для размышления. 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, голова совершенно другим забита, да и тебе пойдёт на пользу самостоятельная оптимизация. Но если что-то, конкретное, будет не понятно, спрашивай. Всегда поможем.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
maxim1000
Дата 21.9.2005, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



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


--------------------
qqq
PM WWW   Вверх
Kefir
Дата 22.9.2005, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



korob2001, спасибо! работат! (единственное что пришлось поменять - комадну cls на clear, так как сижу на лине). Теперь осталось разобраться что там внутри происходит smile
maxim1000. ну с этим я попозже тоже попробую разобраться. конено, вариант без очистки мне больше импонирует, но в связи со срочностью ситуации пока остаюсь при clear.
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.