URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 4233
[ Назад ]

Исходное сообщение
"Разбить массив"

Отправлено Nikolay , 16-Июл-06 20:09 
open (F,"text.txt");
my @fil=<F>;
close F;

Надо полученный массив разбить на n равных частей.
При этом в каждой части слово не должно рваться.


Содержание

Сообщения в этом обсуждении
"Разбить массив"
Отправлено mrwel , 17-Июл-06 05:15 
>open (F,"text.txt");
>my @fil=<F>;
>close F;
>
>Надо полученный массив разбить на n равных частей.
>При этом в каждой части слово не должно рваться.

Ничего не понятно из условия.

Слова в файле как записаны?
А если массив будет из n+1 элемента?


"Разбить массив"
Отправлено Nikolay , 17-Июл-06 15:56 
>>open (F,"text.txt");
>>my @fil=<F>;
>>close F;
>>
>>Надо полученный массив разбить на n равных частей.
>>При этом в каждой части слово не должно рваться.
>
>Ничего не понятно из условия.
>
>Слова в файле как записаны?
>А если массив будет из n+1 элемента?



"Разбить массив"
Отправлено Nikolay , 17-Июл-06 15:58 
>>open (F,"text.txt");
>>my @fil=<F>;
>>close F;
>>
>>Надо полученный массив разбить на n равных частей.
>>При этом в каждой части слово не должно рваться.
>
>Ничего не понятно из условия.
>
>Слова в файле как записаны?
>А если массив будет из n+1 элемента?
Сначала надо посчитать кол-во слов в массиве,
затем кол-во разелить на n, и каждую часть
запихнуть в новый массив или хеш.

"Разбить массив"
Отправлено mrwel , 18-Июл-06 10:18 
>>>open (F,"text.txt");
>>>my @fil=<F>;
>>>close F;
>>>
>>>Надо полученный массив разбить на n равных частей.
>>>При этом в каждой части слово не должно рваться.
>>
>>Ничего не понятно из условия.
>>
>>Слова в файле как записаны?
>>А если массив будет из n+1 элемента?
>Сначала надо посчитать кол-во слов в массиве,
>затем кол-во разелить на n, и каждую часть
>запихнуть в новый массив или хеш.

Допустим в файле 13 слов, а массив должен быть из N = 10.
Какое тут разбиение должно быть?
Можно ведь тупо сделать в первые 9 элементов по одному слову а в 10-ый остальные 4 :)



"Разбить массив"
Отправлено Nikolay , 19-Июл-06 20:08 
>>>>open (F,"text.txt");
>>>>my @fil=<F>;
>>>>close F;
>>>>
>>>>Надо полученный массив разбить на n равных частей.
>>>>При этом в каждой части слово не должно рваться.
>>>
>>>Ничего не понятно из условия.
>>>
>>>Слова в файле как записаны?
>>>А если массив будет из n+1 элемента?
>>Сначала надо посчитать кол-во слов в массиве,
>>затем кол-во разелить на n, и каждую часть
>>запихнуть в новый массив или хеш.
>
>Допустим в файле 13 слов, а массив должен быть из N =
>10.
>Какое тут разбиение должно быть?
>Можно ведь тупо сделать в первые 9 элементов по одному слову а
>в 10-ый остальные 4 :)
Так и хочу. :-)
В реальности будет от 2000 до 4000 слов, и надо разбить
на 2, или 3 или 5 массива.
При этом слова нельзя рвать. Я сделал, но сова рвуться.

use locale;
my ($out_text,$popravka,$stop_len);
my $columns = 75;
my $td = 3;
my $widthtd = int 100/$td+.9;
my $maxlen = 3410;
my $pp = "<p class='par'>";
my $alltext = qq~ ...<a href="/?action=viewtext&id=23" target="win">весь текст</a>~;
my $alltextlen = length $alltext;
open (FILE,"statia.txt") or die ("Error:$!");
while (<FILE>) {
        chomp;
        $i++;
        unless (length) {$_ = "Ўь" };
        next unless length;
        $txt .= "$_ ";
        my @dat = split(/ /,$_);
        for (my $j=0; $j <=@dat; $j++) {
                $self{$i}{$j} = $dat[$j];
#               $self{$i+$j} = $dat[$j];
#       push (@txt0,$dat[$j]);
        }
}
close FILE;
$txt =~ s/Ўь Ўь//g;
$txt = "Ўь$txt";
my $len = $alltextlen + length $txt;

