LINUX.ORG.RU

Говорили что Перл старый, ни на что не способный язык. Проверим?(часть 2)

 , ,


5

4

Задание на сейчас. найти максимальное вхождение одного слова в другое в СЛОВАРЕ - смотри ниже!!!

Перл - со словарём не справился;

Для C++ . - У меня перебирает весь словарь за 17 секунд;

Для JS - Около минуты. Говорили что Перл старый, ни на что не способный язык. Проверим?(часть 2) (комментарий);

Всё. Пока ничего другого, полностью рабочего нет.

Не нужно писать решение для единичных слов. Нужно - решение для словаря.

Возьмём список русских существительных, например отсюда: https://github.com/Harrix/Russian-Nouns/releases/download/v2.0/russian_nouns_v2.0.zip

Нужно найти максимальное вхождение одного слова в другое. Полные вхождения слов - не допускаются - это вроде было ясно и понятно всем. — Это задание. Это!!!


Самое простое и наглядное решение в составлении слов это:

/(\w+) \1/

Так-как даже я уже ничего не могу найти в первой части:

Говорили что Перл старый, ни на что не способный язык. Проверим?

Предлагаю собрать сюда наиболее значимые решения из 1 части.

Итак:

В начале, мы просто делали из

шлакоблок + окунь = шлакоблокунь

На разных языках. Там есть решения. Затем все стали зачем то уменьшать количество строк и символов - победил Перл - но это вообще не интересно.

Теперь, самое главное:

Говорили что Перл старый, ни на что не способный язык. Проверим?

Здесь все согласились что Перл хороший и годный язык, но С++ всё равно быстрее. В связи с этим, было предложено:

Говорили что Перл старый, ни на что не способный язык. Проверим?


Возьмём список русских существительных, например отсюда: https://github.com/Harrix/Russian-Nouns/releases/download/v2.0/russian_nouns_v2.0.zip На основе этого списка создадим новый, со всеми новыми сочетаниями, где перекрываются не менее 3 букв. Тут даже секундомером можно замерять. У меня на моем стареньком ноуте ушло несколько минут и сгенерировалось почти 40 Мбайт из одного. У Вас есть код на Перле и C++. Можете сравнить время. Так как здесь тоже работа со строками, то у Перла есть шанс.

Но потом договорились до изменения задания:

Тут ведь уже говорили - что основное время программы - это ввод и вывод. То есть в задании нужно сделать как можно меньше выводов.

Единственное что мне приходит в голову - найти максимальное вхождение одного слова в другое. —!!! Это и стало основным и новым заданием. !!!—


Эти все задачи были решены для Перл и С++

Для Перл. 3 варианта решения. Но ни одно не берёт весь словарь:

#!/usr/bin/perl

use utf8;
use open qw(:std :utf8); 

$t = time();

$| = 1;
open D, 'russian_nouns.txt';

for(0..3000) {
  $vv=<D>;
  $vv =~ s/\s+$//;
  @d = (@d, $vv);
  }

close D;
@d2 = @d;


for $v (@d){
    ++$ii; if (++$j>99){
    $t2 = time()-$t;
    print $ii." прошло $t2 секунд. $sov1 $str\n"; $j=0;}

  for $v2 (@d2) {&resh3 ()}
  
M1:  
  }
  
sub resh3 {
  
  $lv = length $v;
  $lv2 = length $v2;

  if($lv>$lv2) {
  
    for($i=$lv2; $i>1; $i--) {
      $c = substr ($v, -$i,);
      $c2 = substr ($v2, 0, $i);
      if (($c eq $c2) and ($c ne $v2) and ($c ne $v)){
          $sov = length $c;
          if ($sov>$sov1){$sov1=$sov; $str="$c = $v-$v2"}
          }
        
  
      }

  
  }
  else {
    
        for($i=$lv; $i>1; $i--) {
      $c = substr ($v2, -$i,);
      $c2 = substr ($v, 0, $i);
      if (($c eq $c2) and ($c ne $v2) and ($c ne $v)){
          $sov = length $c;
          if ($sov>$sov1){$sov1=$sov; $str="$c = $v-$v2"}
          }
        
  
      }
    
    
    
    }
  
  
}
  

