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)
Ответ на: комментарий от ergo

Как раз таки в IO питоновские треды вполне себе ничего. Проблемы начинаются когда этими тредами пытаются ускорить что то такое, питоновское… вот тогда приходит GIL.

Но «кесарю кесарево» - если питоновский код работает медленно то его не параллелить надо а или оптимизировать или ЯП менять. У питона (как и у всех ЯП) своя ниша и не стоит его пихать во все дырки.

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

Но «кесарю кесарево» - если питоновский код работает медленно то его не параллелить надо а или оптимизировать или ЯП менять. У питона (как и у всех ЯП) своя ниша и не стоит его пихать во все дырки.

абсолютно согласен.

Как раз таки в IO питоновские треды вполне себе ничего. Проблемы начинаются когда этими тредами пытаются ускорить что то такое, питоновское… вот тогда приходит GIL.

по всей видимости я как раз перепутал, он наоборот при ИО не мешает. виноват. спасибо, что поправили. спишу это на отсутствие практики последние 8 лет работы с питоном.

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

Так вроде как наличие гил и означает что это гринлеты. Но в рубях они юзают системные треды. А так я не разбирался, все равно от них нету толка кроме как IO заворачивать что бы сделать не блокирующим.

TDrive ★★★★★
()
Ответ на: комментарий от AntonI

Но «кесарю кесарево» - если питоновский код работает медленно то его не параллелить надо а или оптимизировать или ЯП менять. У питона (как и у всех ЯП) своя ниша и не стоит его пихать во все дырки.

Во во, параллельные вычисления это не про подобные ЯП.

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

да, @AntonI уже поправил меня, спасибо ему за это. Там наоборот при IO гил не мешает. потому всякие веб сервера с твистами и торнадами оч хорошо справлялись с работой утилизируюя максимум цпу.

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

Составил на С++, все работает.

Регулярка с «заглядывание вперед» - foo(?=bar)
Входная строка foobar

C++

#include <iostream>
#include <fstream>
#include <time.h>
#include <pcre.h>
#include <string.h>
using namespace std;

#define kPRINT_MATCH 0

const char* line = "foobar";
const char* pattern = "foo(?=bar)";

const int groups = 1;
const int matchSize = groups * 2;

int main(int argc, char *argv[]) {
  const char* prce_error;
  int pcre_erroff;
  int match[matchSize] = {0};
  auto regex = pcre_compile(pattern, PCRE_UTF8, &prce_error, &pcre_erroff, 0);
  auto rc = pcre_exec(regex, 0, line, strlen(line), 0, 0, match, matchSize);
#if kPRINT_MATCH
  for (int i = 0; i < matchSize; i++) {
    printf("%d,", match[i]);
  }
#endif
  int start = match[0];
  int end = match[1];
  printf("%.*s\n", end, line + start);
};

Запускаем

clang++ lookaheadassertion.cpp -lpcre && ./a.out 
foo

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

Да нет у перла шанса перед C. Перл это программа на C. Т.е. если взять стандартную либу перла и воспользоваться функциями из неё в программе на C для реализации того же алгоритма, то у перла будут ещё накладные расходы на интерпретатор и автоматическое управление временем жизни объектов, которых ну будет в программе на C. Перед пыхом или питоном может и есть шанс

cobold ★★★★★
()
Ответ на: комментарий от TDrive

нет. Перл для Веба не работает с переводом каретки и требует строку в начале. Даже 2 строки.

PHP не требует ничего.

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

нет. Перл для Веба не работает с переводом каретки и требует строку в начале. Даже 2 строки.

не распарсил

TDrive ★★★★★
()
Ответ на: комментарий от demensdeum

А по умолчанию? Без PCRE_UTF8? Кстати, спасибо за эту Перл библиотеку для С++ - я не знал про её существование. Ну не знал я что Перл, наконец то полностью включили в С++.

Если есть заглядывание вперёд - значит С++ полноценный язык.

Осталось типизацию убрать и получится Перл.

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

Да. И права на Перл файл нужно выставлять дополнительно. Обычно - они не те.

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

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

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

Забавно, но у PHP потенциально более быстрый встроенный движок регулярок чем у Perl

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

