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

PCRE появился позже Perl в 1997 году. Наверное чтобы с перлистами не быть в одной кодовой ветке.

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

Но он и есть самостоятельная либа на Си)

Которая, спешу заметить, кровушки у меня попила не мало в процессе отделения /usr от / - все так и норовят от неё наклепать зависимостей. На домашнем Тамагочи уже обложен diversions «по самое не балуйся»

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

у них критерий сравнения сформулирован как «старый, ни на что не годный» ) это просто флуд с претензией на что то полезное)

Perl - хороший язык программирования и вполне достойно применим для решения многих задач.
Эти треды все же скорее полностью отобьют у многих желание использовать Perl.

Хотя ТС как раз хотел иного ...
anonymous
()
Ответ на: комментарий от anonymous

ну я солидарен с тобою, моя карьера в IT началась с парсеров на перле

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

как бы вот

клиент и сервер на Перл
fcntl perl

два моих самых первых треда на лоре и перл даже стал причиной перехода на линукс)) так что лично у меня к нему теплые чувства.

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

В С++ нет заглядывания вперёд.

И кого это волнует?

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

Perl - хороший язык программирования

Как там говорится - «Искандеры улыбнулись» ;) Ниша перла это всякие репорты, ну может быть веб (с натяжкой) - не больше. Наклепать на нём что-то серьезное - мягко говоря проблематично.

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

У нас тут где то рекламировали чатик в телеге по перлу, причем имено перлу а не раку, там был опрос кто из мемберов реально работает на перле, людей хватало.

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

У нас тут где то рекламировали

Ну, продвигать можно много чего… Было бы желание, и аудитория.

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

Не думаю что им требуется твое сочувствие)

Дык, я ж чо - я вообще попИсать вышел)

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

Вроде на любом тьюринг полном ЯП можно решить любую задачу (гипотетически). Во что это выльется с точки зрения трудозатрат другой вопрос… ;-)

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

Всем банально пофиг что ты можешь сделать шлакоблокуня одной строчкой. Это никому кроме тебя не нужно.

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

Перл - не старый ни на что не годный язык, а просто бесперспективный язык.

Одно время Perl использовал вместо калькулятора.
УДОБНО!
Да big number одной строкой прикручивается …

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

Во что это выльется с точки зрения трудозатрат другой вопрос… ;-)

Дык. Давно пытаюсь изобрести «отбиралку кактусов», пока безуспешно…

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

В Python int безразмерный, а Decimal тоже прикручивается одной строчкой. Так что это не даёт какого-то перевеса в пользу Perl.

Так они же братья …

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

Но питон это светлая сторона Силы, а перл темная. Диалектика!

Эээээээээээээээээээ.
У Удава светлый плащ, у Верблюда - темный …

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

Трудно сказать - я ни на перле не писал ни кузнечиков не пробовал…

Но китайцы имеют склонность ко всяким извращениям, это факт.

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

Раньше как-то получалось, но знания и умения были утеряны в веках

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

У Удава светлый плащ, у Верблюда - темный …

У верблюда два горба
Потому что жизнь - борьба!

А у удава горбов нет, он гладенький. А у шлакоблокуня вообще морда кирпичем.

Если серьезно - питоновский код хорошо читается, даже если это однострочник с тремя вложенными генераторами. Питон не зря сейчас многие в качестве первого ЯП дают, хотя там и есть родовые травмы. Перл в качестве первого ЯП я как то с трудом представляю…

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

Именно это я и кричу тут на каждом шагу:

Регулярки используются на всех ЯП. И выучив их один раз - вы мгновенно сможете писать доволно таки сложные вещи на практически любом ЯП.

обычно такой код у меня не проходит кодревью. ибо:

1 регулярки имеют нулевую читабельность

2 поддерживать их - больше гемора, чем выгоды

3 ими можно пользоваться только как адовое исключение для профалинга очень узкого места в коде с приложением полного описания каждого «зашифрованного» действия с приложением ссылки на мануал по регекспам.

перл потому и ушел в закат, что читабельность в целом его кода весьма низкая. не потому что язык не позволяет писать читабельный код, а просто потому что излишняя гибкость синтаксиса мешает вырабатывать маломальски единый стиль кода.

что по сабжу - делать выводы о язке по умению его работать с PCRE - так себе метрика. у меня в целом какое-то ощущение от этого топика, что вы самому себе что-то доказываете с каким-то оголтелым фанатизмом.

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

у перла все хорошо было с вебом. более, чем хорошо. пхп дал проще синтаксис

ergo ★★★
()

забыл спросить… как там в перле с легковесными тредами в 2021 году? все еще вручную процессорные треды запускаете?

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

Для меня открытие было что дефолтные regex_replace в C++ медленнее чем Perl, но PCRE затащил всеравно. Мне кажется Hyperscan затащит еще сильнее) Но там решение будет скорее всего не такое честное, т.к. регулярки, предполагаю, компилятся ДО запуска программы.

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

так или иначе, PCRE не показывает характеристику языка. я уже молчу про то, что оно под капотом jit’ом обмазано, что в принципе к ЯПу не имеет никакого отношения.

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

На питоне с его GIL-ом треды тоже так себе…

на гил можно напороться на определенном спектре задач, так что оно не совсем так, как вам может казаться.

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

IO

эту тему уже лет 10 назад только ленивый не обсосал ). детали уже не вспомню. последние 8 лет erlang/golang в голове.

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

А доступ к одной переменной из разных тредов как организован? Свой мьютекс под капотом или нужно самому об этом заботиться?

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

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

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

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

Просто в рубях так же есть GIL и тамм он прям мешает тредам утилизировать процессор, 100% на каждом ядре не получится сделать, но не нужно беспокоиться за то что можно повредить память. Вот я и спрашиваю как в питоне.

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

у них плюс-минус одна фигня. кста, а в рубях а-ля пинотовские гринлеты что-то придумали? просто в свое время питоний твист (или торнадо? не помню уже) прям много шума наделал. тогда еще го не было (был, но только появился), так что утилизация цпу была острой задачей и твист ее очень хорошо решал. ну, хорошо для того времени.

ergo ★★★
()
Последнее исправление: ergo (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.