sub resh1 {  
    $r=''; $l='';
    for(split(//,$v2)){
      $r .= $_;
      if ($v =~ /$r$/) {$l=$r}  
      }
    #print "$v-$l-$v2\n" if length $l>4 and $v ne $l;
    
    if ($l and ($l ne $v2) and ($l ne $v)){
    $sov = length $l;
    if ($sov>$sov1){$sov1=$sov; $str="$l - $v-$v2"}
}
}


sub resh2 {
  
    if($v ne $v2) {
    $_ = "$v $v2";
    /([^ ]*?)([^ ]*) \2/;
    
    if ($2 and ($2 ne $v2) and ($2 ne $v)){
    $sov = length $2;
    if ($sov>$sov1){$sov1=$sov; $str="$2 - $_"}

}
  }}
  

Для C++ . У меня перебирает весь словарь за 17 секунд.:

#include <iostream>
#include <fstream>
#include <ctime>
#include <string>
#include <vector>
using namespace std;

void check_combine(string &res, size_t &len, const string &s1, const string &s2)
{
    len = 0;
    for(auto &ch: s1)
    {
        if(len == s2.size())
        {
            break;
        }
        if(ch == s2.at(len))
        {
            len += 1;
        }
        else
        {
            len = 0;
        }
    }
    if(!len)
    {
        res = "";
    }
    else
    {
        string s3  {s2};
        s3.erase(0, len);
        res = s1;
        res += s3;
    }
}

void getlines(vector<string> &lines, fstream & f)
{
    string str;
    while(getline(f, str))
    {
        lines.push_back(str);
    }
}

int main()
{
    fstream inFile;
    inFile.open ("russian_nouns.txt", std::fstream::in);
    vector<string> lines;
    getlines(lines, inFile);
    size_t maxLen  {0};
    size_t rusMaxLen  {0};
    string maxRes  {""};
    time_t startTime = time(nullptr);
    size_t counter  {0};
    for(auto &s1: lines)
    {
        for(auto &s2: lines)
        {
            counter += 1;
            if(s1 == s2)
            {
                continue;
            }
            if(s1.size() < maxLen)
            {
                continue;
            }
            if(s2.size() < maxLen)
            {
                continue;
            }
            size_t len  {0};
            string res;
            check_combine(res, len, s1, s2);
            if(res == s1)
            {
                continue;
            }
            if(res == s2)
            {
                continue;
            }
            if(len > maxLen)
            {
                maxLen = len;
                rusMaxLen = maxLen / 2;
                time_t delta = time(nullptr) - startTime;
                string deltaStr  {s2};
                deltaStr.erase(len);
                maxRes = deltaStr + " - " + s1 + '-' + s2;
                cout << counter << "\t прошло: " << delta << " секунд, длина: ";
                cout << rusMaxLen << ", " << maxRes << '\n';
            }
        }
    }
    cout << "\n\nРезультат: " << rusMaxLen << ", " << maxRes << '\n';
    time_t delta = time(nullptr) - startTime;
    cout << "Полное время переборов: " << delta;
    inFile.close();
    return 0;
}


Ниже - не решения текущей задачи! Не решения. Ниже - просто выборка всех решений, на всех языках с прежней темы.

Блин. Как же сложно с людьми с недостаточным образованием. Я вот уже 6 раз написал - и всё равно будут писать про Шлокоблококунь.

php:

➜ php i.php "папа + папаха"
папаха%                                                                                                                                                                   ➜ php i.php "шлакоблок + окунь"
шлакоблокунь%                                                                                                                                                              
➜ cat i.php
<?php
for ($i = 1; $i <= mb_strlen(trim(explode('+', $argv[1])[0])) && $i <= mb_strlen(trim(explode('+',$argv[1])[1])); $i++)
    if (mb_substr(trim(explode('+', $argv[1])[0]), mb_strlen(trim(explode('+',$argv[1])[0])) - $i) === mb_substr(trim(explode('+',$argv[1])[1]), 0, $i)) 
        $j = $i;
echo (isset($j)) ?  trim(explode('+',$argv[1])[0]). mb_substr(trim(explode('+',$argv[1])[1]), $j) : 'error';

Говорили что Перл старый, ни на что не способный язык. Проверим? (комментарий)



Последнее исправление: sudopacman (всего исправлений: 25)
Ответ на: комментарий от kompospec

Для C++ . У меня перебирает весь словарь за 17 секунд.:

0 секунд - на С++

Чую какое-то утверждение лживое!

anonymous
()
Ответ на: комментарий от anonymous

Весь тред такой …

Тональность треда похожа на секту регулярных выражений …
Старо ведь!
Лучшее лекарство от всех болезней

Стакан касторки НАТОЩАК! ...
anonymous
()

Ув. ТС, вот мы уже о компиляторе услышали, а своего антивируса у вас случайно в планах нет? На основе регулярок, естественно.

anonymous
()
Ответ на: Ещё один сайт пациента от anonymous

Домен полностью соответствует как автору, так и всему его «творчеству»…

А куда подевались ТРЕДО И ПОСТО МЕТЫ?
Форум каким-то «тихим» стал …

anonymous
()
Ответ на: комментарий от kompospec

Другой аноним, но правда не понимаю. Давай начнём с того, какие буквы ты называешь «русскими»?

anonymous
()
Ответ на: комментарий от kompospec

@kompospec, они просто не понимают, что

ГУСЬ - чудная и дивная птица ...
anonymous
()
Ответ на: комментарий от kompospec

Так понятно?

Не особо:

$ cat 1.pl
#!/usr/bin/env perl

$string = "shlakoblokun = մոխրիբլոկթառ";
$string =~ s/[&*\w<>]//g;
print "$string\n";
$ perl 1.pl
 = մոխրիբլոկթառ
anonymous
()
Ответ на: комментарий от anonymous

Вы правда не понимаете? Тем более что я уже писал. Что вырезаются буквы которые способны навредить. В этом смысл. Код привёл того, что вырезается. Что вы от меня хотите? Чтоб я признал что там не только русские буквы? Так я уже признал. Написав код:

s/[&*\w<>]//g;

Вы не поняли код? - Я не виноват. Он - больше чем очевиден. У вас какое образование?

kompospec
() автор топика
Ответ на: комментарий от kompospec

Вы не поняли код?

Давай теперь расскажи, почему ты регулярное выражение называешь «кодом»?

anonymous
()
Ответ на: комментарий от anonymous

Давай теперь расскажи, почему ты регулярное выражение называешь «кодом»?

Легким движением руки регулярное выражение превращается в ...  
Превращается.   
Превращается ...   
...
anonymous
()
Ответ на: комментарий от kompospec

Я бесплатно - ничего не делаю.

Делай бесплатно.

anonymous
()
Ответ на: комментарий от anonymous

Много за шлакоблокуней выручил уже?

Не всякий ШЛАКОБЛОКООКУНЬ умеет правильно понять парадоксальную иллюзию общественного преобразования …

anonymous
()
Ответ на: комментарий от anonymous

Оно и видно. Второй тред уже.

anonymous
()

Perl6 наносит ответный удар!

Raku/Perl6 наносит ответный удар (ну по мере сил moarVM) :D корпоративным феррари. Интересный язык полный модных концепций. Советую ТС посмотреть.

#!/usr/bin/env rakudo

my @words of Str = 'russian_nouns.txt'.IO.slurp.lines.sort( {-.chars} );
say "Read: ", @words.elems, " words";

my Int $maxl = 0;
my (Str $maxa, Str $maxb);

for @words -> $a {
    next if $a.chars < 3;
    last if $a.chars < $maxl + 1;
    for @words -> $b {
        next if $b.chars < 3 || $b.chars < $maxl + 1;
        next if $a.ends-with($b);
        my $x = $b;
        while $x.chars > 1 {
            if $a.ends-with($x.chop(1)) && $a ne $x.chop(1) {
                if $x.chars > $maxl {
                    $maxa = $a;
                    $maxb = $b;
                    $maxl = $x.chars - 1;
                    last;
                }
            }
            $x = $x.chop(1);
        }
    }
}

say "Found $maxl, $maxa, $maxb";
say now - INIT now;
say "sec.";
$ rakudo-moar-2021.10-01-linux-x86_64-gcc/bin/rakudo test.p6 
Read: 51301 words
Found 13, недоброжелатель, доброжелательство
448.951731367
sec.

C параллелизом, но долго если без мютекса. Зато можно не сортировать и находит все.

#!/usr/bin/env rakudo
use v6;

my @words of Str = 'russian_nouns.txt'.IO.slurp.lines.sort( {-.chars} );
say "Read: ", @words.elems, " words";

sub xfunc(Str $a) {
    my (Str $maxa, Str $maxb) = <"" "">;
    my Int $maxl = 0;
    for @words -> $b {
        next if $b.chars < 3 || $b.chars < $maxl + 1;
        next if $a.ends-with($b);
        my $x = $b;
        while $x.chars > 1 {
            if $a.ends-with($x.chop(1)) && $a ne $x.chop(1) {
                if $x.chars > $maxl {
                    $maxa = $a;
                    $maxb = $b;
                    $maxl = $x.chars - 1;
                    last;
                }
            }
            $x = $x.chop(1);
        }
        last if $a.chars < $maxl + 1;
    }
    return Pair.new($maxl, "$maxa, $maxb");
}

my @res = @words.race.map(&xfunc);

say now - INIT now;
say "sec.";
say "Found:";
say @res.sort( { .key } ).tail

anonymous
()
Ответ на: Perl6 наносит ответный удар! от anonymous

О! Спасибо огромное.

Я смотрел этот Перл. Но это не Перл. Старые программы не запускаются. переменные нужно объявлять.

Но за исследование - спасибо огромное. Сейчас посмотрю - сколько по времени у меня.

kompospec
() автор топика
Ответ на: комментарий от kompospec

Вы правда не понимаете?

Я искренне не понимаю две вещи: что такое «нерусские буквы» и что такое «буквы, способные навредить».

anonymous
()
Ответ на: комментарий от anonymous

Беда. Английскими буквами можно написать вещи которые, теоретически, смогут запустить вредоносный код на сервере. Поэтому английские буквы, если они не используются - я экранирую. И всё.

Это изучают в школе.

kompospec
() автор топика
Ответ на: комментарий от kompospec

Я всё больше и больше склоняюсь к тому, что в качестве основного языка программирования сейчас нужно выбирать JS

А вот какой язык более всего монетизируем ? Для удалёнки.

kompospec
() автор топика
Ответ на: комментарий от kompospec

А вот какой язык более всего монетизируем ?

Нерусский. Исходя из твоей же логики.

anonymous
()
Ответ на: комментарий от kompospec

Так интересно - все слабоумные, за редким исключением, скрываются под Аномимами.

А сейчас можно Анонимов как то выключить в этой теме?

kompospec
() автор топика
Последнее исправление: kompospec (всего исправлений: 1)
Ответ на: комментарий от kompospec

Ты знаешь, вот конкретно в этом треде они скрываются под другим ником.

anonymous
()
Ответ на: комментарий от kompospec

На код Perl6 смотреть?

Ээ. Вам же Перл нравится? Я вам предложил посмотреть на Raku. Ну и пусть 400 сек, зато как красиво @words.race.map(..). Добавил .race. и все само разлетелось по ядрам.

Мне не оченя понятна концепция выжимать все до 1 секунды. Время CPU дешевле моего времени.

anonymous
()
Ответ на: комментарий от kompospec

У вас какое образование?

Верхнее. Филфак ЕГУ. Продолжишь про буквы? Вот ты привёл слона в пример. В пример того, что у тебя «нерусские» и «английские» буквы это разные подмножества? Каким образом это следует из слона?

anonymous
()
Ответ на: комментарий от kompospec

Старпёр-жирножоп, опять на связь выходишь?

anonymous
()
Ответ на: комментарий от anonymous

Вы гуммууунитарий чтоли? Гуммунитарное - это и не образование вовсе. Я не стану с вами разговаривать - Ибо - обучение у меня платное.

kompospec
() автор топика
Ответ на: На код Perl6 смотреть? от anonymous

Концепция вам не понятна потому, что я с периодичностью в 5 страниц пишу причину возникновения этой темы: Мне нужно было обработать Миллиард записей. И Перл не справился - считал около 3 суток.

Но это никто не читает.

kompospec
() автор топика
Ответ на: комментарий от anonymous

что такое «буквы, способные навредить»

Японский иероглиф Бон. Он же свастика. Может навредить.

anonymous
()
Ответ на: комментарий от kompospec

Беда. Английскими буквами можно написать вещи которые, теоретически, смогут запустить вредоносный код на сервере. Поэтому английские буквы, если они не используются - я экранирую. И всё.

Это любым языком можно.

anonymous
()
Ответ на: комментарий от anonymous

Нет. Я общался с Гуммууунитариями - Они слабоумные от слова вообще, но мнят о себе очень-очень много.

Один. Аспирант! Втирал мне в 2012 году, что никогда не будет изобретён голосовой переводчик

kompospec
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.