С++ники не смогли преодолеть порог вхождения в Перл и теперь мучаются, бедные.

Я вам больше скажу.
Они

ЖАЛКИЕ НИКЧЕМНЫЕ ЛЮДИШКИ и ничего не понимают в Perl! ...
anonymous
()
Ответ на: комментарий от anonymous

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

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

Потому как регулярки - это практически главное в сегодняшнем программировании

Не буду вам перечить, чтобы не обидеть!
В 1812 году, когда Perl часто использовал попался мне сайтик на котором собирали разные регулярки.
Штук пятьсот каких хошь было …

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

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

Хорошо что я не программист.

Но расскажите скорее, как например при помощи регулярок можно рассчитать фотолитографическую маску для выпуска процессора по 7нм технологии?

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

А у вас какое образование, шо такое деве по дете

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

Ой вэй… Боюсь что бы Вы смогли мне объяснить, Вам придется для начала понять что такое уравнения Максвелла;-)

В общем так толсто что даже тонко, респект!

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

До вступления Наполеона в Москву или после? - Ээто важно :-)

Уже не помню?
Помню побежал я, а затем

Огородами, огородами и к Котовскому! ...
anonymous
()
Ответ на: комментарий от anonymous

деве по дете кококое образование у вас

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

Потому как регулярки - это практически главное в сегодняшнем программировании.

Ты это сам придумал?

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

Роторы? В авиационном институте мы их хавали на завтрак. Только на аэродинамике, вроде. Вихри всякие. Ламинарный, турбулентный.

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

В авиационном институте роторы из алюминия, в кораблестроительном из стали. А в энергетическом какие?

кстати, ротор + орт = роторт или нет?

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

Интеграл по замкнутому контуру вектора электромагнитной индукции… - кайф какой. Молодость. Общага авиационного института.

Градиент есть вектор направленный в сторону наискорейшего возрастания функции и по модулю равный скорости её возрастания.

А вы Де ве по де те то хоть знаете?

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

Таки шо бы у деве стало хотя бы одно дете, деве должна перестать быть деве - если она не деве Мария. У нас это знает каждый поц.

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

///В авиационном институте роторы из алюминия, в кораблестроительном из стали.///

Упс. Ротор - это вы не про то совсем. Грусненько это.

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

Видите ли, если у Вас «регулярки - это главное что есть в современном программировании», то боюсь что даже алюминиевый ротор для Вас чересчур инновационен, хватит и деревянного.

Вот что делает с людьми вебня… как страшно жить;-(

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

Вот что делает с людьми вебня… как страшно жить;-(

Эээээээээ.
Вот что делает с людьми Perl … как страшно жить;-(

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

Ну не знал я что Перл, наконец то полностью включили в С++.

Какие влажные мечты… Жгите дальше.

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

Ой, а Вы типа тут счетчик соскоков? Мьютексом то его хоть прикрыли?;-)

Я уже че то ржу в голос, астанавитесь! Хороший вышел тред.

Если всерьез, то по образования я физик, 20ть с лишним лет пишу числодробилки. В вебне не понимаю почти ничего.

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

у него образование регулярного института им. Шлакоблоконя. не то что у вас.

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

Если Вы хотите поговорить со мной за теорию поля, то скажите как в законах всемирного тяготения и кулона теорема Гаусса-Остроградского позволяет с высокой точностью определить что радиус стоит именно в квадрате.

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

Мы их хавали на завтрак - означает что на этих самых роторах были построены формулы для аэродинамики и пр. Физика, в авиационном институте, это начальная стадия, инструмент.

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

Роторы бывают очень разные, откуда же мне знать какой ротор имеет ввиду выпускник авиационного института у которого в программировании главное это регулярки и шлакоблокуни повсюду кружат… ?!

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

ты победил. а какое у тебя образование?

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

Ну дык я Вам задал вопрос по физике, Вы не ответили. Как там Ваш счетчик соскоков, дата рейсом не попортило?;-)

Что кстати роторы думают про правило площадей?

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

Разные… - начинаете понимать свой ляп и медленно съезжать? Хорошо. Что дальше выдумаете в своё оправдание? Что Ротор это не Физика, а Вышка?

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