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


Автор: DooZ 14.12.2007, 00:10
доброй ночи

помогите решить задачку

есть строка

1 2 k 5 6 7

в строке ГЛАВНОЕ слово это 'k' т.е. отталкиваемся от нее
надо из нее сделать следующие строки:
1 2 k 5 6
1 2 k 5
1 2 k
2 k 5 6 7
k 5 6 7
2 k 5 6
2 k 5
2 k
k 5

изместно всегда только главное слово от которого отталкиваться
но слова из которых все это делать не известны
они могут быть любой длинны например всего 3 слова
тогда пример будет такой:
1 k 3

строки надо получить:
1 k
k 3
все

и т.д.
если 3 слова такого вида:
1 2 k
то всего 1 строка получится
2 k

З.Ы. никаких рандомных вставок делать низя
т.е есть исходное слово типа
1 2 3 k 4
из него получаем СТРОГО
1 2 3 k
2 3 k
2 3 k 4
3 k
3 k 4
k 4

все

Автор: DooZ 14.12.2007, 01:55
фух сделал

делал на коленке, лиж бы работало
может кому понадобится
так же приветствуются доработки по оптимизиции, и сокращению кода

Код

#!/usr/bin/perl -w

use strict;

my $string="1 2 k 5 6 7";
my $keyword="k";
my @result;
my %result;

push(@result, $string);
my $str=$string;

    while (1)
    {
        while (1)
        {
        $str=replace($str, 0);
        last if (!$str || $str eq "");
        push(@result, $str);

        my $s=$str;

            while(1)
            {
            $s=replace($s, 1);
            last if (!$s || $s eq "");
            push(@result, $s);
            }
        }

    $str=$string;

        while(1)
        {
        $str=replace($str, 1);
        last if (!$str || $str eq "");
        push(@result, $str);

        my $s=$str;

            while(1)
            {
            $s=replace($s, 0);
            last if (!$s || $s eq "");
            push(@result, $s);
            }
        }

    last;
    }

    foreach my $result (@result)
    {
    $result =~ s/^[\s\t\r\n]+//;
    $result =~ s/[\s\t\r\n]+$//;
    chomp($result);
    next if (!$result || $result eq "");
    $result{$result}++;
    }

    foreach my $result (sort keys %result)
    {
    $result =~ s/^[\s\t\r\n]+//;
    $result =~ s/[\s\t\r\n]+$//;
    chomp($result);
    print "$result\n";
    }


sub replace
{

my $str=$_[0];
my $step=$_[1];

$str =~ s/^[\s\t\r\n]+//;
$str =~ s/[\s\t\r\n]+$//;
chomp($str);

    if ($step==0)
    {
    return if ($str =~ /^$keyword/i);
    $str =~ s/^[^\s]+//;
    }

    if ($step==1)
    {
    return if ($str =~ /$keyword$/i);
    $str =~ s/[^\s]+$//;
    }

return $str;

}

Автор: AlexPet 14.12.2007, 10:09
Код

my $str = "1 2 3 4 k 5 6";
my $k = 'k';
my @arr = split(/ /, $str);

my $i = 0;
my $j;
map { $j = $i if $_ eq $k; $i++; } @arr;
print "@arr\n";
for (my $i1 = 0; $i1 <= $j; $i1++) {
        for (my $i2 = $#arr; $i2 >= $j; $i2--) {
                if ($i1 != $i2 && ($i1 > 0 || $i2 < $#arr)) {
                        my @curarr = @arr[$i1..$i2];
                        print "@curarr\n";  #здесь вместо вывода можно вставить заполнение нужной Вам структуры
                }
        }
}

Это если я правильно понял смысл задачи

Автор: DooZ 14.12.2007, 12:20
2AlexPet да все верно smile
спасибо за пример smile

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