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


Автор: dixoNICH 26.10.2011, 19:55
Надо переписать скрипт с питона на перл. Попытался, не получилось smile Питон совершенно не знаю. Помогите, пожалуйста. Вывод должен быть - полный перебор фраз, т.е. ab, ac, ba, bc, abc, cba и т.д.
Код


from numpy import chararray

N_CHARS = 3
a = chararray( N_CHARS )
a[:] = ['a', 'b', 'c']
z = chararray( N_CHARS )


def Pnm( a, lenA, j, m ):
    _a = chararray( lenA )
    if j <= m:
#       for i in range(0,len(a) ):
        i = 0
        while i <= lenA-1:
            z[j-1] = a[i]
#2          _a = []
#           for l in range(0,len(a) ):
            k = 0
            kk = 0
            while k <= lenA-1:
                if k != i:
#2                  _a.append( a[k] )
                    _a[kk] = a[k]
                    kk = kk+1
                k = k+1
            Pnm( _a, kk, j+1, m )
            i = i+1
    else:
        kk = 0
        while kk < m:
            print z[kk],
            kk = kk+1
        print
        return


# for m in range (1, len(a)+1):
m = 1
while m <= len(a):
#   z = range( m )
#2  z = []
    i = 0
    while i < m:
#2      z.append( i )
        z[i] = i
        i = i+1
    Pnm( a, 3, 1, m )
    m = m+1



Код

my @a = qw/a b c/;
my @z;
sub pnm {
    my(@a, $lenA, $j, $m) = @_;
    if ($j <= $m) {
        $i = 0;
        while($i <= $lenA-1) {
            $z[$j-1] = $a[$i];
            $k = 0;
            $kk = 0;
        }
        while($k <= $lenA-1) {
            if ($k!=$i) {
                $_a[$kk] = $a[$k];
                $kk = $kk+1;
                $k = $k+1;
                pnm($_a, $kk, $j+1, $m);
                $i = $i+1;
            }
        }
    }
    else {
        $kk = 0;
        while($kk<$m) {
            print $z[$kk];
            $kk = $kk+1;
            print;
        return;
        }
    }
}
    $m = 1;
    while($m <= scalar @a) {
       $i = 0;
        while($i < $m) {
            $z[$i] = $i;
            $i = $i+1;
            pnm(@a, 3,1,$m);
            $m = $m+1;
        }
    }



Автор: Suppir 26.10.2011, 20:29
Блин, питон такой простой. Смотрю код и сразу все понятно! smile

Автор: dixoNICH 26.10.2011, 20:34
если понятно - не составит труда переписать smile буду благодарен smile

Автор: Suppir 27.10.2011, 08:43
Извини, друг, я на работе smile 

Автор: ginnie 27.10.2011, 11:46
dixoNICH, можно попробовать http://search.cpan.org/perldoc?Algorithm%3a%3aCombinatorics

Автор: MakTpaxep 27.10.2011, 12:54
Так вы нам напишите более конкретно что требуется. Питон тогда не потребуется переводить.

Автор: dixoNICH 27.10.2011, 13:19
Перебор всех возможных фраз в тексте.
т.е. 
$text = "привет мой друг";
и на выходе, например, массив
@text = qw /приветмой приветдруг приветмойдруг мойдруг другмой и т.д.

Добавлено через 30 секунд
Цитата(ginnie @ 27.10.2011,  11:46)
dixoNICH, можно попробовать http://search.cpan.org/perldoc?Algorithm%3a%3aCombinatorics

Мне бы без сторонних модулей smile

Автор: dixoNICH 27.10.2011, 13:40
Уже не надо smile

Автор: dixoNICH 8.11.2011, 20:22
Ап smile Теперь надо. Помогите, пожалуйста smile

Автор: Lols 8.11.2011, 22:12
Увы, питона не знаю, но посмотреть, как должно быть, интересно.

Автор: dixoNICH 13.11.2011, 20:54
Ап smile

Автор: trigandyaj 27.11.2011, 15:29
Моя логика заключается в том что используется только три аргумента(а,бэ,цэ) и отсюда следует что возможных
комбинаций всего двенадцать!
use 5.010; без этой строки у меня перл ругается и не выполняет скрипт
@w=split /\s+/, <STDIN>; слова должны быть разделены пробелами, вместо <STDIN> моно скаляр
@result=($w[0].$w[1],$w[0].$w[2],$w[0].$w[1].$w[2],$w[0].$w[2].$w[1],
 $w[1].$w[0],$w[1].$w[2],$w[1].$w[0].$w[2],$w[1].$w[2].$w[0],
 $w[2].$w[0],$w[2].$w[1],$w[2].$w[0].$w[1],$w[2].$w[1].$w[0]);
say "@result"; выводит результат

Автор: alezzz 27.11.2011, 16:05
жуть... а foreach(0..99) вы раскладываете в 100 строчек?

Цитата(trigandyaj @  27.11.2011,  15:29 Найти цитируемый пост)
use 5.010; без этой строки у меня перл ругается и не выполняет скрипт

замените say на print.

Автор: dixoNICH 27.11.2011, 19:20
Цитата(trigandyaj @ 27.11.2011,  15:29)
Моя логика заключается в том что используется только три аргумента(а,бэ,цэ) и отсюда следует что возможных
комбинаций всего двенадцать!
use 5.010; без этой строки у меня перл ругается и не выполняет скрипт
@w=split /\s+/, <STDIN>; слова должны быть разделены пробелами, вместо <STDIN> моно скаляр
@result=($w[0].$w[1],$w[0].$w[2],$w[0].$w[1].$w[2],$w[0].$w[2].$w[1],
 $w[1].$w[0],$w[1].$w[2],$w[1].$w[0].$w[2],$w[1].$w[2].$w[0],
 $w[2].$w[0],$w[2].$w[1],$w[2].$w[0].$w[1],$w[2].$w[1].$w[0]);
say "@result"; выводит результат

вы, конечно, извините, но до такого догадаться не проблема и для 1-го классника.
а я ищу решение не для трёх слов, а для n слов smile

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