my $koeff = ($len/$td)+1;
for (my $j=0; $j <$td; $j++) {
        $text = substr $txt, $koeff*$j, $koeff;
        $text =~ /(.)$/i; $rex = $1;
        $text =~ s/Ўь/$pp/g;
        print qq~\t<TD valign="top" width="$widthtd%">$text$popravka</TD>\n~;
}
undef $txt; undef $text;
if ($len > $maxlen) {
# $out_text = substr("$out_text",0,$maxlen);
# $out_text = qq~$out_text $alltext~;
# $len = $maxlen;
}

print qq~
<style type="text/css">
<!--
TABLE.text TD { font:normal normal 9pt Arial,Verdana,sans-serif; text-align:justify; }
P.par { text-indent:1em; text-align:justify; margin-top:2pt; }
-->
</style>
<TABLE width="70%" class="text" border="0" cellspacing="16" cellpadding="0">
<TR>
$out_text
</TR>
</TABLE>
~;



"Разбить массив"
Отправлено mrwel , 20-Июл-06 06:03 
Привет!

Допустим у нас есть уже готовый массив слов, длина массива N
@word_array = qw{w1 w2 w3 ... wN};

Есть массив
@dest_array = ();
длиной M < N, каждый элемент которого является массивом строк.

Допустим что N = M*k + O; где O < M; k > 0;

Тогда

$dest_array[i] = {$word_array[i*M], $word_array[i*M+1], ..., $word_array[i*M+M-1]}

Осталось O последних элементов и массива @word_array.
Вот их всех можно засунуть в последний элемент массива @dest_array



"Разбить массив"
Отправлено madskull , 20-Июл-06 10:28 

>>Допустим в файле 13 слов, а массив должен быть из N =
>>10.
>>Какое тут разбиение должно быть?
>>Можно ведь тупо сделать в первые 9 элементов по одному слову а
>>в 10-ый остальные 4 :)
>Так и хочу. :-)
>В реальности будет от 2000 до 4000 слов, и надо разбить
>на 2, или 3 или 5 массива.
>При этом слова нельзя рвать. Я сделал, но сова рвуться.

Можно вот так. Конечно, это только наброски. В принципе, можно попробовать обойтись одним регекспом без цикла. Но лень.


use locale;
open (F,"text.txt");
my @fil=<F>;
close F;

my $n = 3;  # количество частей

chomp @fil;
$_ = join " ", @fil; # весь текст одной строкой
my $cnt = int(s/(\w)\b/$1/g/$n);    # количество слов в одной части
my @result;
s/((?:\w+\s*){$cnt})//, push @result, $1 while --$n;
push @result, $_;


"Разбить массив"
Отправлено mrwel , 20-Июл-06 11:23 
Даа ... я Perl настолько не знаю.

"Разбить массив"
Отправлено madskull , 20-Июл-06 11:50 
>Даа ... я Perl настолько не знаю.

Да здесь все просто :)


use locale;
open (F,"text.txt");
my @fil=<F>;
close F;

my $n = 3;  # количество частей

chomp @fil;
$_ = join " ", @fil; # весь текст одной строкой
my $cnt = s/(\w)\b/$1/g; # количество замен последнего символа каждого слова. т.е количество слов
$cnt = int($cnt/$n);    # количество слов в одной части
my @result;
while ( --$n ) { # обработаем $n-1 частей, в каждой части $cnt слов
  s/((?:\w+\s*){$cnt})//; # найти $cnt слов и убрать их из строки
  push @result, $1 ; # найденное в результирующий массив
}
push @result, $_; # туда же остаток


еще проще, наверное, для понимания и реализации будет создать массив со словами
my @words;
push @words, split " ", $_ for @fil;

и играться с этим массивом.